Postado Setembro 30, 2023 1 ano Durante minhas codificações decidi criar spells para mini bosses em meu servidor, onde o mesmo pararia de se movimentar e virasse a face para o sul onde ele executaria uma determinada magia, minha solução foi essa: local conf = { stunTime = 4500, delayCast = 600, scream = "EXPLOSION FIRE", speakChance = 5, speakList = {"Did you get burned?", "I like well-done meat"} } -- Combat local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_LIFEDRAIN) -- Stun local stun = createConditionObject(CONDITION_PARALYZE) setConditionParam(stun, CONDITION_PARAM_TICKS, conf.stunTime) setConditionFormula(stun, -1, 0, -1, 0) local function setInitCast(cid) if isCreature(cid) then doAddCondition(cid, stun) doCreatureSetLookDir(cid, SOUTH) doCreatureSay(cid, conf.scream, TALKTYPE_MONSTER_YELL) end end . . . function onCastSpell(cid, var) setInitCast(cid) . . . return doCombat(cid, combat, var) end Entretanto logo apos ele voltar a face para o sul ele já retorna imediatamente o target no player, ou seja vira a face para onde o jogador está, enquanto ele continua castando a spell. Gostaria que ele continuasse olhando para o sul até finalizar o cast da spell.
Postado Outubro 1, 2023 1 ano Solução tenta usar addEvent, +ou- assim: local conf = { stunTime = 4500, delayCast = 600, scream = "EXPLOSION FIRE", speakChance = 5, speakList = {"Did you get burned?", "I like well-done meat"} } local s = 0 -- Combat local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_LIFEDRAIN) -- Stun local stun = createConditionObject(CONDITION_PARALYZE) setConditionParam(stun, CONDITION_PARAM_TICKS, conf.stunTime) setConditionFormula(stun, -1, 0, -1, 0) local function setInitCast(cid) if isCreature(cid) then doAddCondition(cid, stun) doCreatureSetLookDir(cid, SOUTH) doCreatureSay(cid, conf.scream, TALKTYPE_MONSTER_YELL) end end function onCastSpell(cid, var) setInitCast(cid) addEvent(function() if not isCreature(cid) then return true elseif s > conf.stunTime then return true end doCreatureSetLookDir(cid, SOUTH) s = s + 250 end, 250) return doCombat(cid, combat, var) end [*Ninguém será digno do sucesso se não usar suas derrotas para conquistá-lo.*] DISCORD: vodkart#6090
Postado Outubro 1, 2023 1 ano Autor 1 hora atrás, Vodkart disse: tenta usar addEvent, +ou- assim: local conf = { stunTime = 4500, delayCast = 600, scream = "EXPLOSION FIRE", speakChance = 5, speakList = {"Did you get burned?", "I like well-done meat"} } local s = 0 -- Combat local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_LIFEDRAIN) -- Stun local stun = createConditionObject(CONDITION_PARALYZE) setConditionParam(stun, CONDITION_PARAM_TICKS, conf.stunTime) setConditionFormula(stun, -1, 0, -1, 0) local function setInitCast(cid) if isCreature(cid) then doAddCondition(cid, stun) doCreatureSetLookDir(cid, SOUTH) doCreatureSay(cid, conf.scream, TALKTYPE_MONSTER_YELL) end end function onCastSpell(cid, var) setInitCast(cid) addEvent(function() if not isCreature(cid) then return true elseif s > conf.stunTime then return true end doCreatureSetLookDir(cid, SOUTH) s = s + 250 end, 250) return doCombat(cid, combat, var) end Boa noite Vodkart, obrigado por se dispor a me ajudar, entretanto acredito que a forma como você sugeriu seria fazer um loop que fica virando o cid de tempo em tempo atravez do comando addEvent e vira ele para o SOUTH, essa é minha spell atualmente: local conf = { stunTime = 6000, minDamage = 80, maxDamage = 120, textColorDanage = TEXTCOLOR_ORANGE, magicEffectPreparation = CONST_ME_POFF, magicEffectCid = CONST_ME_FIREATTACK, magicEffectArea = CONST_ME_FIREAREA, magicEffectTarget = CONST_ME_HITBYFIRE, delayCast = 800, scream = "EXPLOSION" } local s = 0 -- Combat local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE) -- STUN local stun = createConditionObject(CONDITION_PARALYZE) setConditionParam(stun, CONDITION_PARAM_TICKS, conf.stunTime) setConditionFormula(stun, -1, 0, -1, 0) local function setInitCast(cid) if isCreature(cid) then doAddCondition(cid, stun) doSendMagicEffect(getThingPos(cid), conf.magicEffectCid) doCreatureSetLookDir(cid, SOUTH) doCreatureSay(cid, conf.scream, TALKTYPE_MONSTER_YELL) end end local function setDamageCreature(cid, target) if not isCreature(cid) then return false end local targetID = target.uid if targetID == 0 or not isCreature(targetID) then return false end local danage = math.random(conf.minDamage, conf.maxDamage) if getCreatureHealth(targetID) < danage then danage = getCreatureHealth(targetID) end doCreatureAddHealth(targetID, -(danage)) doSendAnimatedText(getThingPos(targetID), danage, conf.textColorDanage) doSendMagicEffect(getThingPos(targetID), conf.magicEffectTarget) doCreatureAddHealth(cid, danage) return true end local function setCastSpell(cid, danage, radius, center, length) if isCreature(cid) then local pos, posY = getThingPos(cid), 0 posY = pos.y - center pos.x, posY, pos.y = pos.x - center, pos.y - center, pos.y - center for x = 1, radius do pos.x, pos.y = (pos.x + 1), posY for y = 1, radius do pos.y = (pos.y + 1) if x == center and y == center then elseif length ~= nill and length >= 1 then if x == 1 or x == radius or y == 1 or y == radius then if danage then if not setDamageCreature(cid, getThingfromPos(pos)) then doSendMagicEffect(pos, conf.magicEffectArea) end else doSendMagicEffect(pos, conf.magicEffectPreparation) end elseif length > 1 then if x <= length or x > radius - length or y <= length or y > radius - length then if danage then if not setDamageCreature(cid, getThingfromPos(pos)) then doSendMagicEffect(pos, conf.magicEffectArea) end else doSendMagicEffect(pos, conf.magicEffectPreparation) end end end else if danage then if not setDamageCreature(cid, getThingfromPos(pos)) then doSendMagicEffect(pos, conf.magicEffectArea) end else doSendMagicEffect(pos, conf.magicEffectPreparation) end end end end end return true end function onCastSpell(cid, var) setInitCast(cid) addEvent(function() if not isCreature(cid) then return true elseif s > conf.stunTime then return true end doCreatureSetLookDir(cid, SOUTH) s = s + 250 end, 250) addEvent(setCastSpell, conf.delayCast * 3, cid, false, 3, 2) addEvent(setCastSpell, conf.delayCast * 4, cid, true, 3, 2) addEvent(setCastSpell, conf.delayCast * 5, cid, false, 5, 3, 1) addEvent(setCastSpell, conf.delayCast * 6, cid, true, 5, 3, 1) addEvent(setCastSpell, conf.delayCast * 6, cid, false, 7, 4, 1) addEvent(setCastSpell, conf.delayCast * 7, cid, true, 7, 4, 1) return doCombat(cid, combat, var) end Estou utilizando a versão 8.60 no meu projetinho e esse está sendo o meu primeiro mês com LUA e com o TFS, mas voltando, durante o teste o cid vira para o sul e volta a face novamente para o player, amanha estarei efetuando um loop e corrigindo, entretanto vou adicionar muitos eventos durante uma unica spell apenas para virar a criatura para o sul, não sobrecarregaria o servidor? entretanto achei bem engenhoso sua solução, parabéns e obrigado pela atenção 😄
Postado Outubro 1, 2023 1 ano Autor Bom hoje acordei e efetuei as alterações na spell, o jeito foi efetuar um loop com frequência de 15 milissegundos executando a function de virar o bendito para o sul, dessa forma funcionou perfeitamente, sendo essa spell com castTime de 6 segundos, esse evento ocorrerá 400x kkkk, mas por hora essa solução está muito boa. function onCastSpell(cid, var) local confLookDir = { frequency = 15, i = 1, timeTotal = 0 } while confLookDir.timeTotal <= conf.stunTime do addEvent(function() if isCreature(cid) then doCreatureSetLookDir(cid, SOUTH) end end, (confLookDir.frequency * confLookDir.i)) confLookDir.i = confLookDir.i + 1 confLookDir.timeTotal = confLookDir.frequency * confLookDir.i end setInitCast(cid) . . . return doCombat(cid, combat, var) end Agradeço a você Vodkart pela prestatividade e me mostrar o caminho, te desejo sucesso meu amigo. Vlw.
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.