Jump to content

Recommended Posts

Bom galera aí vai minha duvida:

Utilizo atualmente um TFS 0.4 e implantei o AUTO LOOT recentemente.
Fiz diversas modificações e agora esse sistema me atende.

Porem, há um problema - Ele assim como outros do mercado, trabalha com essa função onDeath:
 

Citar

function onDeath(cid, corpse, deathList)
local killer,pos = deathList[1],getCreaturePosition(cid)
addEvent(loot,1,killer,pos)
return true
end


Isso faz com que o jogador a dar o ultimo hit na criatura fique com o loot da lista, mesmo que nao seja o "dono do corpo morto" ou corpseOwner.


Obviamente nem preciso dizer que isso esta errado e vai gerar muitos problemas no meu servidor.

A questao é: existe alguma função no TFS 0.4 que verifica o dono do corpo morto para eu implantar uma regra nessa função? Ou entao que diga o jogador que deu mais dano e apenas ele possa "lootear"?!

Aguardo amigos.

@WooX

Link to post
Share on other sites

@Guizek69 do mesmo jeito q existe a função do cara não poder abrir o corpo de um bixo q ele n matou vc deve poder implementar isso no script tb, eu lembro q tinha visto aqui no tibiaking um post de um cara ensinando como ver todas as funcoes do seu tfs, mas enfim, provavelmente nas suas sources deve ter algo relacionado a owner, vc vai ter q transformar isso em função lua (caso já não exista) e dai adicionar no seu script, tipo um if not isOwner(cid) then return false end

Link to post
Share on other sites

Na source, a função em actions.cpp é essa:
 

Citar

Line 523:         if(container->getCorpseOwner() && !player->canOpenCorpse(container->getCorpseOwner())
    Line 523:         if(container->getCorpseOwner() && !player->canOpenCorpse(container->getCorpseOwner())
    Line 524:             && g_config.getBool(ConfigManager::CHECK_CORPSE_OWNER))
    Line 525:             return RET_YOUARENOTTHEOWNER;
    Line 599:         creatureId) || action->hasOwnErrorHandler());

Encontrei uma função lua para TFS 1.2 feita pelo @luanluciano93:
 

Citar

local corpse = Tile(target:getPosition()):getTopDownItem()
    if not corpse or not corpse:isContainer() then
        return false
    end

    if corpse:getType():isCorpse() and corpse:getAttribute(ITEM_ATTRIBUTE_CORPSEOWNER) == player:getId() then
		return true
    end

Vou tentar converter para TFS 0.4.
Se alguem puder ajudar, eu agradeço.

Link to post
Share on other sites

@Guizek69 n sei nada de tfs 1.x mas acho que eh convertível sim, vc provavelmente já tentou mas ainda assim vale apontar, tenta colocar esse getCorpseOwner() no seu script e ve se resolve

Link to post
Share on other sites

Se você quer trabalhar somente com o player que pegou o loot você pode utilizar a função da seguinte forma:
function onDeath(cid, corpse, lastHitKiller, mostDamageKiller)
local killer = lastHitKiller[1] --- a atribuição em uma variável do player que pegou o frag é totalmente opcional.

Dai caso queira realizar alguma ação em cima desse player pode fazer da seguinte forma:
if isPlayer(killer) then --- Não lembro ao certo se tem monstros entram na lista (lastHitKiller) então só por precaução eu recomendaria fazer uma checagem se quem fragou é 1 player.
doPlayerAddItem(killer, 13981, 1)
end

Link to post
Share on other sites

1 hora atrás, Tottin disse:

Se você quer trabalhar somente com o player que pegou o loot você pode utilizar a função da seguinte forma:
function onDeath(cid, corpse, lastHitKiller, mostDamageKiller)
local killer = lastHitKiller[1] --- a atribuição em uma variável do player que pegou o frag é totalmente opcional.

Dai caso queira realizar alguma ação em cima desse player pode fazer da seguinte forma:
if isPlayer(killer) then --- Não lembro ao certo se tem monstros entram na lista (lastHitKiller) então só por precaução eu recomendaria fazer uma checagem se quem fragou é 1 player.
doPlayerAddItem(killer, 13981, 1)
end

O problema é exatamente esse. O auto loot nao avalia todos os jogadores que participaram no combate para x criatura.
Ele determina que o loot é de quem deu o ultimo hit e acabou.

Se EU der 99% do dano em um dl e alguem der hit kill e dropar dsm: EU fico como dono do corpo, mas o a dsm é retirada automaticamente pelo sistema e concedida ao jogador do "ks".

