Ir para conteúdo
  • Cadastre-se

(Resolvido)[PEDIDO]Função onAttack e onCombat


Ir para solução Resolvido por xWhiteWolf,

Posts Recomendados

Fiz esse script que quando o player ataca um monstro, sai um efeito no player e preciso que quando, por exemplo, um knight  que está olhando para cima e quando ele ataca um bixo atras ou de um lado ou do outro ele automaticamente vira para onde o bixo está.. Mas esse script que fiz tem um problema, por exemplo, eu sou knight e quando eu pego o target ele já solta o efeito a uma distancia de varios sqms, e seria ideal que só quando atacasse grudado com distancia de 1 sqm ou só quando saísse o melee (ataque físico) saísse o efeito e ele virasse..

function onAttack(cid, var)if getPlayerVocation(cid) == 1 then
doSendMagicEffect(getPlayerPosition(cid), 10)
end
return true
end

Umas variáveis assim seriam legais, eu n sei coloca-las:
 

        \/ uma suposição
if meleeAttack(cid, vocation, melee ehxaust, sqms) then
doSendMagicEffect(getPlayerPosition(cid), 10)
elseif ...dai vem a parte da variável de virar o player pro lado que atacou o monstro...
end
end
return true
end

E nas outras a mesma coisa, n sei se da certo de ficar tudo dentro do mesmo script, acho que não..

 
 
As possíveis variáveis de distanceAttack

          \/ uma suposição


if distanceAttack(cid, vocation, distance ehxaust, sqms) then
doSendMagicEffect(getPlayerPosition(cid), 10)
elseif ...dai vem a parte da variável de virar o player pro lado que atacou o monstro...
end
end
return true
end


As possíveis variáveis de magicSkill

          \/ uma suposição


if magicSkill(cid, vocation, skill ehxaust, sqms) then
doSendMagicEffect(getPlayerPosition(cid), 10)
elseif ...dai vem a parte da variável de virar o player pro lado que atacou o monstro...
end
end
return true
end



A função onAttack e onCombat funcionam mesmo só de atacar e mesmo só de soltar uma magia.. Eu n entendo muito bem ainda de mexer nessas variaveis, mas se existisse uma função onMelee ou onSpell, seria legal pra uma biblioteca(LIB).

Editado por aq snuff (veja o histórico de edições)
Link para o post
Compartilhar em outros sites

Tente assim: vá em data/creaturescripts/target crie um arquivo chamado target  cole isso:

local effect = 30 -- id do magic effect

function onAttack(cid, target)

    if meleeAttack(cid, vocation, melee ehxaust, sqms) then
    if isCreature(cid) and isCreature(target) then
        dir = getDirectionTo(getCreaturePosition(cid), getCreaturePosition(target))

        doSendMagicEffect(getCreaturePosition(cid), effect)
        doCreatureSetLookDirection(cid, dir)
    end
return true
end

agóra em creaturescripts.xml

<event type="attack" name="targetCreature" script="target.lua"/>

adiciona éssa linha em login.lua:

registerCreatureEvent(cid, "targetCreature")    

OBS: apenas peguei o script do @xWhiteWolf e editei, mas não testei.

Editado por Dieguiin XP (veja o histórico de edições)

Att,
Dieguiin XP

 

»»http://baiakfull.com/««

Link para o post
Compartilhar em outros sites

Testarei. Eu uso tfs 036 8.54 
1º erro:

242z8ec.jpg


 


Consegui fazer funcionar com esse script "crú" para testar mas o player vira só quando estiver na reta, se eu tiver em qualquer  diagonal, o player n vira.. E falta também as váriaveis de distancia, pq quando eu ataco de longe ele já muda de outfit, inves de ser soh no ataque na mão(melee) de distancia 1(sqm)
function onAttack(cid, target)
    if isCreature(cid) and isCreature(target) then
        dir = getDirectionTo(getCreaturePosition(cid), getCreaturePosition(target))
        doCreatureSetLookDirection(cid, dir)
    end
return true
end

Editado por aq snuff (veja o histórico de edições)
Link para o post
Compartilhar em outros sites

não tem como virar na diagonal champz, o dieguin esqueceu do then na terceira linha e if melee não existe, o certo seria getDistanceBetween(firstPosition, secondPosition) entre as posições do cid e do target > ou < que alguma coisa.

