[C++] Monsters Passive System
testado: TFS - 0.3.6 (porém acredito que funcione em outros)
autor: Tony Araújo (OrochiElf)
Eai galera, tranquilão? Estou eu aqui novamente, e hoje eu vou compartilhar com vocês um sistema que eu vejo muitas pessoas pedindo e buscando ajuda (principalmente no meu inbox kkkkk), seria ele o sistema de monstros passivos, que consiste naquela criatura que só ataca o jogador que o atacou, caso contrário ele fica andando normalmente. O sistema foi desenvolvido em cima do código do TFS 0.3.6, porém caso instale prestando bastante atenção em outras versões, funcione, talvez seja necessário mudar algum código, porém bem simples.
Bom, vamos ao sistema.
Em creature.cpp, procure pela função:
bool Creature::setAttackedCreature(Creature* creature)
E altere esta condição:
if(attackedCreature) { onAttackedCreature(attackedCreature); attackedCreature->onAttacked(); }
Por esta:
if(attackedCreature) { onAttackedCreature(attackedCreature); attackedCreature->onAttacked(); attackedCreature->addDamagePoints(this, 0); }
Procure pela função:
void Creature::addDamagePoints(Creature* attacker, int32_t damagePoints)
E troque por esta:
void Creature::addDamagePoints(Creature* attacker, int32_t damagePoints)
{
uint32_t attackerId = 0;
if(attacker)
attackerId = attacker->isPlayerSummon() ? attacker->getMaster()->getID() : attacker->getID();
CountMap::iterator it = damageMap.find(attackerId);
if(it != damageMap.end())
{
it->second.ticks = OTSYS_TIME();
if(damagePoints > 0)
it->second.total += damagePoints;
}
else
damageMap[attackerId] = CountBlock_t(damagePoints);
if(damagePoints > 0)
lastHitCreature = attackerId;
}
Agora vá em monster.cpp e procure pela função:
void Monster::onThink(uint32_t interval)
E dentro dela, procure pela condição:
else if(!targetList.empty())
E troque por esta:
else if(!targetList.empty()) { if(!followCreature || !hasFollowPath) searchTarget(); }
Procure pela função:
bool Monster::selectTarget(Creature* creature)
E troque por esta:
bool Monster::selectTarget(Creature* creature)
{
#ifdef __DEBUG__
std::cout << "Selecting target... " << std::endl;
#endif
if(!isTarget(creature))
return false;
uint32_t targetId = creature->isPlayerSummon() ? creature->getMaster()->getID() : creature->getID();
if(!isHostile() && !hasBeenAttacked(targetId))
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(setAttackedCreature(creature))
Dispatcher::getInstance().addTask(createTask(boost::bind(&Game::checkCreatureAttack, &g_game, getID())));
return setFollowCreature(creature, true);
}
Bom galera, espero que gostem e que façam bom uso. Qualquer bug ou problema, comenta aí pra eu resolver.