Por isso preciso de uma função que determine se sou ou nao o dono do corpo ou se sou ou nao quem deu mais dano para dai proceder com todo o resto.

Link to post
Share on other sites

Meu querido, eu acabei de te mandar exatamente isso, ele vai enviar o loot pra quem fragou o monstro. Se o jogo te reconheceu como "dono do loot" então o loot vai ser enviado pra você, Vou ser gente boa e vou montar a função pra tu. Isso possivelmente vai resolver o seu problema, se não funcionar, então seu servidor reconhece o "dono do loot" de outra forma. Seria interessante descobrir qual.

function onDeath(cid, corpse, lastHitKiller, mostDamageKiller)

local killer = lastHitKiller[1]
pos = getCreaturePosition(cid)
addEvent(loot,1,killer,pos)
return true
end

Link to post
Share on other sites

4 minutos atrás, Tottin disse:

Meu querido, eu acabei de te mandar exatamente isso, ele vai enviar o loot pra quem fragou o monstro. Se o jogo te reconheceu como "dono do loot" então o loot vai ser enviado pra você, Vou ser gente boa e vou montar a função pra tu. Isso possivelmente vai resolver o seu problema, se não funcionar, então seu servidor reconhece o "dono do loot" de outra forma. Seria interessante descobrir qual.

function onDeath(cid, corpse, lastHitKiller, mostDamageKiller)

local killer = lastHitKiller[1]
pos = getCreaturePosition(cid)
addEvent(loot,1,killer,pos)
return true
end

O corpseOwner para criaturas é sempre quem deu mais dano em tal, nao quem deu o hit final.
Acho que esta confundindo com o frag player system.
 

Link to post
Share on other sites

7 horas atrás, Guizek69 disse:

existe alguma função no TFS 0.4 que verifica o dono do corpo morto para eu implantar uma regra nessa função?

A resposta é não, pelo menos não uma função Lua.

 

4 horas atrás, Guizek69 disse:

Encontrei uma função lua para TFS 1.2 feita pelo @luanluciano93:
 

Citar


local corpse = Tile(target:getPosition()):getTopDownItem()
    if not corpse or not corpse:isContainer() then
        return false
    end

    if corpse:getType():isCorpse() and corpse:getAttribute(ITEM_ATTRIBUTE_CORPSEOWNER) == player:getId() then
		return true
    end

Vou tentar converter para TFS 0.4.
Se alguem puder ajudar, eu agradeço.

Tenta buscar pelo atributo "corpseowner" com a função getItemAttribute, pode ser que funcione.

 

2 horas atrás, Tottin disse:

function onDeath(cid, corpse, lastHitKiller, mostDamageKiller)

Eu não me recordo da existência dos parâmetros lastHitKiller e mostDamageKiller, pelo menos não no TFS 0.4. Mas se o callback realmente retornar estes valores, a solução pro problema ta ai, só utilizar o mostDamageKiller que vai retornar quem deu mais dano.

 

Edit: me lembrei que um conhecido estava passando por este mesmo problema a algum tempo atrás, eu cheguei a postar a solução que ele encontrou em outro tópico, pode dar uma olhada.

 

 

Edited by WooX (see edit history)

 

 

 

Nós somos aquilo que fazemos repetidamente. Excelência, não é um modo de agir, mas um hábito.

                                                                                                                                                                                                                                        Aristóteles 

Link to post
Share on other sites

Em 19/07/2020 em 19:45, WooX disse:

A resposta é não, pelo menos não uma função Lua.

 

Tenta buscar pelo atributo "corpseowner" com a função getItemAttribute, pode ser que funcione.

 

Eu não me recordo da existência dos parâmetros lastHitKiller e mostDamageKiller, pelo menos não no TFS 0.4. Mas se o callback realmente retornar estes valores, a solução pro problema ta ai, só utilizar o mostDamageKiller que vai retornar quem deu mais dano.

 

Edit: me lembrei que um conhecido estava passando por este mesmo problema a algum tempo atrás, eu cheguei a postar a solução que ele encontrou em outro tópico, pode dar uma olhada.

 

 

A solução foi MUITO mais simples do que eu pensei, agradeço a ajuda de todos vocês, vocês são fod@!!

Segue enredo:

A função onDeath tem duas matrizes: lastHitKiller e mostDamageKiller.

Quando voce usa deathList[1] aplica-se a matriz lastHitKiller, o jogador que causou o hit kill.
Quando voce usa deathList[2] aplica-se a matriz mostDamageKiller ou seja, o maior causador de dano.

Na onPrepareDeath, mesma regra etc..

Citar

