ZI

onTarget também executado por monstros

Por zipter98, 05 de set. de 2015 em Linguagens de Programação

target
monstro
31
6.4k
nociamN
07 de setembro de 2015 às 15:03

no meu servidor com o seu exemplo nao funcionou servidor 0.3.6.

zipter98Z
07 de setembro de 2015 às 15:06

Com o exemplo corrigido não funcionou? Você instalou tudo corretamente? O jogador por acaso está usando um summon?

Tudo está funcionando como deve, inclusive testei a modificação na mesma versão da sua distro.

nociamN
07 de setembro de 2015 às 20:40

Um eu tenho uma alteração feita pelo slicer acho que e mesma coisa so que faltava a parte do void Monster::doAttacking(uint32_t interval) pra alterar se pode me dizer se posso deixar desse modo a parte do bool Monster::selectTarget(Creature* creature) ou deixo do seu jeito?

 

modo slicer​

 

 

bool Monster::selectTarget(Creature* creature)
{
#ifdef __DEBUG__
std::cout << "Selecting target... " << std::endl;
#endif
if(!isTarget(creature))
return false;

CreatureList::iterator it = std::find(targetList.begin(), targetList.end(), creature);
if(it == targetList.end())
{
//Target not found in our target list.
#ifdef __DEBUG__
std::cout << "Target not found in targetList." << std::endl;
#endif
return false;
}

if((isHostile() || isSummon()) && setAttackedCreature(creature) && !isSummon())
Dispatcher::getInstance().addTask(createTask(
boost::bind(&Game::checkCreatureAttack, &g_game, getID())));

CreatureEventList targetEvents = getCreatureEvents(CREATURE_EVENT_TARGET);//edited onTarget
bool deny = false;
for(CreatureEventList::iterator it = targetEvents.begin(); it != targetEvents.end(); ++it)
{
if(!(*it)->executeTarget(this, creature))
deny = true;
}

if(deny)
return false;

return setFollowCreature(creature, true);
}

 

 

modo seu

 

 

bool Monster::selectTarget(Creature* creature)
{
#ifdef __DEBUG__
std::cout << "Selecting target... " << std::endl;
#endif
if(!isTarget(creature))
return false;

CreatureList::iterator it = std::find(targetList.begin(), targetList.end(), creature);
if(it == targetList.end())
{
//Target not found in our target list.
#ifdef __DEBUG__
std::cout << "Target not found in targetList." << std::endl;
#endif
return false;
}

CreatureEventList targetEvents = getCreatureEvents(CREATURE_EVENT_TARGET);
for(CreatureEventList::iterator it = targetEvents.begin(); it != targetEvents.end(); ++it)
{
if(!(*it)->executeTarget(this, creature))
return false;
}

if((isHostile() || isSummon()) && setAttackedCreature(creature) && !isSummon())
Dispatcher::getInstance().addTask(createTask(
boost::bind(&Game::checkCreatureAttack, &g_game, getID())));

return setFollowCreature(creature, true);
}

 

 

EDIT:Achei um erro fatal no qual da crash no servidor, e quanto os monster(tinha 2) estão atacando e vc seta a storage na hora dos ataques ai cai o servidor.

Editado Setembro 7 por nociam

zipter98Z
07 de setembro de 2015 às 21:48

Minha alteração é basicamente a mesma do Slicer. A única diferença é que, na minha versão, eu retorno falso antes da dele.

nociamN
07 de setembro de 2015 às 22:38

Minha alteração é basicamente a mesma do Slicer. A única diferença é que, na minha versão, eu retorno falso antes da dele.

e sobre esse erro

 

tipo tem um monstro me atacando ai eu usei uma food de proteçao que me ta tal storage pro monstro nao me atacar ai o servidor cai?

zipter98Z
07 de setembro de 2015 às 22:59

Apesar de não ser a maneira mais adequada para corrigir esse erro, é o que pude pensar no momento.

Na parte em que a storage é alterada no código da food de proteção:

local name = "monster_name"        --Nome do monstro.
 
function Substitute(cid)
    for _, pid in pairs(getSpectators(getThingPos(cid), 8, 8)) do
        if isMonster(pid) and getCreatureName(pid) == name then
            local healthNow, posNow = getCreatureHealth(pid), getThingPos(pid)
            doRemoveCreature(pid)
            local newMonster = doCreateMonster(name, posNow)
            doCreatureAddHealth(newMonster, -(getCreatureMaxHealth(newMonster) - healthNow))
        end
    end
end
 
setPlayerStorageValue(cid, key, -1)
Substitute(cid)

Editado Setembro 7 por zipter98

nociamN
07 de setembro de 2015 às 23:17

tipo tem o mosntro A e B e C me atacando ai eu uso a food em min já era, tipo nem testei mais o jeito e setar a storage sem estar em combate mesmo.

zipter98Z
07 de setembro de 2015 às 23:26

Usando a correção que postei, o servidor não caiu e os monstros não me atacaram mais. Mas, se preferir, você pode fazer o que disse e fazer com que o item só possa ser usado fora de combate.

XtudomuitoX
08 de setembro de 2015 às 22:54

Amigo vc poderia testa com o script do ptdg. Estou usando ele e está dando esse erro. Quando tem o dois monster com msm nome atacando eu, quando mato um fecha Server. Poderia testa o do nosso amigo ae.

zipter98Z
08 de setembro de 2015 às 23:37

Por favor, teste outro script e veja se o mesmo erro acontece. O código do ptdg está funcionando perfeitamente, pelo menos aqui.

notle2012N
09 de setembro de 2015 às 18:24

muito bom rep+

ManoTobiraM
12 de setembro de 2015 às 14:48

testei todos e continua a mesma coisa se tiver 2 monsters iguais o da script no caso o mizuki quando mata 1 e a storage muda o server cai

zipter98Z
13 de setembro de 2015 às 19:06

Se a storage for alterada durante o "processo", o servidor cai. Para evitar isso, vejam a correção que enviei alguns comentários acima para o nociam.

Troque a linha responsável pela modificação na storage por este código:

local name = "monster_name"        --Nome do monstro.
 
function Substitute(cid)
    for _, pid in pairs(getSpectators(getThingPos(cid), 8, 8)) do
        if isMonster(pid) and getCreatureName(pid) == name then
            local healthNow, posNow = getCreatureHealth(pid), getThingPos(pid)
            doRemoveCreature(pid)
            local newMonster = doCreateMonster(name, posNow)
            doCreatureAddHealth(newMonster, -(getCreatureMaxHealth(newMonster) - healthNow))
        end
    end
end
 
setPlayerStorageValue(cid, storage, valor)
Substitute(cid)

Editado Setembro 13 por zipter98

1 mês depois...
ManoTobiraM
02 de outubro de 2015 às 18:57

agr o problema é outro se 2 players tive matando o bixo junto e o bixo morre só muda a storage de 1 deles precisava mudar dos 2

4 meses depois...
XtudomuitoX
02 de fevereiro de 2016 às 23:13

agr o problema é outro se 2 players tive matando o bixo junto e o bixo morre só muda a storage de 1 deles precisava mudar dos 2

tem como fazer isso zipter, o meu está do msm jeito.