Todos os meus trabalhos importantes estão na seção "Sobre mim" no meu perfil; Dá uma passada lá!

"Há três caminhos para o fracasso: não ensinar o que se sabe, não praticar o que se ensina, e não perguntar o que se ignora." - São Beda

I7Pm6ih.png

(obg ao @Beeny por fazer essa linda sign <3)

Link para o post
Compartilhar em outros sites

Eu sei que n da pra virar na diagonal vou dar um exemplo:

x2m04p.jpg

 

E como que ficaria esse getDistanceBetween(firstPosition, secondPosition) entre as posições do cid e do target? Com as variaveis editaveis de sqm e vocation e ehxaust?

 

function getDistanceBetween(fromPosition, toPosition)

local x, y = math.abs(fromPosition.x - toPosition.x), math.abs(fromPosition.y - toPosition.y)
local diff = math.max(x, y)
if(fromPosition.z ~= toPosition.z) then
diff = diff + 9 + 6
end
/\ n entendo como usar essa tabela..
Editado por aq snuff (veja o histórico de edições)
Link para o post
Compartilhar em outros sites
  • Solução

cara não entendi nada doque vc falou/fez, ele não vira na diagonal pq não dá e não é bug porque se vc estiver com um player normal o bixo vai se movimentar ao seu redor e fazer você virar. Quando eu falei em usar a function  getDistanceBetween(fromPosition, toPosition) não era dessa forma.

Era assim:

function onAttack(cid, target)
    if isCreature(cid) and isCreature(target) then
        dir = getDirectionTo(getCreaturePosition(cid), getCreaturePosition(target))
        doCreatureSetLookDirection(cid, dir)
if getPlayerVocation(cid) == 4 or getPlayerVocation(cid) == 8 then
    if getDistanceBetween(getCreaturePosition(cid), getCreaturePosition(target)) then
         doSendMagicEffect(getCreaturePosition(cid), 10)
    end
end
    end
return true
end

Todos os meus trabalhos importantes estão na seção "Sobre mim" no meu perfil; Dá uma passada lá!

"Há três caminhos para o fracasso: não ensinar o que se sabe, não praticar o que se ensina, e não perguntar o que se ignora." - São Beda

I7Pm6ih.png

(obg ao @Beeny por fazer essa linda sign <3)

Link para o post
Compartilhar em outros sites

ele vira de qualquer forma, a função é só pra dar o efeito, não faz sentido vc marcar um oponente pra ser atacado e continuar virado de costas. Agr sobre o outro caso eu vou dar uma olhada aqui e ver oque dá pra fazer

Todos os meus trabalhos importantes estão na seção "Sobre mim" no meu perfil; Dá uma passada lá!

"Há três caminhos para o fracasso: não ensinar o que se sabe, não praticar o que se ensina, e não perguntar o que se ignora." - São Beda

I7Pm6ih.png

(obg ao @Beeny por fazer essa linda sign <3)

Link para o post
Compartilhar em outros sites

Ok, brigado.. Acho que da pra por se o player tiver em x sqm de distancia executar o scrpit todo, se nao, soh a mensagem de not possible ou simplesmente nada(que eh melhor melhor). De qualquer forma agradeço desde já!!! 

https://www.youtube.com/watch?v=Xzo4PBkKYa8&feature=youtu.be

Fiz um video explicativo curto pra vc entender xWhiteWolf, se puder olhar é bem curto, vai explicar o que eu quis dizer..

:C

..

Editado por aq snuff (veja o histórico de edições)
Link para o post
Compartilhar em outros sites

Achei essa função e acho que daria pra fazer o que eu estava querendo.. Só n sei colocar. Alguem ajudar?

local function jumpBehindTarget(cid, target)
local player = Player(cid)
local target = Creature(target)
local targetPos = target:getPosition()
local targetPositions = {
north = Position(targetPos.x, targetPos.y-1, targetPos.z),
east = Position(targetPos.x+1, targetPos.y, targetPos.z),
west = Position(targetPos.x-1, targetPos.y, targetPos.z),
south = Position(targetPos.x, targetPos.y+1, targetPos.z)
}

local targetDir = target:getDirection()
if targetDir == NORTH then
dir = targetPositions.south
elseif targetDir == EAST then
dir = targetPositions.west
elseif targetDir == WEST then
dir = targetPositions.east
elseif targetDir == SOUTH then
dir = targetPositions.north
end
return dir
end
Editado por aq snuff (veja o histórico de edições)
Link para o post
Compartilhar em outros sites

