Ir para conteúdo

[C++] Monsters Passive System (No-bugs)


Posts Recomendados

[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.

 

9LVIahZ.gif

Editado por Tony Araujo
Link para o comentário
Compartilhar em outros sites

Muito bom cara! Parabéns em ^^ 

Vai ajudar muito os OTADMINS.

 

E que venha contribuindo mais e mais com a comunidade ❤️ 

segura meu REP+

Link para o comentário
Compartilhar em outros sites

2 horas atrás, Tony Araujo disse:

[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:

  Mostrar conteúdo oculto

 

 


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:

  Mostrar conteúdo oculto

 


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.

 

9LVIahZ.gif

Muito bom brother! Eu consegui esse mesmo resultado usando outro tutorial antigamente kkk Vai ajudar muita gente, parabéns! Reputado+! 

Link para o comentário
Compartilhar em outros sites

3 horas atrás, Ayron5 disse:

Muito bom brother! Eu consegui esse mesmo resultado usando outro tutorial antigamente kkk Vai ajudar muita gente, parabéns! Reputado+! 

De nada brother. Eu lembro, tinha um tutorial antigo, porém eu vi muita gente tendo muita dificuldade pra instalar, e o código também tava um pouco confuso. Daí resolvi postar esse aqui pra galera

 

24 minutos atrás, FlamesAdmin disse:

#off

parece que teremos um server svke aqui?

 

#topic

belo trabalho

Temos sim brother kkkkk, www.facebook.com/oldPokemonOT

inclusive to fazendo open test nele hoje. Se quiser aparecer por lá. Volta as 17h

 

Obrigado mano ;D

Link para o comentário
Compartilhar em outros sites

Tem alguma função especifica para setar o pokémon para ser passivo ? Não cheguei a testar, mas creio que todos os pokémons ficam passivos certo ?

Link para o comentário
Compartilhar em outros sites

4 horas atrás, XZero disse:

Tem alguma função especifica para setar o pokémon para ser passivo ? Não cheguei a testar, mas creio que todos os pokémons ficam passivos certo ?

É aquela tag <flag hostile="0"/> do monster, se for 0, ele é passivo

Link para o comentário
Compartilhar em outros sites

  • 3 months later...

fiz e não deu certo aqui, compilo a source sem erros, mas não deu nenhum resultado, mesmo colocando <flag hostile="0"/> no monster, ele continua agressivo.

Link para o comentário
Compartilhar em outros sites

1 hora atrás, psalex disse:

fiz e não deu certo aqui, compilo a source sem erros, mas não deu nenhum resultado, mesmo colocando <flag hostile="0"/> no monster, ele continua agressivo.

tenta colocar essas duas

<flag hostile="0"/>
<flag passive="0"/>

 

Link para o comentário
Compartilhar em outros sites

  • 2 weeks later...
  • 3 months later...
  • 1 month later...
Em 24/11/2019 em 00:38, sirvitor4 disse:

Compilei tudo certinho mas o pokemon continua hostil mesmo sem a flag hostil/passive(ou com) e mesmo com o passivepokemons comentado... Alguém tem um solução?

Base pokemasterx

Eu vi um servidor "pokemasterX" com pokemons passivos ONLINE (continua). Essa basa já não tem o sistema de passivos nela? (mesmo que aparentemente não esteja funcionando).

Link para o comentário
Compartilhar em outros sites

  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...