Ir para conteúdo
  • 0

[Resolvido] ajuda a terminar esse script (actions)


wevertonvrb

Pergunta

boa noite gente  o meu script deve adicionar um atributo na pokeball do pokemon que esta sumonado logo apos usar um item nele
para os que so entendem de tibia (o meu script deve adicionar um atributo na bota do player logo apos usar um item no seu próprio summon)
E MEU SCRIPT JA ESTA FAZENDO ISSO, ESSA PARTE JA FUNCIONA

porem eu quero que esse atributo seja adicionado na pokeball (bota) apenas se o pokemon (summon) não tenha uma spell especifica
que seria a spell "Psychic"
então eu consegui também fazer ele não adicionar o atributo nos pokemons que tenha essa spell
POREM OS POKEMON QUE NÃO TEM A SPELL E QUE DEVIA ADICIONAR O ATRIBUTO TA GERANDO ERRO
QUERO ARRUMAR ESSE ERRO E PESSO AJUDA NISSO, POR FAVOR

 

SCRIPT ATUAL
 

Spoiler

function onUse(cid, item, frompos, item2, topos)
local pb = getPlayerSlotItem(getCreatureMaster(item2.uid), 8)
local ball = getPlayerSlotItem(cid, CONST_SLOT_FEET).uid
local tocopy = item2.uid
local lockedcds = {"Psychic"}


if not isCreature(item2.uid) or item2.uid == cid or not isSummon(item2.uid) or (item2.uid) == ball then 
return doPlayerSendCancel(cid, "Voce deve usar o item em seu pokemon!")
end

if not pb then
return true end

if isMonster(item2.uid) then
 if not isInArray(lockedcds, movestable[getCreatureName(tocopy)].move1.name) and 
 not isInArray(lockedcds, movestable[getCreatureName(tocopy)].move2.name) and  
 not isInArray(lockedcds, movestable[getCreatureName(tocopy)].move3.name) and 
 not isInArray(lockedcds, movestable[getCreatureName(tocopy)].move4.name) and 
 not isInArray(lockedcds, movestable[getCreatureName(tocopy)].move5.name) and 
 not isInArray(lockedcds, movestable[getCreatureName(tocopy)].move6.name) and
 not isInArray(lockedcds, movestable[getCreatureName(tocopy)].move7.name) and 
not isInArray(lockedcds, movestable[getCreatureName(tocopy)].move8.name) and  
 not isInArray(lockedcds, movestable[getCreatureName(tocopy)].move9.name) and  
 not isInArray(lockedcds, movestable[getCreatureName(tocopy)].move10.name) and 
 not isInArray(lockedcds, movestable[getCreatureName(tocopy)].move11.name) and 
  not isInArray(lockedcds, movestable[getCreatureName(tocopy)].move12.name) then
 doSendFlareEffect(getThingPos(item2.uid))
     doItemSetAttribute(pb.uid, "megaspell1", 1)
    doRemoveItem(item.uid, 1)
     else
      doPlayerSendCancel(cid, "seu pokemon possui o movimento Psychic .")
      end
end
return true
end

 

---- pokemon q usei pra teste venonat que possui o psychic no m5 e possui ate o m8 total de 8 moves(spells) usei para demonstar --http://prntscr.com/g435tc
---- usando o item nele para demonstar --http://prntscr.com/g4388z -- podem ver que apareceu a mensagem (seu pokemon possui o movimento Psychic)
----o segundo pokemon q usei é o Blastoise que possui um total de 10 moves(spells)e nenhuma delas é o psychic --http://prntscr.com/g43913
----quando eu uso o item nele aparece a mensaguem (you cannot use this object) e gera erro na distro 

Spoiler

[03/08/2017 20:02:44] [Error - Action Interface] 
[03/08/2017 20:02:44] data/actions/scripts/megaspell1.lua:onUse
[03/08/2017 20:02:44] Description: 
[03/08/2017 20:02:44] ...ta/actions/scripts/megaspell1.lua:23: attempt to index field 'move11' (a nil value)
[03/08/2017 20:02:44] stack traceback:
[03/08/2017 20:02:44]     ...ta/actions/scripts/megaspell1.lua:23: in function <...ta/actions/scripts/megaspell1.lua:1>


e devia adicionar o atributo --   --http://prntscr.com/g439ng
lembrando tambem que o blastoise possui ate o m10 e o erro acontece no m11, um movimento que ele não tem,
acredito que o erro acontece ao verificar um movimento inexistente
caso eu teste em outro pokemon que possua 5 moves ou seja, ate o m5 e ele tambem não tenha o movimento Psychic o erro sera gerado no m6, ou seja em um poder inesistente, novamente

acredito que tem que adicionar algo que pare a verificação no m10 caso o pokemon tenha apenas ate o m10
 

 



ultima observação isso de verificar eu tirei do (smeargle system)

e vou postar a parte que lhe cabe abaixo para analise 
 

Spoiler

  local lockedpokes = {"Mew", "Mewtwo", "Unown Legion", "Entei", "Raikou", "Suicune", "Zapdos", "Moltres", "Articuno", "Rocket Team", "Unown", "Lugia", "Celebi", "Ho-oh", "Mew_", "Mewtwo_"}
if (isPlayer(cid) and #getCreatureSummons(cid) > 0 and getCreatureName(getCreatureSummons(cid)[1]) == "Smeargle" and getPlayerStorageValue(getCreatureSummons(cid)[1], 18554) > 0) or (isPlayer(cid) and #getCreatureSummons(cid) > 0 and getCreatureName(getCreatureSummons(cid)[1]) == "Shiny Smeargle" and getPlayerStorageValue(getCreatureSummons(cid)[1], 18554) > 0) then
  if isMonster(item2.uid) and isInArray(lockedpokes, getCreatureName(item2.uid)) then
    doPlayerSendTextMessage(cid, 20, "You can't copy this move.")
    return true
    end
  local lockedcds = {"Divine Punishment", "Unown Rush", "Sing", "Unown Help", "Sleep Powder", "Volcano Burst", "Selfdestruct", "Protection", "Mysterious Power", "Power Wave", "Shredder Team", "Double Team", "Team Slice", "Ancient Fury", "Camouflage", "Future Sight", "Acid Armor", "Rollout", "Flame Wheel", "Elemental Hands", "Super Vines", "ExplodeAll", "Stampage", "Iron Defense", "Minimize", "Team Claw", ""}
  for x=1, 8 do
    table.insert(lockedcds, "Sketch "..x)
    end
  local canShiny = true
  local smeargle = getCreatureSummons(cid)[1]
  local shinysmeargle = getCreatureSummons(cid)[1]
  local tocopy = item2.uid
  local selfball = getPlayerSlotItem(cid, 8).uid
  if (isShinyName(getCreatureName(item2.uid)) and canShiny) or not isShinyName(getCreatureName(item2.uid)) then
    if (getPlayerStorageValue(smeargle, 18554)) or (getPlayerStorageValue(shinysmeargle, 18554))then
      
 if (getPlayerStorageValue(smeargle, 18554) == 1 and movestable[getCreatureName(tocopy)].move1 and not isInArray(lockedcds, movestable[getCreatureName(tocopy)].move1.name)) or (getPlayerStorageValue(shynysmeargle, 18554) == 1 and movestable[getCreatureName(tocopy)].move1 and not isInArray(lockedcds, movestable[getCreatureName(tocopy)].move1.name)) then
if (not smeargleHaveSpell(cid, movestable[getCreatureName(tocopy)].move1.name)) or (not shinysmeargleHaveSpell(cid, movestable[getCreatureName(tocopy)].move1.name)) then
 doItemSetAttribute(selfball, "skt1", getCreatureName(tocopy))        
 else
 doPlayerSendTextMessage(cid, 20, "You smeargle already have this move.")
 end
elseif getPlayerStorageValue(smeargle, 18554) == 2 and movestable[getCreatureName(tocopy)].move2 and not isInArray(lockedcds, movestable[getCreatureName(tocopy)].move2.name) then
if not smeargleHaveSpell(cid, movestable[getCreatureName(tocopy)].move2.name) then
 doItemSetAttribute(selfball, "skt2", getCreatureName(tocopy))        
 else
 doPlayerSendTextMessage(cid, 20, "You smeargle already have this move.")
 end  
elseif getPlayerStorageValue(smeargle, 18554) == 3 and movestable[getCreatureName(tocopy)].move3 and not isInArray(lockedcds, movestable[getCreatureName(tocopy)].move3.name) then
if not smeargleHaveSpell(cid, movestable[getCreatureName(tocopy)].move3.name) then
 doItemSetAttribute(selfball, "skt3", getCreatureName(tocopy))        
 else
 doPlayerSendTextMessage(cid, 20, "You smeargle already have this move.")
 end  
elseif getPlayerStorageValue(smeargle, 18554) == 4 and movestable[getCreatureName(tocopy)].move4 and not isInArray(lockedcds, movestable[getCreatureName(tocopy)].move4.name) then
if not smeargleHaveSpell(cid, movestable[getCreatureName(tocopy)].move4.name) then
 doItemSetAttribute(selfball, "skt4", getCreatureName(tocopy))        
 else
 doPlayerSendTextMessage(cid, 20, "You smeargle already have this move.")
 end  
elseif getPlayerStorageValue(smeargle, 18554) == 5 and movestable[getCreatureName(tocopy)].move5 and not isInArray(lockedcds, movestable[getCreatureName(tocopy)].move5.name) then
if not smeargleHaveSpell(cid, movestable[getCreatureName(tocopy)].move5.name) then
 doItemSetAttribute(selfball, "skt5", getCreatureName(tocopy))        
 else
 doPlayerSendTextMessage(cid, 20, "You smeargle already have this move.")
 end  
elseif getPlayerStorageValue(smeargle, 18554) == 6 and movestable[getCreatureName(tocopy)].move6 and not isInArray(lockedcds, movestable[getCreatureName(tocopy)].move6.name) then
if not smeargleHaveSpell(cid, movestable[getCreatureName(tocopy)].move6.name) then
 doItemSetAttribute(selfball, "skt6", getCreatureName(tocopy))        
 else
 doPlayerSendTextMessage(cid, 20, "You smeargle already have this move.")
 end 
elseif getPlayerStorageValue(smeargle, 18554) == 7 and movestable[getCreatureName(tocopy)].move7 and not isInArray(lockedcds, movestable[getCreatureName(tocopy)].move7.name) then
if not smeargleHaveSpell(cid, movestable[getCreatureName(tocopy)].move7.name) then
 doItemSetAttribute(selfball, "skt7", getCreatureName(tocopy))        
 else
 doPlayerSendTextMessage(cid, 20, "You smeargle already have this move.")
 end 
elseif getPlayerStorageValue(smeargle, 18554) == 8 and movestable[getCreatureName(tocopy)].move8 and not isInArray(lockedcds, movestable[getCreatureName(tocopy)].move8.name) then
if not smeargleHaveSpell(cid, movestable[getCreatureName(tocopy)].move8.name) then
 doItemSetAttribute(selfball, "skt8", getCreatureName(tocopy))        
 else
 doPlayerSendTextMessage(cid, 20, "You smeargle already have this move.")
 end
        end


     setPlayerStorageValue(smeargle, 18554, -1) 
     setPlayerStorageValue(shinysmeargle, 18554, -1) 
    end
    doUpdateMoves(cid)
    return true
  else
    doPlayerSendTextMessage(cid, 20, "You can't copy moves of shinyes pokemons.")
  end
  end 

 

 

funções sitadas

Spoiler

function getSmeargleMoveTable(master)
  local ball = getPlayerSlotItem(master, 8).uid
  local moves = {}
  local skts = {"skt1", "skt2", "skt3", "skt4", "skt5", "skt6", "skt7", "skt8"}
  for x=1, #skts do
    moves["move"..x] = getItemAttribute(ball, skts[x]) and movestable[getItemAttribute(ball, skts[x])]["move"..x] and movestable[getItemAttribute(ball, skts[x])]["move"..x] ~= -1 and movestable[getItemAttribute(ball, skts[x])]["move"..x] or movestable["Smeargle"]["move"..x] or movestable["Shiny Smeargle"]["move"..x]
  end
  return moves
  end

function smeargleHaveSpell(cid, spellname)
local has = false
local moves = getSmeargleMoveTable(cid)
 local ball = getPlayerSlotItem(cid, 8).uid
local skts = {"skt1", "skt2", "skt3", "skt4", "skt5", "skt6", "skt7", "skt8"}
for x=1, #skts do
if getItemAttribute(ball, skts[x]) and moves["move"..x].name == spellname then
has = true
break
end
end
return has
end 


ESPERO QUE POSSAM ME AJUDAR

 

 

 

 

 

 

 

 

 

 

 


@Poccnn

@Nogard

@Leoxtibia

Editado por wevertonvrb
Link para o comentário
Compartilhar em outros sites

9 respostass a esta questão

Posts Recomendados

  • 0

for index = 1,14 do

if movestable[getCreatureName(tocopy)]["move"..index] and not (isInArray(lockedcds, movestable[getCreatureName(tocopy)].move1.name)) then

doSendFlareEffect(getThingPos(item2.uid))
     doItemSetAttribute(pb.uid, "megaspell1", 1)
    doRemoveItem(item.uid, 1)

 else
      doPlayerSendCancel(cid, "seu pokemon possui o movimento Psychic .")
      end
end

Link para o comentário
Compartilhar em outros sites

  • 0
10 horas atrás, Poccnn disse:

for index = 1,14 do

if movestable[getCreatureName(tocopy)]["move"..index] and not (isInArray(lockedcds, movestable[getCreatureName(tocopy)].move1.name)) then

doSendFlareEffect(getThingPos(item2.uid))
     doItemSetAttribute(pb.uid, "megaspell1", 1)
    doRemoveItem(item.uid, 1)

 else
      doPlayerSendCancel(cid, "seu pokemon possui o movimento Psychic .")
      end
end

do jeito que voce colocou verifica apenas o m1 pois

move1=m1

e caso eu coloque para verificar as outras linhas do jeito que estava antes esta dando o mesmo erro, so mudou o numero da linha mas é o mesmo erro se o pokemon tem ate o move5 gera o erro no move6

tem q arruamr uma maneira de parar a verificação no move5 caso o pokemon tenha apenas ate o move 5

o erro acontece porque.

digamos q o pokemon tenha do move1 ao move5 e tenha a spell no move4

então ele para a verificação no move4 e retorna que o pokemon possui a spell

mas caso o pokemon não possui a spell ele vai pular pro move6 para verificalo tambem, porem o pokemon tem apenas ate o move5 o erro acontece ao tentar verificar um move que o pokemon não possui

Link para o comentário
Compartilhar em outros sites

  • 0

Tente assim, jovem:

 

Spoiler
local lockedcds = "Pyschic"function onUse(cid, item, frompos, item2, topos)    local pb = getPlayerSlotItem(getCreatureMaster(item2.uid), 8)    local ball = getPlayerSlotItem(cid, CONST_SLOT_FEET).uid    local tocopy = item2.uid    if isMonster(item2.uid) then        if hasMove(lockedcds) then            doPlayerSendCancel(cid, "Seu pokemon possui o movimento " .. lockedcds .. ".")        else            doSendFlareEffect(getThingPos(item2.uid))            doItemSetAttribute(pb.uid, "megaspell1", 1)            doRemoveItem(item.uid, 1)        end    endendfunction hasMove(lockedCds)    local total_moves = 0    for k, v in pairs(movestables[getCreatureName(tocopy)]) do        total_moves = total_moves + 1     end    for i = 1, total_moves do        if movestables[getCreatureName(tocopy)]["move" ..i].name == lockedCds then            return true        end    endreturn falseend

 

 

Link para o comentário
Compartilhar em outros sites

  • 0
3 horas atrás, Leoxtibia disse:

Tente assim, jovem:

 

  Ocultar conteúdo
local lockedcds = "Pyschic"function onUse(cid, item, frompos, item2, topos)    local pb = getPlayerSlotItem(getCreatureMaster(item2.uid), 8)    local ball = getPlayerSlotItem(cid, CONST_SLOT_FEET).uid    local tocopy = item2.uid    if isMonster(item2.uid) then        if hasMove(lockedcds) then            doPlayerSendCancel(cid, "Seu pokemon possui o movimento " .. lockedcds .. ".")        else            doSendFlareEffect(getThingPos(item2.uid))            doItemSetAttribute(pb.uid, "megaspell1", 1)            doRemoveItem(item.uid, 1)        end    endendfunction hasMove(lockedCds)    local total_moves = 0    for k, v in pairs(movestables[getCreatureName(tocopy)]) do        total_moves = total_moves + 1     end    for i = 1, total_moves do        if movestables[getCreatureName(tocopy)]["move" ..i].name == lockedCds then            return true        end    endreturn falseend

 

 

deu esse erro

Spoiler

 

 

[05/08/2017 01:24:45] [Error - Action Interface] 

[05/08/2017 01:24:45] data/actions/scripts/megaspell1.lua:onUse

[05/08/2017 01:24:45] Description: 

[05/08/2017 01:24:45] (luaGetCreatureName) Creature not found

[05/08/2017 01:24:45] [Error - Action Interface] 

[05/08/2017 01:24:45] data/actions/scripts/megaspell1.lua:onUse

[05/08/2017 01:24:45] Description: 

[05/08/2017 01:24:45] data/lib/some functions.lua:2090: attempt to index global 'movestables' (a nil value)

[05/08/2017 01:24:45] stack traceback:

[05/08/2017 01:24:45]     data/lib/some functions.lua:2090: in function 'hasMove'

[05/08/2017 01:24:45]     ...ta/actions/scripts/megaspell1.lua:7: in function <...ta/actions/scripts/megaspell1.lua:2>

 

 

 

uma observação,

eu coloquei a função no some functions na pasta lib

mas caso eu deixe ela junto do script gera o mesmo erro

Link para o comentário
Compartilhar em outros sites

  • 0
Citar

local hasmove = false

for index = 1,14 do

if movestable[getCreatureName(tocopy)]["move"..index] and not (isInArray(lockedcds, movestable[getCreatureName(tocopy)].move1.name)) then

hasmove = true

break

end

end

if hasmove then

     doSendFlareEffect(getThingPos(item2.uid))

     doItemSetAttribute(pb.uid, "megaspell1", 1)

    doRemoveItem(item.uid, 1)

 else

      doPlayerSendCancel(cid, "seu pokemon possui o movimento Psychic .")

 end

 

Link para o comentário
Compartilhar em outros sites

  • 0

Mas que porcaria, tinha colocado um "s" a mais em movestable.

 

Spoiler
local lockedcds = "Pyschic"function onUse(cid, item, frompos, item2, topos)    local pb = getPlayerSlotItem(getCreatureMaster(item2.uid), 8)    local ball = getPlayerSlotItem(cid, CONST_SLOT_FEET).uid    local tocopy = item2.uid    if isMonster(item2.uid) then        if hasMove(lockedcds) then            doPlayerSendCancel(cid, "Seu pokemon possui o movimento " .. lockedcds .. ".")        else            doSendFlareEffect(getThingPos(item2.uid))            doItemSetAttribute(pb.uid, "megaspell1", 1)            doRemoveItem(item.uid, 1)        end    endendfunction hasMove(lockedCds)    local total_moves = 0    for k, v in pairs(movestable[getCreatureName(tocopy)]) do        total_moves = total_moves + 1     end    for i = 1, total_moves do        if movestable[getCreatureName(tocopy)]["move" ..i].name == lockedCds then            return true        end    endreturn falseend

 

 

Link para o comentário
Compartilhar em outros sites

  • 0
4 horas atrás, Leoxtibia disse:

Mas que porcaria, tinha colocado um "s" a mais em movestable.

 

  Ocultar conteúdo
local lockedcds = "Pyschic"function onUse(cid, item, frompos, item2, topos)    local pb = getPlayerSlotItem(getCreatureMaster(item2.uid), 8)    local ball = getPlayerSlotItem(cid, CONST_SLOT_FEET).uid    local tocopy = item2.uid    if isMonster(item2.uid) then        if hasMove(lockedcds) then            doPlayerSendCancel(cid, "Seu pokemon possui o movimento " .. lockedcds .. ".")        else            doSendFlareEffect(getThingPos(item2.uid))            doItemSetAttribute(pb.uid, "megaspell1", 1)            doRemoveItem(item.uid, 1)        end    endendfunction hasMove(lockedCds)    local total_moves = 0    for k, v in pairs(movestable[getCreatureName(tocopy)]) do        total_moves = total_moves + 1     end    for i = 1, total_moves do        if movestable[getCreatureName(tocopy)]["move" ..i].name == lockedCds then            return true        end    endreturn falseend

 

 

 

 

GEROU ESSE ERRO

Spoiler

 

[06/08/2017 01:25:39] [Error - Action Interface] 

[06/08/2017 01:25:39] data/actions/scripts/Tecnical Move/Tm 29 - Psychic.lua:onUse

[06/08/2017 01:25:39] Description: 

[06/08/2017 01:25:39] (luaGetCreatureName) Creature not found

[06/08/2017 01:25:39] [Error - Action Interface] 

[06/08/2017 01:25:39] data/actions/scripts/Tecnical Move/Tm 29 - Psychic.lua:onUse

[06/08/2017 01:25:39] Description: 

[06/08/2017 01:25:39] ...ta/actions/scripts/Tecnical Move/Tm 29 - Psychic.lua:23: bad argument #1 to 'pairs' (table expected, got nil)

[06/08/2017 01:25:39] stack traceback:

[06/08/2017 01:25:39]     [C]: in function 'pairs'

[06/08/2017 01:25:39]     ...ta/actions/scripts/Tecnical Move/Tm 29 - Psychic.lua:23: in function 'hasMove'

[06/08/2017 01:25:39]     ...ta/actions/scripts/Tecnical Move/Tm 29 - Psychic.lua:7: in function <...ta/actions/scripts/Tecnical Move/Tm 29 - Psychic.lua:2>

 

 

 

 

 

17 horas atrás, Poccnn disse:

 

CONTINUOU COM O MESMO ERRO QUE FALEI, GERA ERRO NO MOVE INESISTENTE

SE VAI ATE O M5 GERA O ERRO NO M6

A VERIFICAÇÃO NÃO ESTA PARANDO NO ULTIMO MOVE

Link para o comentário
Compartilhar em outros sites

  • 0

Para que possa ajudar outros.

 

Spoiler
local lockedcds = "Psychic" function onUse(cid, item, frompos, item2, topos)    local ball = getPlayerSlotItem(cid, CONST_SLOT_FEET).uid    if not isCreature(item2.uid) or item2.uid == cid or not isSummon(item2.uid) or (item2.uid) == ball then        return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Voce deve usar o item em seu pokemon!")    end    local pb = getPlayerSlotItem(getCreatureMaster(item2.uid), 8)    if not pb then return true end        if getItemAttribute(pb.uid, "movimientotecnico") == 1  then        doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "seu pokemon so pode carregar um TM.")    return true    end        if isInArray({15235, 15236, 15237, 15238}, getItemAttribute(pb.uid, "megaStone")) then        doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Retire a Mega Stone para usar a TM.")    return true    end       if isMonster(item2.uid) and getCreatureMaster(item2.uid) == cid then        if not hasMove(lockedcds, item2) then            doSendFlareEffect(getThingPos(item2.uid))            doCreatureSay(getCreatureSummons(cid)[1], "Aprendendo movimento", TALKTYPE_ORANGE_1)            doItemSetAttribute(pb.uid, "tm29", 1)            doItemSetAttribute(pb.uid, "movimientotecnico", 1)            doRemoveItem(item.uid, 1)            doUpdateMoves(cid)            if useKpdoDlls then                doUpdateMoves(cid)            end        else            return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "seu pokemon possui o movimento "..lockedcds)        end    else        return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Voce deve usar o item em seu pokemon")    endend function hasMove(lockedCds, itemEx)    local total_moves, diff = 0, 0    for _, v in pairs(movestable[getCreatureName(itemEx.uid)]) do        total_moves = total_moves + 1    end    for i = 1, total_moves do        if movestable[getCreatureName(itemEx.uid)]["passive"..i] == nil then            diff = diff + 1        end    end    for i = 1, diff do        if movestable[getCreatureName(itemEx.uid)]["move" ..i].name == lockedCds then            return true        end    endreturn falseend

 

 

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.
×
×
  • Criar Novo...