Ir para conteúdo

onTarget também executado por monstros


zipter98

Posts Recomendados

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.

Link para o comentário
Compartilhar em outros sites

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 por nociam
Link para o comentário
Compartilhar em outros sites

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?

Link para o comentário
Compartilhar em outros sites

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

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.

Link para o comentário
Compartilhar em outros sites

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.

Link para o comentário
Compartilhar em outros sites

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

  • 3 weeks later...
  • 4 months later...
×
×
  • Criar Novo...