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.
Por zipter98, 05 de set. de 2015 em Linguagens de Programação
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.
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
Minha alteração é basicamente a mesma do Slicer. A única diferença é que, na minha versão, eu retorno falso antes da dele.
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?
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
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.
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.
info
Grupo: Cavaleiro
Registrado: 14/04/15
Posts: 191
Reputação: +2

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.
Por favor, teste outro script e veja se o mesmo erro acontece. O código do ptdg está funcionando perfeitamente, pelo menos aqui.
info
Grupo: Conde
Registrado: 03/01/12
Posts: 884
Reputação: +233
Char no Tibia: Segredo

muito bom rep+
info
Grupo: Campones
Registrado: 19/10/12
Posts: 18
Reputação: +2

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
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
info
Grupo: Campones
Registrado: 19/10/12
Posts: 18
Reputação: +2

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
info
Grupo: Cavaleiro
Registrado: 14/04/15
Posts: 191
Reputação: +2

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.
info
Grupo: Conde
Registrado: 04/02/13
Posts: 541
Reputação: +90
Gênero: Masculino
no meu servidor com o seu exemplo nao funcionou servidor 0.3.6.