Achei essa função e acho que daria pra fazer o que eu estava querendo.. Só n sei colocar

Adicione à lib do seu servidor:

function jumpBehindTarget(cid, target)
    local player = Player(cid)
    local target = Creature(target)
    local targetPos = target:getPosition()
    local targetPositions = {
        north = Position(targetPos.x, targetPos.y-1, targetPos.z),
        east = Position(targetPos.x+1, targetPos.y, targetPos.z),
        west = Position(targetPos.x-1, targetPos.y, targetPos.z),
        south = Position(targetPos.x, targetPos.y+1, targetPos.z)
    }

    local targetDir = target:getDirection()
    if targetDir == NORTH then
        dir = targetPositions.south
    elseif targetDir == EAST then
        dir = targetPositions.west
    elseif targetDir == WEST then
        dir = targetPositions.east
    elseif targetDir == SOUTH then
        dir = targetPositions.north
    end
    return dir
end

 

Creature event attack:

function onAttack(cid, target)
    local vocs = {4, 8}
    if isCreature(cid) and isCreature(target) and isInArray(vocs, getPlayerVocation(cid)) then
        jumpBehindTarget(cid, target)
    end
    return true
end

não se esqueça de registrá-lo em login.lua

The corrupt fear us.

The honest support us.

The heroic join us.

Link para o post
Compartilhar em outros sites

n funcionou pq eu preciso de um setDirection(target:getDirection()) na função também...

Acho que a função do tibia lookAtPlayer pode ser util, quando fala hi o npc vira pra vc... 
 

Mas queria ver se dava pra adaptar pra que quando o player atacasse o bixo que está acima e direita o player virasse pra cima ou para direita, e assim nas demais directions.. Tipo:

if target == NORTHWEST then

dir = targetPositions.WEST or NORTH
 

if target == SOUTHEAST then

dir = targetPositions.EAST or SOUTH

 

O script q peguei eh esse:(Visualize só a parte de directions) 

function isWalkable(cid, pos)
local tile = Tile(pos)
if not tile then
return false
end

if tile:queryAdd(cid) == 1 and not tile:hasFlag(TILESTATE_PROTECTIONZONE) then
return true
end
return false
end

local function jumpBehindTarget(cid, target)
local player = Player(cid)
local target = Creature(target)
local targetPos = target:getPosition()
local targetPositions = {
north = Position(targetPos.x, targetPos.y-1, targetPos.z),
east = Position(targetPos.x+1, targetPos.y, targetPos.z),
west = Position(targetPos.x-1, targetPos.y, targetPos.z),
south = Position(targetPos.x, targetPos.y+1, targetPos.z)
}

local targetDir = target:getDirection()
if targetDir == NORTH then
dir = targetPositions.south
elseif targetDir == EAST then
dir = targetPositions.west
elseif targetDir == WEST then
dir = targetPositions.east
elseif targetDir == SOUTH then
dir = targetPositions.north
end
return dir
end

local function oldPos(cid, oldPos)
local player = Player(cid)
if not player then
return
end

player:teleportTo(oldPos)
end

local function checkHasTarget(cid, count, oldPos)
local player = Player(cid)
if not player then
return
end

if count < 1 then
player:setGhostMode(false)
return
end

local target = player:getTarget()
if target then
local behindTarget = jumpBehindTarget(cid, target:getId())
if isWalkable(cid, behindTarget) then
player:teleportTo(behindTarget)
else
player:teleportTo(target:getPosition())
addEvent(backOldPos, 100, cid, oldPos)
end
player:setDirection(target:getDirection())
player:setGhostMode(false)
doTargetCombatHealth(cid, target, COMBAT_PHYSICALDAMAGE, -20, -100, CONST_ME_FIREATTACK)
return true
end
addEvent(checkHasTarget, 1 * 100, cid, count - 1)
end

function onCastSpell(creature, var)
local playerPos = creature:getPosition()

creature:setGhostMode(true)
playerPos:sendMagicEffect(CONST_ME_POFF)
addEvent(checkHasTarget, 1 * 250, creature:getId(), 50, playerPos)
return false
end
Editado por aq snuff (veja o histórico de edições)
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