KA

Checar uma tabela antes de realizar a função

Por KarlKalvin, 25 de ago. de 2016 em Scripts

12
3.7k
KarlKalvinK
25 de agosto de 2016 às 01:42

Oi :)... eu to terminando de add uma parada no meu server mas "empacotei" em uma coisa...

To tentando por addon no meu server mas falta um ultimo passo... que é o fly/ride/surf.

Descobri que essa função tá sendo realizada aqui:

Citar

 


function  getPokemonOutfitToSkill(pokeName)
    if flys[pokeName] then  
    return flys[pokeName][1]
    elseif rides[pokeName] then    
    return rides[pokeName][1]
    else 
       return surfs[pokeName].lookType
     
    end
end
 

 

 

Essa tabela:

Citar

 


flys[pokeName]

rides[pokeName]

surfs[pokeName].lookType
 

 

 

Está no configuration.lua ( vou postar só um pedaço dela )

Citar

 


flys = {
["Moltres"] = {229, 3000}, -- moltres
["Articuno"] = {230, 3000}, -- artic
["Zapdos"] = {224, 3000}, -- zapdos

-- ride

rides = {
["Tauros"] = {128, 110}, -- tauros
["Ninetales"] = {129, 130}, -- kyuubi
["Rapidash"] = {130, 150}, -- rapid
 

 

 

e ela está trabalhando com:

 

Citar

 


local pokeName = getItemAttribute(getPlayerSlotItem(cid, 8).uid, "poke")

local outfit = getPokemonOutfitToSkill(pokeName)

doSetCreatureOutfit(cid, {lookType = outfit + 351}, -1)
 

 

 

Oque eu quero fazer: porém não tenho um grande conhecimento para editar, só consigo ler :(

 

Eu adicionei uma nova tabela no configuration.lua que é essa:

Citar

 


 addons = {

-- ID do Item / Nome do pokémon / Looktype do pokémon / Looktype do pokémon com fly / looktype com ride / looktype com surf
                [17232] = {pokemon= "Arcanine" , looktype = 2160, fly = 0, ride = 2161, surf = 0},
                [17233] = {pokemon= "Electabuzz" , looktype = 2204, fly = 0, ride = 0, surf = 0},
               }
 

 

 

Eu queria que essa função abaixo ela checa-se primeiro a tabela de "addons" antes da tabela flys/rides e se a ordem fly ou ride for numa "0" ela desse continuidade para a outra tabela que no caso é a do flys[pokeName] ou rides[pokeName]...

 

Citar

function  getPokemonOutfitToSkill(pokeName)
    if flys[pokeName] then  
    return flys[pokeName][1]
    elseif rides[pokeName] then    
    return rides[pokeName][1]
    else 
       return surfs[pokeName].lookType
     
    end
end

 

 

Estou tentando fazendo essa parada a dias mas eu não consigo programar, só ler :(

Editado Agosto 25 por KarlKalvin

25 de agosto de 2016 às 08:10

Se formos simplesmente alterar pra buscar primeiro nessa table aí, todo Pokémon com addons teria seu fly/ride como se fosse o addon. Manda o sistema de addon q tu ta usando aí

Night WolfN
25 de agosto de 2016 às 08:13

não entendi direito oque vc queria mas acho q é isso aqui

 

Spoiler
function  getPokemonOutfitToSkill(pokeName)	local index = 1	for i, v in pairs (addons) do		if v.pokemon == pokeName then			index = i		end	end	if addons[i] and addons[i].fly == 0 then			if flys[pokeName] then  			return flys[pokeName][1]		end	elseif addons[i] and addons[i].ride == 0 then		if rides[pokeName] then    			return rides[pokeName][1]		end		elseif addons[i] and addons[i].surf == 0 then		if surfs[pokeName].lookType then    			return rides[pokeName][1]		end	endend

 

 

KarlKalvinK
25 de agosto de 2016 às 09:14
1 hora atrás, Gabriel Netto disse:

Se formos simplesmente alterar pra buscar primeiro nessa table aí, todo Pokémon com addons teria seu fly/ride como se fosse o addon. Manda o sistema de addon q tu ta usando aí

 Ah intenção é essa!

Adaptei o addon do PDE

 

 

1 hora atrás, Night Wolf disse:

não entendi direito oque vc queria mas acho q é isso aqui

 

 

  Mostrar conteúdo oculto
function  getPokemonOutfitToSkill(pokeName)	local index = 1	for i, v in pairs (addons) do		if v.pokemon == pokeName then			index = i		end	end	if addons[i] and addons[i].fly == 0 then			if flys[pokeName] then  			return flys[pokeName][1]		end	elseif addons[i] and addons[i].ride == 0 then		if rides[pokeName] then    			return rides[pokeName][1]		end		elseif addons[i] and addons[i].surf == 0 then		if surfs[pokeName].lookType then    			return rides[pokeName][1]		end	endend

 

 

O mito night wolf novamente, sou fã desse cara.

 

O pokémon tá morrendo e ta dando esse erro na distro

 

 

 

[25/08/2016 08:15:58] [Error - Action Interface] 

[25/08/2016 08:15:58] data/actions/scripts/Basic/order.lua:onUse

[25/08/2016 08:15:58] Description: 

[25/08/2016 08:15:58] data/lib/106-main functions.lua:1571: attempt to perform arithmetic on local 'outfit' (a nil value)

[25/08/2016 08:15:58] stack traceback:

[25/08/2016 08:15:58]     data/lib/106-main functions.lua:1571: in function 'doUp'

[25/08/2016 08:15:58]     data/actions/scripts/Basic/order.lua:71: in function <data/actions/scripts/Basic/order.lua:1>

[25/08/2016 08:16:07] Arcanine ball has been created by Admin.

 

[25/08/2016 08:16:12] [Error - CreatureScript Interface] 

[25/08/2016 08:16:12] data/creaturescripts/scripts/player/pokeWalk.lua:onMove

[25/08/2016 08:16:12] Description: 

[25/08/2016 08:16:12] data/lib/106-main functions.lua:1571: attempt to perform arithmetic on local 'outfit' (a nil value)

[25/08/2016 08:16:12] stack traceback:

[25/08/2016 08:16:12]     data/lib/106-main functions.lua:1571: in function 'doUp'

[25/08/2016 08:16:12]     data/creaturescripts/scripts/player/pokeWalk.lua:80: in function <data/creaturescripts/scripts/player/pokeWalk.lua:1>

 

 

 

 

 

vou te mandar as 2 funções completa pra você entender melhor:

 

Citar

 

 

function doUp(cid, summon, move)

                     local pokeName = getItemAttribute(getPlayerSlotItem(cid, 8).uid, "poke")

                     local ditto = getItemAttribute(getPlayerSlotItem(cid, 8).uid, "copyName")

                          if ditto and ditto ~= "" then

                             pokeName = ditto

                          end

                     local outfit = getPokemonOutfitToSkill(pokeName)

                     local speed = getPokemonSpeedToSkill(pokeName)

                     addEvent(doRemoveCreature, 10, summon)

                     doSetCreatureOutfit(cid, {lookType = outfit + 351}, -1)

                     

                     doChangeSpeed(cid, -getCreatureSpeed(cid))

                     doChangeSpeed(cid, speed)

 

                     if #getCreatureSummons(cid) > 1 and getPlayerStorageValue(cid, 212124) <= 0 then     --alterado v1.6

                       if getPlayerStorageValue(cid, 637501) == -2 or getPlayerStorageValue(cid, 637501) >= 1 then  

                          BackTeam(cid)       

                       end

                     end

                    

                    if move == "ride" then 

                     setPlayerStorageValue(cid, orderTalks["ride"].storage, 1)

                    elseif move == "fly" then

                     setPlayerStorageValue(cid, orderTalks["fly"].storage, 1)

                    end

                    setPokemonGhost(cid)

                    

                    doPlayerSendCancel(cid, '12//,hide') --alterado v1.7

    

end

 

 

 

Citar

 

 

function  getPokemonOutfitToSkill(pokeName)

    if flys[pokeName] then

       return flys[pokeName][1]

    elseif rides[pokeName] then

       return rides[pokeName][1]

    else 

       return surfs[pokeName].lookType

    end

end

 

 

 

function  getPokemonSpeedToSkill(pokeName)

    if flys[pokeName] then

       return flys[pokeName][2]

    elseif rides[pokeName] then

       return rides[pokeName][2] * 4.5

    else 

       return surfs[pokeName].speed

    end

end

 

 

 

Agora essa é a tabela flys/rides e surfs no configuration.lua

 

Citar

 

 

flys = {

["Moltres"] = {229, 3000}, -- moltres

["Articuno"] = {230, 3000}, -- artic

 

rides = {

["Tauros"] = {128, 110}, -- tauros

["Ninetales"] = {129, 130}, -- kyuubi

 

surfs = {

["Poliwag"] = {lookType=278, speed = 10},

["Poliwhirl"] = {lookType=137, speed = 40},

 

 

 

E essa é a tabela que eu quero checar, vou postar o script do addon acho que vai te ajudar night porque o script ta trabalhando com attributos acho que se fizesse um check de attributos também daria não? tipo como o addons tá add attributos de fly/rides/surfs e por na função se o poke tiver tal attributo então setar a tabela addons se ele não tiver setar a tabela comun de fly/rides

 

Citar

 

 

addons = {

                [17232] = {pokemon= "Arcanine" , looktype = 2160, fly = 0, ride = 2161, surf = 0},

                [17233] = {pokemon= "Electabuzz" , looktype = 2204, fly = 0, ride = 0, surf = 0},

               }

 

 

 SCRIPT

 

Citar

 

 

function onUse(cid, item, fromPosition, itemEx, toPosition)

 

                if #getCreatureSummons(cid) > 0 then

                                doPlayerSendCancel(cid, "Please back your pokemon.")

                                return false

                end  

                

                local addon = addons[item.itemid].looktype

                local fly = addons[item.itemid].fly

                local ride = addons[item.itemid].ride

                local surf = addons[item.itemid].surf

 

                local pb = getPlayerSlotItem(cid, 8).uid

                local pk = addons[item.itemid].pokemon

 

                if getItemAttribute(pb,"poke") ~= pk then

                                doPlayerSendCancel(cid, "Sorry, you can't use this addon on this poke.")

                return false

                end

 

                if getItemAttribute(pb,"addon") < 1 then

                                doRemoveItem(item.uid, 1)

                                doPlayerSendTextMessage(cid, 27, "Congratulations! Now your pokemon will use the addon.")

                                doSetItemAttribute(pb,"addon",addon)

                                doSetItemAttribute(pb,"addonfly",fly)

                                doSetItemAttribute(pb,"addonride",ride)

                                doSetItemAttribute(pb,"addonsurf",surf)

                                return true

                end     

 

return true

end

 

 

Editado Agosto 25 por KarlKalvin

25 de agosto de 2016 às 20:24

@KarlKalvin

Coincidentemente, eu acabei o meu sistema de addon hoje e postei.

 

KarlKalvinK
25 de agosto de 2016 às 20:33
10 minutos atrás, Bodak Reborn disse:

@KarlKalvin

Coincidentemente, eu acabei o meu sistema de addon hoje e postei.

 

 

O seu não vai funcionar no meu porque a base é diferente você fez em um cyan os arquivos são diferentes do dxp que é a minha!

Editado Agosto 25 por KarlKalvin

25 de agosto de 2016 às 20:36
Agora, KarlKalvin disse:

 

Funciona na base dxp?

 

Eu fiz um script de preço no look e um cara com a base DxP disse que funcionou, então presumo que sim.

Sei que é broxante ver o tanto de linhas que tem que adicionar para "instalar" o sistema que eu fiz para TALVEZ funcionar, mas eu acho que funciona sim. :P:

KarlKalvinK
25 de agosto de 2016 às 22:00

Eu já li os códigos que você utilizou, é um bom conteúdo mas pra minha base funciona diferente o sistema de Price é uma linha checando uma tabela.. já oque eu preciso já é mais complexo é uma função checando uma tabela antes de checar outra.

 

Não me ajuda, mas é um bom conteúdo. Rep+ pela iniciativa!

Night WolfN
26 de agosto de 2016 às 03:28

eu não manjo de poketibia, dsculpa.. precisaria refazer toda essa base, o tempo todo ele pede informações q tabelas q possam ser nil, isso gera erros. 

exemplo:

local outfit = getCreatureOutfit(cid)
local look = outfit.looktype

vc percebe que se nao tiver cid, a função getCreatureOutfit(cid) vai retornar falso e outfit vai ser falso e aí eu vou tar tentando pegar falso.looktype (oque é um erro já que falso nao é uma tabela.)

É esse erro q tá acontecendo contigo, vc precisa ir na lib e procurar as funções q tão dando erro e verificar se existe a tabela antes de vc pedir as informações dela.

KarlKalvinK
26 de agosto de 2016 às 03:40
13 minutos atrás, Night Wolf disse:

eu não manjo de poketibia, dsculpa.. precisaria refazer toda essa base, o tempo todo ele pede informações q tabelas q possam ser nil, isso gera erros. 

 

exemplo:

 

local outfit = getCreatureOutfit(cid)

local look = outfit.looktype

 

vc percebe que se nao tiver cid, a função getCreatureOutfit(cid) vai retornar falso e outfit vai ser falso e aí eu vou tar tentando pegar falso.looktype (oque é um erro já que falso nao é uma tabela.)

 

É esse erro q tá acontecendo contigo, vc precisa ir na lib e procurar as funções q tão dando erro e verificar se existe a tabela antes de vc pedir as informações dela.

 

Night... você que não entendeu eu postei as 2 funções do local outfit = getPokemonOutfitToSkill e local speed = getPokemonSpeedToSkill , estão nos 2 primeiros quote toda a função do sistema.

 

E a tabela não é cid é pokeName

 

local pokeName = getItemAttribute(getPlayerSlotItem(cid, 8).uid, "poke")

 

Editado Agosto 26 por KarlKalvin

Night WolfN
26 de agosto de 2016 às 04:32
50 minutos atrás, KarlKalvin disse:

 

Night... você que não entendeu eu postei as 2 funções do local outfit = getPokemonOutfitToSkill e local speed = getPokemonSpeedToSkill , estão nos 2 primeiros quote toda a função do sistema.

 

E a tabela não é cid é pokeName

 

local pokeName = getItemAttribute(getPlayerSlotItem(cid, 8).uid, "poke")

 

vc que não entendeu amigo, o erro não é nesses scripts, é na lib (lê o erro do console, ele diz em ql arquivo e em ql linha), ele tá falando q foi um erro numa função da lib que ocorreu por causa que vc utilizou essa função de forma inválida no script X (e bota o nome do script). Você postar o script não ajuda em nada, o erro é na função. O restante foi só um exemplo pra tentar te ensinar oque causa o erro, eu sei que é pokename e não cid, foi só um exemplo :/

KarlKalvinK
26 de agosto de 2016 às 04:34
1 minuto atrás, Night Wolf disse:

vc que não entendeu amigo, o erro não é nesses scripts, é na lib (lê o erro do console, ele diz em ql arquivo e em ql linha), ele tá falando q foi um erro numa função da lib que ocorreu por causa que vc utilizou essa função de forma inválida no script X (e bota o nome do script). Você postar o script não ajuda em nada, o erro é na função. O restante foi só um exemplo pra tentar te ensinar oque causa o erro, eu sei que é pokename e não cid, foi só um exemplo :/

 

Lhe dando essa função, não ajudarei-me a solucionar esse imenso problema? :(