Postado Fevereiro 17, 2016 9 anos Bom dia/tarde/noite. pra ser direto ao ponto... Eu tive uma ideia de um sistema muito interessante para meu servidor. após algum tempo estudando formas de faze-lo eu descobri uma forma (bem feia) de fazer. Após algum tempo trabalhando no script cheguei a um resultado... porém não funcional vejamos: Primeiro a ideia: esse script ,era pra ser bem simples, seria uma skill target que quando atingisse o inimigo deixaria nele um storage value por determinado tempo. sairia um texto animado por puro capricho. passado o tempo esse storage value seria removido e sairia outro texto animado. Esse sistema que pretendo fazer funcionaria somente se o player tivesse equipado com um item, mas tornou-se muito mais problematico do que eu imaginava. vou postar os 2 pois acredito que o erro seja o mesmo então... não muda muito haha. Verifica se X item está equipado: local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_FIREAREA) setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_FIRE) setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -2, -1, -3, -2) local inimigo = {} local escudo = 2520 local slot1 = getPlayerSlotItem(getCreatureTarget(cid), 5) local slot2 = getPlayerSlotItem(getCreatureTarget(cid), 6) local storage = 199901 function onCastSpell(cid, var) table.insert(inimigo, getCreatureTarget(cid)) if isPlayer then if slot1 or slot2 == 2520 then setPlayerStorageValue(#inimigo, storage, 1) doSendAnimatedText(getCreaturePosition(cid), 'Charged', 180) else return doCombat(cid, combar, var) end addEvent(function() if isCreature(cid) then setPlayerStorageValue(#inimigo, storage, 0) doSendAnimatedText(getCreaturePosition(cid), 'Charge lost', 180) end end,4000) return doCombat(cid, combat, var) end end Não verifica se item está equipado: local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_FIREAREA) setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_FIRE) setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -2, -1, -3, -2) local inimigo = {} local storage = 199901 function onCastSpell(cid, var) table.insert(inimigo, getCreatureTarget(cid)) if isPlayer then setPlayerStorageValue(#inimigo, storage, 1) doSendAnimatedText(getCreaturePosition(cid), 'Charged', 180) else return doCombat(cid, combat, var) end addEvent(function() if isCreature(cid) then setPlayerStorageValue(#inimigo, storage, 0) doSendAnimatedText(getCreaturePosition(cid), 'Charge lost', 180) end end,4000) return doCombat(cid, combat, var) end O que me intriga muito nos 2 scripts é o fato de não ter nenhum erro no debugger (OtScriptLive) e nem no distro do servidor. o unico erro aparente é quano o player usa que aparece o erro avisando que o player está sem mana... porém baixei o custo de mana da magia pra 0 e testei em 2 personagens com mais de 5k de mana... eu sou um scripter iniciante (MUITO iniciante... NOVATO... NEWBA) portanto deve ser um erro ridiculo... alguem tem alguma solução? haha
Postado Fevereiro 17, 2016 9 anos Solução Fiz um aqui pra você, veja se lhe agrada: local storage, escudo = 40955, 2520 function onCastSpell(cid, var) local slot1, slot2 = getPlayerSlotItem(cid, CONST_SLOT_RIGHT).itemid, getPlayerSlotItem(cid, CONST_SLOT_LEFT).itemid local target, pos = getCreatureTarget(cid), getCreaturePosition if isPlayer(target) then if slot1 == escudo or slot2 == escudo then setPlayerStorageValue(target, storage, 1) doCreatureSay(target, 'Charged!', TALKTYPE_MONSTER) doSendMagicEffect(pos(target), CONST_ME_STUN) addEvent(function() setPlayerStorageValue(target, storage, -1) doCreatureSay(target, 'Charged lost!', TALKTYPE_MONSTER) doSendMagicEffect(pos(target), CONST_ME_MAGIC_GREEN) end, 4000) else doSendMagicEffect(pos(cid), CONST_ME_POFF) return doPlayerSendCancel(cid, 'Você só pode usar esta magia com o escudo "'.. getItemNameById(escudo) ..'" equiipado.') and false end else doSendMagicEffect(pos(cid), CONST_ME_POFF) return doPlayerSendCancel(cid, 'Você só pode usar em jogadores.') and false end return true end ➥ Regras | Seções OTServ | Seções BOT
Postado Fevereiro 17, 2016 9 anos Autor testarei logo logo, no momento estou lendo o script de cima a baixo algumas 50vezes, para detectar todos os erros. inclusive não sabia que podia usar mais de 1 else... mas pelo visto é possivel declarar 1 else para cada if que foi aberto, correto? todavia fiquei curioso a respeito dessa linha especifica: return doPlayerSendCancel(cid, 'Você só pode usar esta magia com o escudo "'.. getItemNameById(escudo) ..'" equiipado.') and false para declarara uma função no meio de uma frase essa é a "formula"? colocar entre "'. . XXyyXyxyX . .'"? haha, há tantas coisas para aprender... obs-- uma outra (ultima!?) pergunta, nesse addevents : addEvent(function() setPlayerStorageValue(target, storage, -1) doCreatureSay(target, 'Charged lost!', TALKTYPE_MONSTER) doSendMagicEffect(pos(target), CONST_ME_MAGIC_GREEN) end, 4000) caso o player mude seu target durante os 4 segundos, acho que o script vai retirar o storage de um terceiro player. estou certo? Editado Fevereiro 17, 2016 9 anos por Henriquegb outra duvida (veja o histórico de edições)
Postado Fevereiro 17, 2016 9 anos Sim é possível declarar um else para cada if, sobre a função no meio da frase, acho que da maneira que eu coloquei deu a entender errado, coloquei essas aspas para citar o nome do shield na frase, então não é necessário colocar as aspas, você abre o texto utilizando ' ou " e caso queira adicionar uma função no meio você fecha ' ou ", adiciona a .. função .., abre o texto de novo e termina de digitar, no final fecha novamente. Exemplo: doPlayerSendCancel(cid, "Aqui é o texto e fecha ".. função aqui .." abre novamente e fecha.") ou utilizando apenas ' doPlayerSendCancel(cid, 'Aqui é o texto e fecha '.. função aqui ..' abre novamente e fecha.') Agora sobre o addEvent, não, pois o addEvent já é "iniciado" assim que manda a magia, sendo assim target do addEvent será o que você lançou a magia. Espero que tenha entendido, não sou muito bom em explicar. Editado Fevereiro 17, 2016 9 anos por Wakon (veja o histórico de edições) ➥ Regras | Seções OTServ | Seções BOT
Postado Fevereiro 17, 2016 9 anos Autor Eu entendi perfeitamente a explicação, não posso testar o script agora. encontrei uns erros na minha distro e estou investindo tempo procurando e tentando editar outras. mas, acredito que funcione. Somente pela "aula" que recebi já da pra dar o topico como sanado. Uma correção (no caso tinha tanto erro que não foi bem uma correção) explica tão bem quanto os proprios tutoriais. OBRIGADO PELA ATENÇÃO rep+ Editado Fevereiro 17, 2016 9 anos por Henriquegb (veja o histórico de edições)
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.