Ir para conteúdo
  • 0

Condição de Ataque


Folspa

Pergunta

Posts Recomendados

  • 0

Nunca mexi com onCombat, então não tenho certeza se dessa maneira irá funcionar.

data/creaturescripts/scripts, crie um arquivo com extensão .lua, nomeie-o monsterattack, e coloque o seguinte conteúdo:

function onCombat(cid, target)
 
local pos = {x = xxx, y = yyy, z = zzz}    --Posição que o player terá que estar.
local name = "nome"                        --Nome do monstro.
 
    if isPlayer(cid) and getCreatureName(target) == name then
        if getThingPos(cid) ~= pos then
            doPlayerSendCancel(cid, "Você não pode atacar esse monstro na posição que se encontra...")
            return false
        end
    end
    return true
end
Adicione isso em login.lua:
registerCreatureEvent(cid, "AttackPos")
Tag:
<event type="combat" name="AttackPos" event="script" value="monsterattack.lua" />
Editado por zipter98
Link para o comentário
Compartilhar em outros sites

  • 0

zipter98, O único problema que vejo, é que monstros com nomes iguais não poderiam ser atacados, e também desse modo só um player vai poder atacar o monstro, a menos que fiquem em stack...

 

Folspa, Recomendo criar um script startUp para fazer o respow desse monstro, e nele setar um storage, ai dentro do script do zipter98, você bota um check storage no target para que possa atacar monstros com o mesmo nome...

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

  • 0

Não está a funcionar. Como são três monstros diferentes, apenas troquei o nome e a pos, porém o primeiro monstro o jogador não ataca, aparece "Sorry, not possible." e nos outros dois ele ataca de qualquer lugar.

Link para o comentário
Compartilhar em outros sites

  • 0


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 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 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


<event type="combat" name="AttackPos" event="script" value="trainer_easy.lua"/>

<event type="combat" name="AttackPos" event="script" value="trainer_medium.lua"/>

<event type="combat" name="AttackPos" event="script" value="trainer_hard.lua"/>


registerCreatureEvent(cid, "AttackPos")

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

  • 0

Dessa vez eu testei. Após sair da posição configurada, o target irá continuar, porém o jogador não dará dano ao monstro.

data/creaturescripts/scripts, cantattack.lua

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
Tag:
<event type="combat" name="AttackPos" event="script" value="cantattack.lua"/>
Login:
registerCreatureEvent(cid, "AttackPos")
cantattacktwo.lua, ainda em data/creaturescripts/scripts
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
Tag:
<event type="target" name="AttackPosTwo" event="script" value="cantattacktwo.lua"/>
Login:
registerCreatureEvent(cid, "AttackPosTwo")

OBS: Teste, primeiramente, com apenas 1 posição, e não com duas numa tabela (como você postou em outro tópico).

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

  • 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"/>
Editado por zipter98
Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...