gabrielsaintz
Campones-
Total de itens
10 -
Registro em
-
Última visita
Sobre gabrielsaintz
Perfil
-
Gênero
Masculino
Informações
-
Forma que conheci o xTibia
Sites de Busca
-
Sou
Spriter
Últimos Visitantes
258 visualizações
gabrielsaintz's Achievements
-
Consegui arrumar uma solução!! Depois de muito tempo fazendo testes cheguei a esse resultado: local combat = Combat() combat:setArea(createCombatArea(AREA_CIRCLE5X5)) function getRandomPositions(cid) local player = Player(cid) local playerPos = player:getPosition() local areaCircle5x5 = {} -- cria uma nova AREA_CIRCLE5X5 com base na posição do meu personagem for i = -5, 5 do for j = -5, 5 do local dist = math.sqrt(i^2 + j^2) if dist <= 5 then table.insert(areaCircle5x5, {x=playerPos.x+i, y=playerPos.y+j, z=playerPos.z}) end end end local randomPosition = {} for i = 1, 1 do local index = math.random(1, #areaCircle5x5) table.insert(randomPosition, areaCircle5x5[index]) end return randomPosition end function spellCallback(cid, position, count, maxCount) if Creature(cid) and count < maxCount then if count == 0 and math.random(0, 1) == 1 or math.random(0, 15) == 1 then position:sendMagicEffect(CONST_ME_MORTAREA) doAreaCombat(cid, COMBAT_DEATHDAMAGE, position, 0, -100, -100, CONST_ME_EXPLOSIONHIT) end count = count + 1 local area = getRandomPositions(cid) -- pega uma nova posição aleatoria com base na posição do meu personagem local positionAreaCircle = {x= area[1].x, y= area[1].y, z= area[1].z} local position1 = Position(positionAreaCircle) if count > 1 and count < 81 or count > 81 and count < 145 then addEvent(spellCallback,50, cid, position1, count, maxCount) else addEvent(spellCallback,math.random(1000, 2000) , cid, position1, count, maxCount) end if count > 141 then addEvent(spellCallback,math.random(600, 3000) , cid, position1, count, maxCount) end end end function onTargetTile(creature, position) local maxCount = 145 -- quantidade de execuções spellCallback(creature:getId(), position, 0, maxCount) end combat:setCallback(CALLBACK_PARAM_TARGETTILE, "onTargetTile") function onCastSpell(creature, variant, isHotkey) return combat:execute(creature, variant) end Dentro do game: @GamerGoiano @Yan Oliveira De qualquer forma, obrigado pela ajuda!
-
To usando tfs 1.4.2 10.98. Isso também não funcionou, mas vou tentar fazer algo com base nisso. Aqui ta dando erro nessa getArea(), getWidth() e getPosRandomPos(). Source de pokemon deve ter alterações...
-
Eu tentei dessa forma também, porém não funcionou... Depois de um tempo printando o que vem de informação em cada parte, eu entendi o que é passado no position da combat:setCallback(CALLBACK_PARAM_TARGETTILE, "onTargetTile"). Explicação: function spellCallback(cid, position, count) if Creature(cid) then --[[ TEXTO 3 Sendo executada 4 vezes ao mesmo tempo e passando uma posição diferente a cada execução. Ela gera aquela primeira explosão do exemplo gif. Perceba que no gif a primeira explosão sai de forma aleatoria e não na AREA_CIRCLE5X5 como uma AOE(exevo gran mas frigo). Explicação: TEXTO 4 --]] if count > 0 or math.random(0, 1) == 1 then --[[ TEXTO 4 Esse if torna a primeira explosão aleatoria pois ele só executa a doAreaCombat se o math.random(0, 1) for igual a 1, assim fazendo com q, mesmo ela sendo executada varias vezes ao mesmo tempo, ele só dispara o dano e o efeito quando ela entrar aqui, nesse if. Caso eu mude esse if para: if count >= 0 then Ai sim ela vai excutar na AREA_CIRCLE5X5 completa... EXPLICAÇÃO BASEADA NO GIF. --]] position:sendMagicEffect(CONST_ME_MORTAREA) doAreaCombat(cid, COMBAT_DEATHDAMAGE, position, 0, -100, -100, CONST_ME_EXPLOSIONHIT) end if count < 3 then -- QUANTIDADE DE VEZES count = count + 1 --[[ TEXTO 5 Aqui é gerado os hits aletorios depois da primeira execução. me baseando na area que eu passei com 4 posições de hit, a partir o momento em que você usar a magia esse addEvent será executado 4 vezes ao mesmo tempo e passando uma posição diferente a cada execução. Porém como da pra ver a baixo no delay usamos tempo aleatorio que é dado pelo math.random(1000, 4000). Isso gera um loop de hits aleatorios dentro da area setada, até que o count chegue ao valor desejado. No caso desse código ele vai ser executado até que o count seja 3, isso faz com que a função spellCallback seja executada 20 vezes passando as mesmas posições dentro da area passada no inicio, porém o que torna aleatorio onde vai o efeito e dano é justamente o tempo em que ela vai ser executada. --]] addEvent(spellCallback, math.random(1000, 4000), cid, position, count) end end end function onTargetTile(creature, position) --[[ TEXTO 2 Aqui recebemos o creature e position da combat:setCallback(CALLBACK_PARAM_TARGETTILE, "onTargetTile"). creature = seu personagem position = { {0,1,0}, execução 1 {1,3,0}, execução 2 e 3 {0,1,0} execução 4 } Sendo assim ele vai executar a função spellCallback 4 vezes, e cada vez que for executada ela vai passar uma posição diferente, dentro da area que eu passei. --]] spellCallback(creature:getId(), position, 0) end local combat = Combat() combat:setArea(createCombatArea(AREA_CIRCLE5X5)) combat:setCallback(CALLBACK_PARAM_TARGETTILE, "onTargetTile") --[[ TEXTO 1 A CALLBACK_PARAM_TARGETTILE vai executar a onTargetTile varias vezes, isso depende do tamanho da área que você passou na combat:setArea(createCombatArea(AREA_CIRCLE5X5)). Exemplo: Se ao invés de AREA_CIRCLE5X5 eu passar uma área menor como: local area { {0,1,0}, <- 1 = posição de dano #1 {1,3,0}, <- 1,3 = posição de dano #2 e #3 {0,1,0} <- 1 = posição de dano #4 } combat:setArea(createCombatArea(area)) Ela vai ser executada 4 vezes ao mesmo tempo porque na area que eu passei existem 4 posições de dano. A cada vez que ela executar ela vai passar as areas, uma de cada vez, sendo #1, #2, #3 e por ultimo #4. --]] function onCastSpell(creature, variant, isHotkey) return combat:execute(creature, variant) end Então não adianta eu pegar o position assim creature:getPosition() porque a position é a posição onde vai hit se eu usar a posição do meu personagem o hit vai sempre nele mesmo... Espero que consiga entender, dei meu maximo na explicação... Para resolver o problema, eu preciso arrumar uma forma de pegar uma posição aleatoria com base na posição do meu personagem toda vez antes de executar a spellCallback.
-
Geralmente quando acontece isso é porque a script ta escrita de forma errada, poderia mandar o codigo da multi-punch.lua?
-
depois que eu casto, ela fica batendo aleatoriamente no local onde castei. Meu objetivo é fazer ela me seguir depois que eu castar, os hits ficar aleatorio em volta do meu char.
-
Continua dando erro. Eu creio que você n pode passar 4 parâmetros para a função combat:setCallback(CALLBACK_PARAM_TARGETTILE, "createSpellExplosion"). Porque a estrutura da CALLBACK_PARAM_TARGETTILE só recebe 2 parâmetros. Você esta passando uma função para ela com 4 parâmetros createSpellExplosion(1-creature, 2-combat, 3-variant, 4-count). Estrutura da CALLBACK_PARAM_TARGETTILE: void TileCallback::onTileCombat(Creature* creature, Tile* tile) const { //onTileCombat(creature, pos) if (!scriptInterface->reserveScriptEnv()) { std::cout << "[Error - TileCallback::onTileCombat] Call stack overflow" << std::endl; return; } ScriptEnvironment* env = scriptInterface->getScriptEnv(); if (!env->setCallbackId(scriptId, scriptInterface)) { scriptInterface->resetScriptEnv(); return; } lua_State* L = scriptInterface->getLuaState(); scriptInterface->pushFunction(scriptId); if (creature) { LuaScriptInterface::pushUserdata<Creature>(L, creature); LuaScriptInterface::setCreatureMetatable(L, -1, creature); } else { lua_pushnil(L); } LuaScriptInterface::pushPosition(L, tile->getPosition()); scriptInterface->callFunction(2); } Além disso você está usando uma estrutura totalmente diferente, da forma que seu código está, a magia não vai funcionar da forma esperada, pois quero que ela dê hits em posições aleatórias, como no gif de exemplo. A magia da hits aleatórios dentro da área CRICLE5X5, porém se eu andar ela não acompanha meu personagem, quero que ela acompanhe meu personagem dando os hits aleatórios. Eu só preciso de uma forma de pegar a posição do meu personagem atualizada antes de cada repetição. Assim consigo atualizar a area com base na nova posição.
-
Não executou a magia, e acho que ta faltando o then depois do if, adicionei e mesmo assim deu erro. antes de executar: depois de executar: Acho que deu erro porque a CALLBACK_PARAM_TARGETTILE recebe apenas creature e position como parametro e no seu codigo você passou 4 parametros.
-
Deu errado. Se você puder pega a versão tfs1.4.2 da source no github para tentar testar. Sim pouco depois que enviei a dúvida eu pensei nisso, ela não me acompanha porque ele só registra a posição de quando eu executo a magia. A magia tem que pegar a minha posição toda vez antes do proximo dano. Segue a explicação de como a spell funciona: function spellCallback(cid, position, count) -- cada vez que a spellcallback é executada, no position vem varias posições aleatorias dentro da area eu executei a magia if Creature(cid) then if count > 0 or math.random(0, 1) == 1 then -- aqui é o efeito e o tipo de dano que vai ser executado nas posições definidas no position position:sendMagicEffect(CONST_ME_HITBYFIRE) doAreaCombat(cid, COMBAT_FIREDAMAGE, position, 0, -100, -100, CONST_ME_EXPLOSIONHIT) end if count < 5 then count = count + 1 addEvent(spellCallback, math.random(1000, 4000), cid, position, count) end end end function onTargetTile(creature, position) spellCallback(creature:getId(), position, 0) end local combat = Combat() combat:setArea(createCombatArea(AREA_CIRCLE5X5)) -- CALLBACK_PARAM_TARGETTILE essa função pega alguns sqms aleatorios dentro da area que eu setei no combat:setArea(createCombatArea(AREA_CIRCLE5X5)) combat:setCallback(CALLBACK_PARAM_TARGETTILE, "onTargetTile") function onCastSpell(creature, variant, isHotkey) return combat:execute(creature, variant) end
-
Eai galera! Tenho uma Spell porém queria que ela seguisse meu personagem, alguém pode me dizer uma forma de fazer isso? A magia ta assim: function spellCallback(cid, position, count) if Creature(cid) then if count > 0 or math.random(0, 1) == 1 then position:sendMagicEffect(CONST_ME_HITBYFIRE) doAreaCombat(cid, COMBAT_FIREDAMAGE, position, 0, -100, -100, CONST_ME_EXPLOSIONHIT) end if count < 5 then count = count + 1 addEvent(spellCallback, math.random(1000, 4000), cid, position, count) end end end function onTargetTile(creature, position) spellCallback(creature:getId(), position, 0) end local combat = Combat() combat:setArea(createCombatArea(AREA_CIRCLE5X5)) combat:setCallback(CALLBACK_PARAM_TARGETTILE, "onTargetTile") function onCastSpell(creature, variant, isHotkey) return combat:execute(creature, variant) end Dentro do game: Quando ando para a esquerda ela continua na posição de onde eu fiz o cast dela. Até entendo o porque disso, ela só esta sendo executada 1 vez, com isso ela só registra a posição do meu personagem na hora que é castada. Meu objetivo é manter essa aleatoriedade nos hits porém quero que ela acompanhe meu personagem.
-
Quem Está Navegando 0 membros estão online
- Nenhum usuário registrado visualizando esta página.