Ir para conteúdo
  • 0

(resolvido) Transformar esse Talkaction em Spell


gabriel28

Pergunta

Como o título já diz, gostaria que alguém transformasse esse talkaction em uma spell.

Segue o script:

 

local storage = 79845 --storage para o exhaustionlocal tempo = 5 --em segundoslocal monsters = {[1] = {summons = {["rat"] = {level = 10, mana = 20}, ["dragon"] = {level = 100, mana = 200} }, maxSummons = 2  },[2] = {summons = {["rat"] = {level = 10, mana = 20}, ["dragon"] = {level = 100, mana = 200} }, maxSummons = 4  },[5] = {summons = {["rat"] = {level = 10, mana = 20}, ["dragon"] = {level = 100, mana = 200} }, maxSummons = 4  },[6] = {summons = {["rat"] = {level = 10, mana = 20}, ["dragon"] = {level = 100, mana = 200} }, maxSummons = 6  },[9] = {summons = {["rat"] = {level = 10, mana = 20}, ["dragon"] = {level = 100, mana = 200} }, maxSummons = 6  },[10] = {summons = {["rat"] = {level = 10, mana = 20}, ["dragon"] = {level = 100, mana = 200} }, maxSummons = 8  },}function onSay(cid, words, param, channel)if exhaustion.check(cid, storage) thendoPlayerSendTextMessage(cid, 22, "You are exhausted.")return trueend    --Player Status    local playerpos = getPlayerPosition(cid)    param = string.lower(param)    local loop = 0      function checkSummon()        for k, v in pairs(monsters[getPlayerVocation(cid)].summons) do            if param == k then                return true            end        end        return false    end      if not checkSummon() then        doPlayerSendCancel(cid, "You can't summon this monster.")        return true    end      for k, v in pairs(monsters[getPlayerVocation(cid)].summons) do        if (param == k) then            if (monsters[getPlayerVocation(cid)]) and #getCreatureSummons(cid) >= monsters[getPlayerVocation(cid)].maxSummons then                return doPlayerSendCancel(cid, "Você já tem sumons demais.")            else            --Summon                if getPlayerLevel(cid) < v.level then                    return doPlayerSendCancel(cid, "Você não possui level suficiente.")                elseif getCreatureMana(cid) < v.mana then                    return doPlayerSendCancel(cid, "Você não possui mana suficiente.")                end                    doConvinceCreature(cid, doCreateMonster(param, playerpos))                    doPlayerAddMana(cid, -v.mana, false)                    exhaustion.set(cid, storage, tempo)                    doSendMagicEffect(playerpos, 2)                return true            end        end    end    return trueend

 

Link para o comentário
Compartilhar em outros sites

12 respostass a esta questão

Posts Recomendados

  • 0
1 hora atrás, Poccnn disse:

E qual o problema de manter isso em talkaction?

 

No server que estou montando, todas as spells serão compradas. E essa ai será comprada em um NPC que terá que fazer uma quest pra falar com ele e poder compra-la junto com outras.

Link para o comentário
Compartilhar em outros sites

  • 0

script:

Spoiler

function onCastSpell(cid, var)
local storage = 79845 --storage para o exhaustion
local tempo = 5 --em segundos

local monsters = {
[1] = {summons = {["rat"] = {level = 10, mana = 20}, ["dragon"] = {level = 100, mana = 200} }, maxSummons = 2  },
[2] = {summons = {["rat"] = {level = 10, mana = 20}, ["dragon"] = {level = 100, mana = 200} }, maxSummons = 4  },
[5] = {summons = {["rat"] = {level = 10, mana = 20}, ["dragon"] = {level = 100, mana = 200} }, maxSummons = 4  },
[6] = {summons = {["rat"] = {level = 10, mana = 20}, ["dragon"] = {level = 100, mana = 200} }, maxSummons = 6  },
[9] = {summons = {["rat"] = {level = 10, mana = 20}, ["dragon"] = {level = 100, mana = 200} }, maxSummons = 6  },
[10] = {summons = {["rat"] = {level = 10, mana = 20}, ["dragon"] = {level = 100, mana = 200} }, maxSummons = 8  },
}
if exhaustion.check(cid, storage) then
doPlayerSendTextMessage(cid, 22, "You are exhausted.")
return true
end

    --Player Status
    local playerpos = getPlayerPosition(cid)
    param = string.lower(param)
    local loop = 0
  
    function checkSummon()
        for k, v in pairs(monsters[getPlayerVocation(cid)].summons) do
            if param == k then
                return true
            end
        end
        return false
    end
  
    if not checkSummon() then
        doPlayerSendCancel(cid, "You can't summon this monster.")
        return true
    end
  
    for k, v in pairs(monsters[getPlayerVocation(cid)].summons) do
        if (param == k) then
            if (monsters[getPlayerVocation(cid)]) and #getCreatureSummons(cid) >= monsters[getPlayerVocation(cid)].maxSummons then
                return doPlayerSendCancel(cid, "Você já tem sumons demais.")
            else
            --Summon
                if getPlayerLevel(cid) < v.level then
                    return doPlayerSendCancel(cid, "Você não possui level suficiente.")
                elseif getCreatureMana(cid) < v.mana then
                    return doPlayerSendCancel(cid, "Você não possui mana suficiente.")
                end
                    doConvinceCreature(cid, doCreateMonster(param, playerpos))
                    doPlayerAddMana(cid, -v.mana, false)
                    exhaustion.set(cid, storage, tempo)
                    doSendMagicEffect(playerpos, 2)
                return true
            end
        end
    end
    return true