function onPrepareDeath(cid, deathList)
	lastHitKiller = deathList[1]
	mostDamageKiller = deathList[2]

Logo minha função ficou assim:
 

Citar

function onDeath(cid, corpse, deathList)

local killer1 = deathList[1]
local killer2 = deathList[2]
local pos = getCreaturePosition(cid)

if killer2 == nil then
addEvent(corpseRetireItems,1,killer1,pos)
else
addEvent(corpseRetireItems,1,killer2,pos)
end
return true
end

Vale a pena lembrar que voce deve criar verificaçoes basicas como if isPlayer(cid) and isMonster(target).
No meu caso, nao foi necessario porque a verificação é feita num evento "combat" e ele joga os players determinado para o onDeath.

RESOLVIDO.
 

Edited by Guizek69
info (see edit history)
Link to post
Share on other sites

Era mais facil fazer uma tabela que não executasse nesse tipo de boss...

 

BlockMonsters = {"Demon","Hydra"} -- nome dos mobs
	if isMonster(cid) and not isInArray(BlockMonsters, getCreatureName(cid)) then
		-- sua função do autoLoot
	end

 

vodkart_logo.png

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

 

Dota System 8.6 Com Buffs Automáticos + MAPA (100%) - PVP

Link para Downloadhttps://www.4shared.com/rar/SMta8CQ8fi/Dota_Venda.html?

 

[+]--------------------------------------[+]-------------------------------------------[+]

 

DISCORDvodkart#6090

 

Link to post
Share on other sites

Mas se o evento onDeath só ativa em monstros cujo tiveram a tag da script registrada (me corrija se eu estiver errado), não seria 1 tanto quanto desnecessário adicionar uma checagem pra ver se o monstro morto deve ou não ativar a script de autoloot, sendo que bastaria não registrar a tag nos monstros que você não quer que ative a script. Claro que a situação mudaria se a função fosse de onKill.

Link to post
Share on other sites

22 minutos atrás, Vodkart disse:

Era mais facil fazer uma tabela que não executasse nesse tipo de boss...

 


BlockMonsters = {"Demon","Hydra"} -- nome dos mobs
	if isMonster(cid) and not isInArray(BlockMonsters, getCreatureName(cid)) then
		-- sua função do autoLoot
	end

 

Olá grande mestre!
Perdoe-me minha ignorancia, mas nao entendi bem sua colocação.

Meu problema não está relacionado a criatura x ou y e sim ao fato do lastHitKiller ficar com o loot da tabela mesmo se desse apenas 1 de dano em determinada criatura.
Sendo assim, ele não seria o dono do corpo morto mas ficaria com o loot "rare" de outro consequentemente.
Isso é resolvido buscando a matriz deathList[2] no onDeath - que certifica de dar o loot ao jogador certo ( o que deu mais dano ).

Ficou 100% perfeito agora.

7 minutos atrás, Tottin disse:

Mas se o evento onDeath só ativa em monstros cujo tiveram a tag da script registrada (me corrija se eu estiver errado), não seria 1 tanto quanto desnecessário adicionar uma checagem pra ver se o monstro morto deve ou não ativar a script de autoloot, sendo que bastaria não registrar a tag nos monstros que você não quer que ative a script. Claro que a situação mudaria se a função fosse de onKill.

É o inverso amigo.

O evento ativa em todas as criaturas, exceto as que estao em block list (bosses).

Link to post
Share on other sites

@Guizek69 Ah, entendi o que quis dizer!! Desculpa amigo, abraços!

vodkart_logo.png

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

 

Dota System 8.6 Com Buffs Automáticos + MAPA (100%) - PVP

Link para Downloadhttps://www.4shared.com/rar/SMta8CQ8fi/Dota_Venda.html?

 

[+]--------------------------------------[+]-------------------------------------------[+]

 

