Postado Janeiro 7, 2018 7 anos Autor 18 minutos atrás, zLockey9 disse: Tenho um Spell similar a esse que está pedindo. Depois que você "selar" essa magia no adversário passará 6 segundos ( configuravél ) e seu char irá teleportar para o player que você "selou" a magia Mostrar conteúdo oculto local config = { storage = 49608, tempo = 6 } function onCastSpell(cid, var) if isPlayer(getCreatureTarget(cid)) then local name = getCreatureName(getCreatureTarget(cid)) if getPlayerStorageValue(cid, config.storage) <= 0 then doPlayerSetStorageValue(cid, config.storage, 1) doSendMagicEffect(getThingPos(cid), 65) doSendMagicEffect(getThingPos(getCreatureByName(name)), 65) addEvent(function() if isCreature(cid) then doPlayerSetStorageValue(cid, config.storage, 0) doTeleportThing(cid, getThingPos(getCreatureByName(name))) end end, 1000*config.tempo) elseif getPlayerStorageValue (cid, config.storage) > 0 then doSendMagicEffect(getThingPos(cid), 2) doPlayerSendCancel(cid, "Você marcou seu target.") end elseif(getTilePzInfo(aqui)) then return doPlayerSendCancel(cid, "Não pode usar o teleport em casas ou areas protegidas.") else doPlayerSendCancel (cid, "Você só pode usar esse jutsu em players!.") end return true end Mostrar conteúdo oculto <instant name="Hiraishin Ni No Dan" words="Hiraishin Ni No Dan" lvl="1000" mana="9500" aggressive="1" needtarget="1" range="5" exhaustion="0" needlearn="0" blockwalls="1" event="script" value="minato/hiraishinnojutsu.lua"> <vocation id="16-"/> </instant> Aqui funcionou Perfeitamente , espero que aí também funcione. @zLockey9 ja vi essa spell em um topico em que o WhiteWolf respondeu mais eu queria igual a do Nto WoNo que no caso é igual o que eu disse la no começo do topico 1 spell e selamento e outra de teleport
Postado Janeiro 8, 2018 7 anos Bom, eu tentei fazer o bruto, se faltar alguma coisa me dá o toque. Eu preferi fazer por talkaction pra deixar mais fácil o codigo, porque daria muito trampo negócio de guardar o nome do jogador que o player marcou fora do script. Vá em data/talkactions/talkactions.xml e adicione as tags: <talkaction words="hiraishin ni no dan seal" script="hiraishin no jutsu.lua" /> <talkaction words="hiraishin ni no dan" script="teleport hiraishin.lua" /> Agora em data/talkactions/scripts/ crie os arquivos hiraishin no jutsu.lua e teleport hiraishin.lua. hiraishin no jutsu.lua local config = { storage = 49608, time = 6 } 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." } function onSay(cid, words, param) caster = cid target = getPlayerByName (param) if getTilePzInfo(getPlayerPosition(caster)) == FALSE and getTilePzInfo(getPlayerPosition(target)) == FALSE then if isPlayer (target) == TRUE 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, getThingPos(struct.target)) 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 hiraishin teleport.lua local config = { storage = 49608 } function onSay (cid, words, param) if getPlayerStorageValue (cid, config.storage) == 1 then setPlayerStorageValue(cid, config.storage, 2) else doPlayerSendTextMessage(cid,22, "Voce nao marcou nenhum jogador.") end end Testei em Aries Server to Tibia 8.1 - Version 4.0 based on OTServ SVN Version 0.6.0 e funcionou normalmente, caso dê algum erro me envie o que houve no console. Espero ter ajudado!
Postado Janeiro 8, 2018 7 anos Antes de tudo @topic, me desculpa eu ando muito sem tempo ultimamente e fds eu costumo ficar sem pc então foi duplamente mais dificil arrumar um tempo pra abrir o sv e fazer os scripts. Eu tentei entrar hoje para escrever pelo menos umas dicas de como alguém poderia fazer para te ajudar mas me deparei com a resposta do marcot q num olhar rápido aparenta estar funcional. @marcot você podia tanto ter salvo o nome do player no storage quanto salvar o uid dele (q é um numero). A unica preocupação é q dependendo do tamanho máximo q o storage está definido na sua source (e no seu banco de dados) o valor poderia ultrapassar mas isso é relativamente fácil de contornar (dividir o numero em 3 storages, por ex) Eu gostei da forma q vc criou uma structure, isso mostra que você tem conhecimento em outras linguagens. Vou testar seu código depois. Geralmente os programadores q eu conheço não aceitam tão bem dicas, então espero q você não seja como eles e leve para o pessoal: 1- Use variaveis locais caster = cid target = getPlayerByName (param) Principalmente com coisas que podem ser executadas ao mesmo tempo. Elas são mais rápidas! 2- TRUE e FALSE são variaveis, use true e false (minusculo) 3- Evite redundancias. getTilePzInfo(getPlayerPosition(caster)) == FALSE é muito mais fácil fazer if not getTilePzInfo(getPlayerPosition(caster)) Ou no caso de If X == 1 then use if X then (o mesmo pra X == true) De resto, curti seu estilo, obrigado por atender ao pedido do tópico. 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 8, 2018 7 anos 20 minutos atrás, xWhiteWolf disse: Antes de tudo @topic, me desculpa eu ando muito sem tempo ultimamente e fds eu costumo ficar sem pc então foi duplamente mais dificil arrumar um tempo pra abrir o sv e fazer os scripts. Eu tentei entrar hoje para escrever pelo menos umas dicas de como alguém poderia fazer para te ajudar mas me deparei com a resposta do marcot q num olhar rápido aparenta estar funcional. @marcot você podia tanto ter salvo o nome do player no storage quanto salvar o uid dele (q é um numero). A unica preocupação é q dependendo do tamanho máximo q o storage está definido na sua source (e no seu banco de dados) o valor poderia ultrapassar mas isso é relativamente fácil de contornar (dividir o numero em 3 storages, por ex) Eu gostei da forma q vc criou uma structure, isso mostra que você tem conhecimento em outras linguagens. Vou testar seu código depois. Geralmente os programadores q eu conheço não aceitam tão bem dicas, então espero q você não seja como eles e leve para o pessoal: 1- Use variaveis locais caster = cid target = getPlayerByName (param) Principalmente com coisas que podem ser executadas ao mesmo tempo. Elas são mais rápidas! 2- TRUE e FALSE são variaveis, use true e false (minusculo) 3- Evite redundancias. getTilePzInfo(getPlayerPosition(caster)) == FALSE é muito mais fácil fazer if not getTilePzInfo(getPlayerPosition(caster)) Ou no caso de If X == 1 then use if X then (o mesmo pra X == true) De resto, curti seu estilo, obrigado por atender ao pedido do tópico. @xWhiteWolf, Então, eu estou começando a mexer com LUA ainda, comecei pra valer na semana passada... Antigamente eu mexia com otserver (quando tinha uns 12 anos) mas eu sempre reutilizava scripts para tentar fazer outros e nunca sabia nada sobre a sintaxe de programação (como condicionais ou iteradores) o que me limitava muito. Agora já sei ou pouco mais, ai ajuda. Obrigado pelas dicas. Sobre a segunda eu tenho um pouco de medo porque ao menos na versão 8.1 o TRUE e FALSE são definidos no global.lua como 0 e 1, e não sabia se em lua é feito igual em C++ (0 = false e o restante = true). Sobre a redundancia na terceira acho que entra um pouco na segunda, no servidor 8.1 que tenho enfrentei problemas quando nao colocava a redundância em alguns scripts, mas eu vi que no outro source que tenho já não dava erro (TFS). Tipo, eu meio que sei sobre isso, mas tenho medo pelo desconhecimento ainda das sources e de LUA em si... O storage eu nao consigo trocar ainda porque sou meio que fechado com 8.1 e se não me engano ele não aceita storage com strings (e ele não usa banco de dados, mas arquivos de texto para armazenar os personagens). (P.S.: Mt obrigado pela dica do uid do jogador, acho que ja da pra usar em uns scripts que eu estava pensando) Editado Janeiro 8, 2018 7 anos por marcot (veja o histórico de edições)
Postado Janeiro 9, 2018 7 anos @marcot seu começo foi bem parecido com o meu, continue treinando e sucesso. Se tiver qualquer duvida pode chegar no privado :D Lua entende nil e false como false. Qualquer outra coisa é considerado verdadeiro. Se souber um pouco de inglês aqui tá a definição de acordo com o wiki da linguagem: Spoiler An important point to note is that the value 0 is not a false test condition in Lua. In some languages, for example C, a test of: if (0) printf("true"); else printf("false"); would display "false". In Lua, > if 0 then >> print("true") >> else >> print("false") >> end true prints "true"! You should use false, or nil in place of 0: > if false then print("true") else print("false") end false > if nil then print("true") else print("false") end false Why? The reason for this is historical. Lua did not support boolean types (i.e. true and false) before version 5.0. Previous to version 5.0 a value of nil represented false. Now, both nil and false will act as a false condition in a test expression. E.g., > if nil then print("true") else print("false") end false > if 1 then print("true") else print("false") end true > if 0 then print("true") else print("false") end true > if 1==2 then print("true") else print("false") end false Another point to note is that true and false are not numerical values, e.g., 1 and 0 as they are in some languages. > = true, false true false > = 1 + true stdin:1: attempt to perform arithmetic on a boolean value stack traceback: stdin:1: in main chunk [C]: ? Also, nil is coerced into a boolean value when used with a logical operator: > = not nil true > = not 1 false > = not 0 false 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)
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.