Ir para conteúdo
  • 0

Condição de Ataque


Folspa

Pergunta

Posts Recomendados

  • 0

 

O motivo, é porque um é onCombat (para enviar o cancel caso o jogador tente usar uma spell em área), e o outro é onTarget (como o próprio nome sugere, enviar um cancel caso o jogador tente targetar o monstro).

E sobre sua outra pergunta, que eu saiba, não (a outra pergunta que me refiro, é a terceira). Como os dois scripts são distintos em relação à função main, deve-se criar para cada uma tag diferente, e, consequentemente, um registro diferente no login.lua. E, também, mesmo ambos os scripts só tendo como diferença, por exemplo, o nome do monstro, será necessário registrar uma tag diferente, tanto em creaturescripts.xml quando em login.lua.

 

Ou, você pode criar um único arquivo .lua com 3 funções dentro (login, combat e target). Por exemplo,

 

 

function onCombat(cid, target)
 
local pos = {x = 1056, y = 1056, z = 7}    --Posição que o player terá que estar.
local name = "nome"                        --Nome do monstro.
 
    if isPlayer(cid) then
        if getCreatureName(target) == name then
            if getThingPos(cid).x ~= pos.x or getThingPos(cid).y ~= pos.y or getThingPos(cid).z ~= pos.z then
                doPlayerSendCancel(cid, "Você não pode atacar na posição que se encontra!")
                return false
            end
        end
    end
    return true
end
 
function onTarget(cid, target)
 
local pos = {x = 1056, y = 1056, z = 7}    --Posição que o player terá que estar.
local name = "nome"                        --Nome do monstro.
 
    if isPlayer(cid) then
        if getCreatureName(target) == name then
            if getThingPos(cid).x ~= pos.x or getThingPos(cid).y ~= pos.y or getThingPos(cid).z ~= pos.z then
                doPlayerSendCancel(cid, "Você não pode atacar na posição que se encontra!")
                return false
            end
        end
    end
    return true
end
 
function onLogin(cid)
 
    registerCreatureEvent(cid, "AttackPos")            
    registerCreatureEvent(cid, "AttackPosTwo")
    return true
end

 

 

 

Aí depois, bastaria registrar as três tags no creaturescripts.xml. (já que o registro do login.lua, já foi feito dentro do arquivo, na função onLogin.)
<event type="target" name="AttackPos" event="script" value="cantattack.lua"/>
    <event type="combat" name="AttackPosTwo" event="script" value="cantattack.lua"/>
    <event type="login" name="AttackPosLogin" event="script" value="cantattack.lua"/>

 

Você não entendeu, como são três monstros diferentes, sugeri colocar os três em um arquivo só, algo como isso:

function onCombat(cid, target)
 
local pos = {
	[1] = {x = 35, y = 66, z = 7},
	[2] = {x = 36, y = 66, z = 7},
}
local name = "Easy"
 
    if isPlayer(cid) and getCreatureName(target) == name then
        if getThingPos(cid) ~= pos then
            doPlayerSendCancel(cid, "You must be in the mark to attack!")
            return false
        end
    end
    return true
end
function onTarget(cid, target)
 
local pos = {
    [1] = {x = 35, y = 66, z = 7},
    [2] = {x = 36, y = 66, z = 7},
}
local name = "Easy"
 
    if isPlayer(cid) then
        if getCreatureName(target) == name then
            if getThingPos(cid).x ~= pos.x or getThingPos(cid).y ~= pos.y or getThingPos(cid).z ~= pos.z then
                doPlayerSendCancel(cid, "You must be in the mark to attack!")
                return false
            end
        end
    end
    return true
end


function onCombat(cid, target)

local pos = {
        [1] = {x = 33, y = 68, z = 7},
        [2] = {x = 34, y = 68, z = 7},
}
local name = "Medium"

    if isPlayer(cid) and getCreatureName(target) == name then
        if getThingPos(cid) ~= pos then
            doPlayerSendCancel(cid, "You must be in the mark to attack!")
            return false
        end
    end
    return true
end
function onTarget(cid, target)