DISCORDvodkart#6090

 

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Similar Content

    • By iTzBrHue3
      .Qual servidor ou website você utiliza como base?  OTX 2.8
       
      Qual o motivo deste tópico? Duvida
       
      Está surgindo algum erro? Se sim coloque-o aqui. 
       
      Você tem o código disponível? Se tiver publique-o aqui: 
          -- HP --
          conditionHP = createConditionObject(CONDITION_ATTRIBUTES)
          setConditionParam(conditionHP, CONDITION_PARAM_TICKS, -1)
          setConditionParam(conditionHP, CONDITION_PARAM_STAT_MAXHEALTH, n)
          setConditionParam(conditionHP, CONDITION_PARAM_BUFF, true)
          setConditionParam(conditionHP, CONDITION_PARAM_SUBID, 90)
          -- MANA --
          conditionMP = createConditionObject(CONDITION_ATTRIBUTES)
          setConditionParam(conditionMP, CONDITION_PARAM_TICKS, -1)
          setConditionParam(conditionMP, CONDITION_PARAM_STAT_MAXMANA, 9999)
          setConditionParam(conditionMP, CONDITION_PARAM_BUFF, true)
          setConditionParam(conditionMP, CONDITION_PARAM_SUBID, 91)
          -- Magic Level --
          conditionML = createConditionObject(CONDITION_ATTRIBUTES)
          setConditionParam(conditionML, CONDITION_PARAM_TICKS, -1)
          setConditionParam(conditionML, CONDITION_PARAM_STAT_MAGICLEVEL, 99)
          setConditionParam(conditionML, CONDITION_PARAM_BUFF, true)
          setConditionParam(conditionML, CONDITION_PARAM_SUBID, 92)
          -- MELEE --
          conditionMELEE = createConditionObject(CONDITION_ATTRIBUTES)
          setConditionParam(conditionMELEE, CONDITION_PARAM_TICKS, -1)
          setConditionParam(conditionMELEE, CONDITION_PARAM_SKILL_CLUB, 99)
          setConditionParam(conditionMELEE, CONDITION_PARAM_SKILL_SWORD, 99)
          setConditionParam(conditionMELEE, CONDITION_PARAM_SKILL_AXE, 99)
          setConditionParam(conditionMELEE, CONDITION_PARAM_BUFF, true)
          setConditionParam(conditionMELEE, CONDITION_PARAM_SUBID, 93)
          -- Shield --
          conditionSHI = createConditionObject(CONDITION_ATTRIBUTES)
          setConditionParam(conditionSHI, CONDITION_PARAM_TICKS, -1)
          setConditionParam(conditionSHI, CONDITION_PARAM_SKILL_SHIELD, 99)
          setConditionParam(conditionSHI, CONDITION_PARAM_BUFF, true)
          setConditionParam(conditionSHI, CONDITION_PARAM_SUBID, 94)
          -- Dist --
          conditionDIST = createConditionObject(CONDITION_ATTRIBUTES)
          setConditionParam(conditionDIST, CONDITION_PARAM_TICKS, -1)
          setConditionParam(conditionDIST, CONDITION_PARAM_SKILL_DISTANCE, 99)
          setConditionParam(conditionDIST, CONDITION_PARAM_BUFF, true)
          setConditionParam(conditionDIST, CONDITION_PARAM_SUBID, 95)
      function onLogin(cid)
          doAddCondition(cid, conditionHP)
          doAddCondition(cid, conditionMP)
          doAddCondition(cid, conditionML)
          doAddCondition(cid, conditionMELEE)
          doAddCondition(cid, conditionSHI)
          doAddCondition(cid, conditionDIST)
          return true
      end
       
       
      Como eu faço pra adcionar os valores das condition vindo de um storage do player?
       
    • By Myalitth
      .Qual servidor ou website você utiliza como base? 
       
      OTX -  TFS 1.2
       
      Boa Noite, eu gostaria de um script que fizesse com que um item x sumisse de determinado SQM quando um player pise em um determinado tile (sqm) e reaparecer quando o player sair do tile...
      Se possivel com um exausted entre efeitos (ações).
       
      Exemplo a ilha da Spike Sword em Rookgaard, só que com um tile proximo em que possa sumir o item ao pisar.
       
      Eu tentei porém não obtive exito
       
       
    • By Nto Avus Official
      Opa rapazeada queria uma ajuda pra colocar esse script de akatsuki pra dar a outfit e dar dano, pros jogadores, queria que não desse hp e sim dano tipo uns 2000 de dano.
       
      Script
       
      Você tem o código disponível? Se tiver publique-o aqui: 
         
      Você tem alguma imagem que possa auxiliar no problema? Se sim, coloque-a aqui. 
       
    • By Nother
      Olá, gostaria de um sistema de baú donate, onde a pessoa faz o donate, e eu como adm entro no game e coloco os pontos(itens) nesse baú, e somente essa pessoa que eu determinei que vai poder retirar esses itens.
      Esse baú vai funcionar para todos os player mas somente os que eu determinar os itens que poderão retirar. Desde já agradeço
      Meu tfs é 0.4
      Ate disponibilizaria algum código para facilitar mas não faço a menor ideia qual codigo se aproxima mais disso
      Ja vi esse sistema funcionando no Wodbo Wars
       
       

  • Recently Browsing   0 members

    No registered users viewing this page.


×
×
  • Create New...

Important Information

Confirmação de Termo