end
 

 

Tag no spells.xml 

Spoiler

    <instant name="NOME DA SPELL" words="nome da spell" direction="1" lvl="30" maglv="50"  mana="3000" soul="0" exhaustion="1" prem="0" enabled="1" script="LOCAL DO SCRIPT">
    </instant>

 

Se der erro ou qualquer coisa posta ai.

 

Editado por Hi im Mell
Link para o comentário
Compartilhar em outros sites

  • 0
10 horas atrás, gabriel28 disse:

 

No server que estou montando, todas as spells serão compradas. E essa ai será comprada em um NPC que terá que fazer uma quest pra falar com ele e poder compra-la junto com outras.

mas dava so para colocar um valor de storage necessario para a talkaction, nem precisava transformar em spell, ao comprar era só mudar a storage.

Link para o comentário
Compartilhar em outros sites

  • 0
19 horas atrás, Hi im Mell disse:

script:

  Mostrar conteúdo oculto

function onCastSpell(cid, var)

local storage = 79845 --storage para o exhaustion

local tempo = 5 --em segundos

local monsters = {

[1] = {summons = {["rat"] = {level = 10, mana = 20}, ["dragon"] = {level = 100, mana = 200} }, maxSummons = 2  },

[2] = {summons = {["rat"] = {level = 10, mana = 20}, ["dragon"] = {level = 100, mana = 200} }, maxSummons = 4  },

[5] = {summons = {["rat"] = {level = 10, mana = 20}, ["dragon"] = {level = 100, mana = 200} }, maxSummons = 4  },

[6] = {summons = {["rat"] = {level = 10, mana = 20}, ["dragon"] = {level = 100, mana = 200} }, maxSummons = 6  },

[9] = {summons = {["rat"] = {level = 10, mana = 20}, ["dragon"] = {level = 100, mana = 200} }, maxSummons = 6  },

[10] = {summons = {["rat"] = {level = 10, mana = 20}, ["dragon"] = {level = 100, mana = 200} }, maxSummons = 8  },

}

if exhaustion.check(cid, storage) then

doPlayerSendTextMessage(cid, 22, "You are exhausted.")

return true

end

    --Player Status

    local playerpos = getPlayerPosition(cid)

    param = string.lower(param)

    local loop = 0

  

    function checkSummon()

        for k, v in pairs(monsters[getPlayerVocation(cid)].summons) do

            if param == k then

                return true

            end

        end

        return false

    end

  

    if not checkSummon() then

        doPlayerSendCancel(cid, "You can't summon this monster.")

        return true

    end

  

    for k, v in pairs(monsters[getPlayerVocation(cid)].summons) do

        if (param == k) then

            if (monsters[getPlayerVocation(cid)]) and #getCreatureSummons(cid) >= monsters[getPlayerVocation(cid)].maxSummons then

                return doPlayerSendCancel(cid, "Você já tem sumons demais.")

            else

            --Summon

                if getPlayerLevel(cid) < v.level then

                    return doPlayerSendCancel(cid, "Você não possui level suficiente.")

                elseif getCreatureMana(cid) < v.mana then

                    return doPlayerSendCancel(cid, "Você não possui mana suficiente.")

                end

                    doConvinceCreature(cid, doCreateMonster(param, playerpos))

                    doPlayerAddMana(cid, -v.mana, false)

                    exhaustion.set(cid, storage, tempo)

                    doSendMagicEffect(playerpos, 2)

                return true

            end

        end

    end

    return true

end

 

 

Tag no spells.xml 

  Mostrar conteúdo oculto

    <instant name="NOME DA SPELL" words="nome da spell" direction="1" lvl="30" maglv="50"  mana="3000" soul="0" exhaustion="1" prem="0" enabled="1" script="LOCAL DO SCRIPT">

    </instant>

 

Se der erro ou qualquer coisa posta ai.

 

Deu esse erro:

..../sumon.lua:onCastSpell

Description:

..../sumon.lua:18: bad argument #1 to 'lower' <string expected, got nil>

stack traceback:

[C]: in function 'lower'

....sumon.lua:21: in fuction <data/spells/scripts/summon/sumon.lua:1>

 

11 horas atrás, KNightmare Proj disse:

mas dava so para colocar um valor de storage necessario para a talkaction, nem precisava transformar em spell, ao comprar era só mudar a storage.

 

Spell facilitaria minha vida, já que não sei mexer muito. 

Link para o comentário
Compartilhar em outros sites

  • 0

Temos que levar em consideração o seguinte: numa talkaction, podemos usar o argumento param para especificar qual o monstro que o jogador deseja invocar. Em spells, entretanto, não temos o luxo que a talkaction nos proporciona. 

Naturalmente, permanecer uma talkaction seria mais fácil (bastaria, como já dito, manipular storages). Se, mesmo assim, você ainda quiser uma spell, podemos escrevê-la, apesar de talkaction ser mais viável para um tipo de código influenciado por um parâmetro no comando.

Link para o comentário
Compartilhar em outros sites

  • 0
1 hora atrás, zipter98 disse:

Temos que levar em consideração o seguinte: numa talkaction, podemos usar o argumento param para especificar qual o monstro que o jogador deseja invocar. Em spells, entretanto, não temos o luxo que a talkaction nos proporciona. 

Naturalmente, permanecer uma talkaction seria mais fácil (bastaria, como já dito, manipular storages). Se, mesmo assim, você ainda quiser uma spell, podemos escrevê-la, apesar de talkaction ser mais viável para um tipo de código influenciado por um parâmetro no comando.

 

Mas se usar essa storage, mesmo assim talkaction não apareceria no spellbook, eu teria que criar uma magia não funcional com as mesmas características dessa talkaction, certo? Tipo, mesmo nome pra usar, mesma quantidade de mana, etc...

 

Tentei substituir essa parte: function onSay(cid, words, param, channel)

Por: function onCastSpell(cid, param)

E adicionei params="1" na tag da spell no xml, não da erro mas a magia não executa.

 

Sabe como resolver?

Link para o comentário
Compartilhar em outros sites

  • 0

onCastSpell não possui um argumento responsável pelos parâmetros da fala. Por isso, as palavras-chaves limitam-se às configuradas na tag. 

Por condições como mana, level e classe encontrarem-se na tag, não vi necessidade de mantê-las no código.

Naturalmente, sem poder usar um parâmetro para especificar qual summon o jogador deseja, será um código por monstro.

local summon_name = "Rat"              --Nome do summon.local summon_count = {                 --[vocation_id] = max_summons,    [1] = 2,    [2] = 4,    [5] = 4,    [6] = 6,    [9] = 6,    [10] = 8,}function onCastSpell(cid)    local playerpos = getPlayerPosition(cid)      if #getCreatureSummons(cid) >= summon_count[getPlayerVocation(cid)] then        doPlayerSendCancel(cid, "Você já tem sumons demais.")        return false    end               doConvinceCreature(cid, doCreateMonster(summon_name, playerpos))    doSendMagicEffect(playerpos, 2)    return trueend

 

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

  • 0
1 hora atrás, zipter98 disse:

 

Obrigado! Uma spell por monstro já está de ótimo tamanho, tive uma ideia do que fazer com isso.

Vou testar aqui e já posto o feedback, mas já vou te dar rep pela ajuda.

Link para o comentário
Compartilhar em outros sites

  • 0
8 horas atrás, zipter98 disse:

onCastSpell não possui um argumento responsável pelos parâmetros da fala. Por isso, as palavras-chaves limitam-se às configuradas na tag. 

Por condições como mana, level e classe encontrarem-se na tag, não vi necessidade de mantê-las no código.

Naturalmente, sem poder usar um parâmetro para especificar qual summon o jogador deseja, será um código por monstro.

 

A spell funcionou, mas quando chegava no limite de summons, não sumonava nada, mas continuava gastando mana, mas resolvi trocando o return true por return false.

Obrigado.

Link para o comentário
Compartilhar em outros sites

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