Postado Janeiro 9, 2018 7 anos Agora consegui consertar, estava bugando devido aos espaços na talkaction. Hotkeys usadas: hiraishin ni no dan seal Test hiraishin ni no dan Testado em The Forgotten Server 0.4 Em data/talkactions/talkactions.xml insira a TAG: <talkaction words = "hiraishin" event = "script" value = "hiraishin no jutsu.lua"/> OBS.: Tenha atenção pois agora é só um script. Em data/talkactions/scripts/ crie o script hiraishin no jutsu.lua e cole dentro dele: local config = { storage = 49608, time = 6, vocation = 4 } local errorMsg = { pz = "Voce so pode usar este jutsu fora do PZ.", playerOnly = "Voce so pode usar este jutsu em players.", alreadyMarked = "Voce ja marcou um jogador.", doesntExist = "Este jogador nao existe ou nao esta online.", noVocation = "Voce nao tem a vocation necessaria" } function onSay(cid, words, param) if getPlayerVocation(cid) ~= config.vocation then doPlayerSendCancel (cid, errorMsg.noVocation) return true end parametros = string.explode (param, " ") if #parametros == 3 then if parametros[1] == "ni" and parametros[2] == "no" and parametros[3] == "dan" then if getPlayerStorageValue (cid, config.storage) == 1 then setPlayerStorageValue(cid, config.storage, 2) else doPlayerSendTextMessage(cid,22, "Voce nao marcou nenhum jogador.") end end return true end if not parametros[1] == "ni" and not parametros[2] == "no" and not parametros[3] == "dan" and not parametros[4] == "seal" then return false end playerName = parametros[5] for i = 6, #parametros do playerName = playerName .. " " .. parametros[i] end caster = cid target = getPlayerByName (playerName) if target == nil then doPlayerSendCancel (cid, errorMsg.doesntExist) return false end if not getTilePzInfo(getThingPosition(cid)) and not getTilePzInfo(getThingPosition(target)) then if isPlayer (target) then if getPlayerStorageValue (cid, config.storage) <= 0 then setPlayerStorageValue(cid, config.storage, 1) doPlayerSendTextMessage(cid,22, "Voce marcou o player ".. getPlayerName(target)) local struct = { left = config.time, player = cid, target = target } addEvent(teleportIsTrue, 1000, struct) elseif getPlayerStorageValue (cid, config.storage) > 0 then doSendMagicEffect(getPlayerPosition(cid), 2) doPlayerSendCancel (cid, errorMsg.alreadyMarked) end else doPlayerSendCancel (cid, errorMsg.playerOnly) end else doPlayerSendCancel (cid, errorMsg.pz) end end function teleportIsTrue (struct) if struct.left ~= 0 then if getPlayerStorageValue (struct.player, config.storage) == 2 then doTeleportThing(struct.player, getThingPosition(struct.target), true) setPlayerStorageValue(struct.player, config.storage, 0) doPlayerSendTextMessage(struct.player,22, "Voce perdeu sua marcacao.") return TRUE end doPlayerSendTextMessage(struct.player,22, struct.left .. " segundos restantes.") struct.left = struct.left - 1 addEvent (teleportIsTrue, 1000, struct) elseif struct.left == 0 then doPlayerSendTextMessage(struct.player,22, "Voce perdeu sua marcacao.") setPlayerStorageValue(struct.player, config.storage, 0) else return FALSE end end 10 horas atrás, hallanehallex disse: ao invez de colocar o nome da pessoa como vc deu o exemplo hiraishin "Teste3 tem como colocar a vocation por exemplo hiraishin"230-246 para X vocation pode usar essa spell/talkaction ?? Acredito eu que isso dificulte um pouco as coisas, porque é uma margem enorme para bugs, como a possibilidade do jogador parar em lugares que bugue ou que não tenha como sair. Mas aqui tem um script semelhante a esse que você pediu: Editado Janeiro 9, 2018 7 anos por marcot (veja o histórico de edições)
Postado Janeiro 10, 2018 7 anos Autor @marcot 1 - quando você escreveu (hiraishin ni no dan test) invez de escrever assim eu posso escrever o nome de qualquer outra pessoa do otserver ?? 2 - teria como fazer ela como spell ?? 3 - se não der para fazer como spell como faz para deixar essa talkactions com letras em ORANGE ao falar o nome dela 4 - teria como deixar ela como exclusiva para X vocation ?? Editado Janeiro 10, 2018 7 anos por hallanehallex (veja o histórico de edições)
Postado Janeiro 10, 2018 7 anos 1) Dá pra colocar o nome de qualquer pessoa do server 2) O meu problema com spell é que não sei como posso pegar o nome do jogador target como parâmetro 3) Eu não estou sabendo porque o comando de marcar o jogador fala, enquanto o segundo o jogador nao fala 4) Ja esta exclusiva para vocation X, a definição está no config
Postado Janeiro 10, 2018 7 anos 2 hours ago, marcot said: 1) Dá pra colocar o nome de qualquer pessoa do server 2) O meu problema com spell é que não sei como posso pegar o nome do jogador target como parâmetro 3) Eu não estou sabendo porque o comando de marcar o jogador fala, enquanto o segundo o jogador nao fala 4) Ja esta exclusiva para vocation X, a definição está no config 2) para pegar o nome do jogador target vc pode fazer igual em talkaction, só precisa ativar param = "1" na tag no xml e aí pegar pelo nome, semelhante ao exura sio. 3) o que faz a fala não sair é o return false. Se tiver return true o texto sai, se tiver false ele não sai. Pra falar em laranja tu coloca return false e faz a mensagem sair por doCreatureSay. Note que a função doCreatureSay tem um parametro que representa o tipo de texto, um dos tipos é o TALKTYPE_MONSTER (ou algo assim). Você pode ver todos os tipos dentro do arquivo data/lib/constant.lua e inclusive tem um tópico do Caronte sobre o constant.lua explicando várias coisas úteis lá. 4) Eu sugiro que vc troque a forma que vc fez para suportar mais de uma vocação permitida, é relativamente fácil vc só precisa mudar vocation = 4 para vocation = {4} e no check ao invés de fazer if getPlayerVocation(cid) == config.vocation then fazer if isInArray(config.vocation, getPlayerVocation(cid)) then. Dessa forma ele vai procurar se o numero da sua vocação tá dentro daquele array/vetor/tabela que é o vocation. E aí você pode fazer vocation = {4,5,8,12,250} que ele vai aceitar todas essas vocações. Todos os meus trabalhos importantes estão na seção "Sobre mim" no meu perfil; Dá uma passada lá! "Há três caminhos para o fracasso: não ensinar o que se sabe, não praticar o que se ensina, e não perguntar o que se ignora." - São Beda (obg ao @Beeny por fazer essa linda sign <3)
Postado Janeiro 11, 2018 7 anos @hallanehallex Consegui fazer seguindo as dicas do Wolf. Hiraishin no Jutsu 2.0: Citar Ao utilizar "hiraishin ni no dan seal" o player que o jogador targetou é marcado por X segundos. Ao usar "hiraishin ni no dan" o jogador é teleportado ao outro que está marcado após um pequeno delay. Em data/spells/spells.xml cole: <instant name="Hiraishin No Jutsu" words="hiraishin ni no dan seal" lvl="12" mana="20" prem="1" range="5" casterTargetOrDirection="1" blockwalls="1" exhaustion="2000" needlearn="0" event="script" value="hiraishin.lua"> <vocation id="4"/> </instant> <instant name="Hiraishin no Jutsu" words="hiraishin ni no dan" lvl="18" mana="140" prem="1" aggressive="0" params="1" exhaustion="2000" needlearn="0" event="script" value="hiraishinII.lua"> <vocation id="4"/> </instant> Em data/spells/scripts crie hiraishin.lua e cole: local config = { storageID = 49609, mark_time = 6, } local errorMsg = { pz = "Seu alvo nao pode estar fora do PZ.", playerOnly = "Voce so pode usar este jutsu em players.", alreadyMarked = "Voce ja marcou um jogador.", } local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_ENERGYAREA) setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ENERGY) setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -1, -10, -1, -20, 5, 5, 1.4, 2.1) function onCastSpell(cid, var) --local target = getThingFromPosition(variantToPosition(var), 1) if isPlayer(getCreatureTarget(cid)) then if not getTilePzInfo(getThingPosition(getCreatureTarget(cid))) then if getPlayerStorageValue (cid, config.storageID) <= 0 then setPlayerStorageValue(cid, config.storageID, 1) doPlayerSendTextMessage(cid,22, "Voce marcou o player ".. getCreatureName(getCreatureTarget(cid))) local struct = { left = config.mark_time, player = cid, target = target, var = var } addEvent(teleportIsTrue, 1000, struct) else doSendMagicEffect(getPlayerPosition(cid), 2) doPlayerSendCancel(cid, errorMsg.alreadyMarked) end else doSendMagicEffect(getPlayerPosition(cid), 2) doPlayerSendCancel(cid, errorMsg.pz) end else doSendMagicEffect(getPlayerPosition(cid), 2) doPlayerSendCancel(cid, errorMsg.playerOnly) end return doCombat(cid, combat, var) end function teleportIsTrue (struct) if struct.left ~= 0 then if getPlayerStorageValue (struct.player, config.storageID) == 2 then doTeleportThing(struct.player, getThingPosition(getCreatureTarget(struct.player)), true) setPlayerStorageValue(struct.player, config.storageID, 0) doPlayerSendTextMessage(struct.player,22, "Voce perdeu sua marcacao.") return true end doPlayerSendTextMessage(struct.player,22, struct.left .. " segundos restantes.") struct.left = struct.left - 1 addEvent (teleportIsTrue, 1000, struct) elseif struct.left == 0 then doPlayerSendTextMessage(struct.player,22, "Voce perdeu sua marcacao.") setPlayerStorageValue(struct.player, config.storageID, 0) else return false end end E em hiraishinII.lua cole: local config = { storageID = 49609, mark_time = 6, } function onCastSpell(cid, var) if getPlayerStorageValue (cid, config.storageID) == 1 then setPlayerStorageValue(cid, config.storageID, 2) else doPlayerSendTextMessage(cid,22, "Voce nao marcou nenhum jogador.") end return true end
Participe da conversa
Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.