local pos = {
[1] = {x = 33, y = 68, z = 7},
[2] = {x = 34, y = 68, z = 7},
}
local name = "Medium"
 
    if isPlayer(cid) then
        if getCreatureName(target) == name then
            if getThingPos(cid).x ~= pos.x or getThingPos(cid).y ~= pos.y or getThingPos(cid).z ~= pos.z then
                doPlayerSendCancel(cid, "You must be in the mark to attack!")
                return false
            end
        end
    end
    return true
end


function onCombat(cid, target)
 
local pos = {
	[1] = {x = 31, y = 70, z = 7},
	[2] = {x = 32, y = 70, z = 7},
}
local name = "Hard"
 
    if isPlayer(cid) and getCreatureName(target) == name then
        if getThingPos(cid) ~= pos then
            doPlayerSendCancel(cid, "You must be in the mark to attack!")
            return false
        end
    end
    return true
end
function onTarget(cid, target)

local pos = {
    [1] = {x = 31, y = 70, z = 7},
    [2] = {x = 32, y = 70, z = 7},
}
local name = "Hard"
 
    if isPlayer(cid) then
        if getCreatureName(target) == name then
            if getThingPos(cid).x ~= pos.x or getThingPos(cid).y ~= pos.y or getThingPos(cid).z ~= pos.z then
                doPlayerSendCancel(cid, "You must be in the mark to attack!")
                return false
            end
        end
    end
    return true
end


function onLogin(cid)
 
    registerCreatureEvent(cid, "AttackPos")            
    registerCreatureEvent(cid, "AttackPosTwo")
    return true
end
<event type="target" name="AttackPos" event="script" value="cantattack.lua"/>
<event type="combat" name="AttackPosTwo" event="script" value="cantattack.lua"/>
<event type="login" name="AttackPosLogin" event="script" value="cantattack.lua"/>
Link para o comentário
Compartilhar em outros sites

  • 0

Eu ACHO que isso não é possível (juntar 'tudo' num só arquivo). Porém, mesmo assim, irei testar aqui, e logo edito o comentário.

 

EDIT: Dessa maneira, o script só verificou um dos monstros.

Editado por zipter98
Link para o comentário
Compartilhar em outros sites

  • 0

 

 

function onCombat(cid, target)
 
local posis_name = {
    ["nome"] = {x = 1056, y = 1056, z = 7},
    ["nome1"] = {x = 1057, y = 1056, z = 7},
    ["nome2"] = {x = 1058, y = 1056, z = 7},
}
 
local name = posis_name[getCreatureName(target)]
 
    if isPlayer(cid) then
        if name then
            if getThingPos(cid).x ~= name.x or getThingPos(cid).y ~= name.y or getThingPos(cid).z ~= name.z then
                doPlayerSendCancel(cid, "Você não pode atacar na posição que se encontra!")
                return false
            end
        end
    end
    return true
end
 
function onTarget(cid, target)
 
local posis_name = {
    ["nome"] = {x = 1056, y = 1056, z = 7},
    ["nome1"] = {x = 1057, y = 1056, z = 7},
    ["nome2"] = {x = 1058, y = 1056, z = 7},
}
 
local name = posis_name[getCreatureName(target)]
 
    if isPlayer(cid) then
        if name then
            if getThingPos(cid).x ~= name.x or getThingPos(cid).y ~= name.y or getThingPos(cid).z ~= name.z then
                doPlayerSendCancel(cid, "Você não pode atacar na posição que se encontra!")
                return false
            end
        end
    end
    return true
end
 
function onLogin(cid)
 
    registerCreatureEvent(cid, "AttackPos")            
    registerCreatureEvent(cid, "AttackPosTwo")
    return true
end

Link para o comentário
Compartilhar em outros sites

  • 0

Acho que pra junta tudo eh so fazer uma tabela com um loop, tenta assim:


local tabela = {
   {nome = "Demon", pos = {{x = 1056, y = 1056, z = 7},{x = 1056, y = 1057, z = 7}}}, 
   {nome = "Rat", pos = {{x = 1056, y = 1056, z = 7},{x = 1056, y = 1057, z = 7},{x = 1056, y = 1057, z = 7}}},
   {nome = "Hydra", pos = {{x = 1056, y = 1056, z = 7},{x = 1056, y = 1057, z = 7}}}
}

function onTarget(cid, target)

    for _, a in pairs(tabela) do
        if isPlayer(cid) then
            local namo = getCreatureName(target)
            if namo == a.nome and not isInArray({a.pos}, getCreaturePosition(cid)) then
            doPlayerSendCancel(cid, "Você não pode atacar na posição que se encontra!")
            return false
        end
    end
end
return true
end

function onAttack(cid, target)
    if isPlayer(cid) and isInArray({tabela.nome}, getCreatureName(target)) then
    doPlayerSetStorageValue(cid, 34343, 1)
    mayNotMove(cid, true)
end
return true
end

function onKill(cid, target, lastHit)
    if isPlayer(cid) and isInArray({tabela.nome}, getCreatureName(target)) then
    doPlayerSetStorageValue(cid, 34343, 0)
    mayNotMove(cid, false)
end
return true
end

function onPrepareDeath(cid, deathList)
    if isPlayer(cid) and getPlayerStorageValue(cid, 34343) == 1 then
    doPlayerSetStorageValue(cid, 34343, 0)
    mayNotMove(cid, false)
end 
return true
end

function onLogin(cid)
    registerCreatureEvent(cid, "PosAttack1")
    registerCreatureEvent(cid, "PosAttack2")
    registerCreatureEvent(cid, "PosAttack3")
    registerCreatureEvent(cid, "PosAttack4")
    return true
end

tags:



<event type="target" name="PosAttack1" event="script" value="cantattack.lua"/>
<event type="attack" name="PosAttack2 event="script" value="cantattack.lua"/>
<event type="login" name="PosAttack3" event="script" value="cantattack.lua"/>
<event type="PrepareDeath" name="PosAttack4" event="script" value="cantattack.lua"/>
Editado por amoeba13
Link para o comentário
Compartilhar em outros sites

  • 0

recomendo forte mente que use um script com onStatsChange, onCombat so evita attacks diretos da arma,AoE's e spell vão continuar a ferir o mostro, e qualquer outro attack da arma que n seja diretamente focado nele(tipo explosão da explosive arrow)

 

em creaturescript/script

posToAttack.lua

 

local mosters = {
                         ["name1"] = {x = xxxx, y = yyy}, -- nome e posição do moster,pos.z é disnessesario.
                         ["name2"] = {x = xxxx, y = yyy}, -- nome e posição do moster
                         ["name3"] = {x = xxxx, y = yyy} -- nome e posição do moster
                         }
function onStatsChange(cid,attacker)
 
  if not isCreature(attacker) then return false end -- caso seja dano do cenario(fire no chão),DoT's de players que fizeran logout ou morreran.
 
  if cid == attacker then return true end -- caso seja o heal do proprio mostro
 
  local pos = getCreaturePos(attacker)
  local nPos = mosters[getCreatureName(cid)]
 
  if not nPos then return print("a creatura "..getCreatureName(cid).." não esta na tabela mosters do script data/creaturescripts/scripts/posToAttack.lua") end -- caso o moster n seja achado na tabela,o moster podera ser attackdo normalmente nesse caso,mas ira mandar prints avisando que desse fato.
 
  if pos.x = nPos.x and pos.y = nPos.y then
    return true
 else
    return false
 end
end

em creaturescript.xml

 

<event type="statschange" name="posToAttack" event="script" value="posToAttack.lua"/>

 

na xml do moster

 

<script>
<event name="posToAttack"/>
</script>

antes do "</monster>"

caso já haja a tag <script> </script> so coloque dentro dela o event

 

n testei,mas deve funcionar

Link para o comentário
Compartilhar em outros sites

  • 0

testei um onCombat aqui, spell diretas não acertão, summons não conseguen attackar mesmo estando target no mostro, mas AoE continuan atingindo.

as veses é versão do server...

testei no TFS 0.3.6

Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...