Ir para conteúdo

Pergunta

Preciso de um script, um monstro que só pode ser atacado se o jogador estiver em x posição, caso ele não estiver, aparecer uma mensagem falando que ele não pode atacar de onde está.

Link para o comentário
https://xtibia.com/forum/topic/224901-condi%C3%A7%C3%A3o-de-ataque/
Compartilhar em outros sites

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
https://xtibia.com/forum/topic/224901-condi%C3%A7%C3%A3o-de-ataque/#findComment-1588383
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
https://xtibia.com/forum/topic/224901-condi%C3%A7%C3%A3o-de-ataque/#findComment-1588386
Compartilhar em outros sites

  • 0

Está bom assim, apenas um player deve atacar um monstro. Só uma dúvida, se o player sair da posição que pode atacar, ele vai continuar a atacar?

Link para o comentário
https://xtibia.com/forum/topic/224901-condi%C3%A7%C3%A3o-de-ataque/#findComment-1588392
Compartilhar em outros sites

  • 0

Ah, mais uma coisa, o jogador não pode ser empurrado, quer dizer, outros jogadores não devem conseguir empurrar o jogador que estiver na posição.

Editado por Folspa
Link para o comentário
https://xtibia.com/forum/topic/224901-condi%C3%A7%C3%A3o-de-ataque/#findComment-1588406
Compartilhar em outros sites

  • 0

Protect Zone? Não dá, se eu colocar, ele não vai poder atacar, se eu colocar em volta, ele vai poder ser empurrado, ele pode ser empurrado para dentro, mas não para fora, acho.

Link para o comentário
https://xtibia.com/forum/topic/224901-condi%C3%A7%C3%A3o-de-ataque/#findComment-1588436
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
https://xtibia.com/forum/topic/224901-condi%C3%A7%C3%A3o-de-ataque/#findComment-1588474
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
https://xtibia.com/forum/topic/224901-condi%C3%A7%C3%A3o-de-ataque/#findComment-1588481
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
https://xtibia.com/forum/topic/224901-condi%C3%A7%C3%A3o-de-ataque/#findComment-1588722
Compartilhar em outros sites

  • 0

Mas qual o motivo de ter 2 scripts? Não tem como apenas duplicar os scripts e mudar as posições/nomes?

 

Quer dizer, não posso registrar no login.lua apenas 1 para 2 scripts diferentes?

Link para o comentário
https://xtibia.com/forum/topic/224901-condi%C3%A7%C3%A3o-de-ataque/#findComment-1588729
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
https://xtibia.com/forum/topic/224901-condi%C3%A7%C3%A3o-de-ataque/#findComment-1588737
Compartilhar em outros sites

×
×
  • Criar Novo...