Ir para conteúdo
  • Cadastre-se

[Spell] Como fazer monstro perde o target durante o cast


Ir para solução Resolvido por Vodkart,

Posts Recomendados

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.

 

boss1.gif

Link para o post
Compartilhar em outros sites
  • 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

 

vodkart_logo.png

[*Ninguém será digno do sucesso se não usar suas derrotas para conquistá-lo.*]

 

DISCORDvodkart#6090

 

Link para o post
Compartilhar em outros sites
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 😄

Link para o post
Compartilhar em outros sites

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.

Link para o post
Compartilhar em outros sites

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.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo