Ir para conteúdo

[c++] passive system


Posts Recomendados

2 minutos atrás, boxxer321 disse:

faz uma versão 0.3.6 prfv e dps o cara atualiza o tópico c a versão 0.3.6

Posto aqui só com devida permissão da administração/criado do topico.

Link para o comentário
Compartilhar em outros sites

On 12/06/2016 at 3:13 PM, nociam said:

Vc acha que pode ajudar com a solução porque não manjo muito de c++, claro se não for pedir demais.

 

achei ela em creature.cpp?

 

bool Creature::hasBeenAttacked(uint32_t attackerId) const

{

 CountMap::const_iterator it = damageMap.find(attackerId);

 if(it != damageMap.end())

  return (OTSYS_TIME() - it->second.ticks) <= g_config.getNumber(ConfigManager::PZ_LOCKED);

 
 return false;

}

No monster.cpp no select target tu deixa assim:

    uint32_t id = creature->getID();    if(creature->getMaster() && creature->getMaster()->getPlayer())        id = creature->getMaster()->getPlayer()->getGUID();    else if(creature->getPlayer())        id = creature->getPlayer()->getGUID();    if (isPassive() && !hasBeenAttacked(id)) {            return false;    }

E o no creature.cpp no addDamagePoints tu deixa assim:

void CreatureaddDamagePoints(Creature* attacker, int32_t damagePoints){	if(damagePoints < 0)		return;	uint32_t attackerId = 0;    if(attacker){        if(attacker->getPlayer())            attackerId = attacker->getPlayer()->getGUID();        else if(attacker->getMaster() && attacker->getMaster()->getPlayer())            attackerId = attacker->getMaster()->getPlayer()->getGUID();        else            attackerId = attacker->getID();    }

 

Agora se atenta a uma coisa, quando fizer isso, ele vai sempre que houver um master e ele for um player, ou quando for um player salvar o guid. Então outros lugares que esteja usando o hasBeenAttacked deve ter essa logica também, caso contrário não irão encontrar

Link para o comentário
Compartilhar em outros sites

5 horas atrás, dalvorsn disse:

No monster.cpp no select target tu deixa assim:

    uint32_t id = creature->getID();    if(creature->getMaster() && creature->getMaster()->getPlayer())        id = creature->getMaster()->getPlayer()->getGUID();    else if(creature->getPlayer())        id = creature->getPlayer()->getGUID();    if (isPassive() && !hasBeenAttacked(id)) {            return false;    }

E o no creature.cpp no addDamagePoints tu deixa assim:

void CreatureaddDamagePoints(Creature* attacker, int32_t damagePoints){	if(damagePoints < 0)		return;	uint32_t attackerId = 0;    if(attacker){        if(attacker->getPlayer())            attackerId = attacker->getPlayer()->getGUID();        else if(attacker->getMaster() && attacker->getMaster()->getPlayer())            attackerId = attacker->getMaster()->getPlayer()->getGUID();        else            attackerId = attacker->getID();    }

 

Agora se atenta a uma coisa, quando fizer isso, ele vai sempre que houver um master e ele for um player, ou quando for um player salvar o guid. Então outros lugares que esteja usando o hasBeenAttacked deve ter essa logica também, caso contrário não irão encontrar

Nossa mano, q foda vlw ae :D

 

Recomendo o @Kilowog Atualizar o tópico, adicionei isso ao meu server e funcionou perfeitamente :D

Link para o comentário
Compartilhar em outros sites

6 horas atrás, dalvorsn disse:

No monster.cpp no select target tu deixa assim:

    uint32_t id = creature->getID();    if(creature->getMaster() && creature->getMaster()->getPlayer())        id = creature->getMaster()->getPlayer()->getGUID();    else if(creature->getPlayer())        id = creature->getPlayer()->getGUID();    if (isPassive() && !hasBeenAttacked(id)) {            return false;    }

E o no creature.cpp no addDamagePoints tu deixa assim:

void CreatureaddDamagePoints(Creature* attacker, int32_t damagePoints){	if(damagePoints < 0)		return;	uint32_t attackerId = 0;    if(attacker){        if(attacker->getPlayer())            attackerId = attacker->getPlayer()->getGUID();        else if(attacker->getMaster() && attacker->getMaster()->getPlayer())            attackerId = attacker->getMaster()->getPlayer()->getGUID();        else            attackerId = attacker->getID();    }

 

Agora se atenta a uma coisa, quando fizer isso, ele vai sempre que houver um master e ele for um player, ou quando for um player salvar o guid. Então outros lugares que esteja usando o hasBeenAttacked deve ter essa logica também, caso contrário não irão encontrar

Bom, eu ia comentar para ter um concerto nessa parte, porém vi o seu, mas vou dar outra idéia de como fazer isso, que foi na forma que eu fiz o meu.

Você pode fazer no selectTarget (assim como pede o código citado), e verificar se o target escolhido pelo monstro possui um summon, caso sim, retornar ao summon 0 (no caso, primeiro) da tabela de summons.

 

O Código fica mais simples kkkk, porém, só a minha idéia ^^

Link para o comentário
Compartilhar em outros sites

7 horas atrás, dalvorsn disse:

No monster.cpp no select target tu deixa assim:

    uint32_t id = creature->getID();    if(creature->getMaster() && creature->getMaster()->getPlayer())        id = creature->getMaster()->getPlayer()->getGUID();    else if(creature->getPlayer())        id = creature->getPlayer()->getGUID();    if (isPassive() && !hasBeenAttacked(id)) {            return false;    }

E o no creature.cpp no addDamagePoints tu deixa assim:

void CreatureaddDamagePoints(Creature* attacker, int32_t damagePoints){	if(damagePoints < 0)		return;	uint32_t attackerId = 0;    if(attacker){        if(attacker->getPlayer())            attackerId = attacker->getPlayer()->getGUID();        else if(attacker->getMaster() && attacker->getMaster()->getPlayer())            attackerId = attacker->getMaster()->getPlayer()->getGUID();        else            attackerId = attacker->getID();    }

 

Agora se atenta a uma coisa, quando fizer isso, ele vai sempre que houver um master e ele for um player, ou quando for um player salvar o guid. Então outros lugares que esteja usando o hasBeenAttacked deve ter essa logica também, caso contrário não irão encontrar

Não sei o que fiz de errado mais não foi o pokemon nao sei do passive eterno

 

monster.cpp

 

Spoiler
bool Monster::isTarget(Creature* creature)

{

 return (!creature->isRemoved() && creature->isAttackable() && creature->getZone() != ZONE_PROTECTION

  && canSeeCreature(creature) && creature->getPosition().z == getPosition().z);

}

 
bool Monster::selectTarget(Creature* creature)

{

#ifdef __DEBUG__

 std::cout << "Selecting target... " << std::endl;

#endif

 if(!isTarget(creature))

  return false;

 
// if(!isHostile())

    //    return false;

 
 //   if (isPassive() && !hasBeenAttacked(creature->getID())) {

//  return false;

 //}

    uint32_t id = creature->getID();

    if(creature->getMaster() && creature->getMaster()->getPlayer())

        id = creature->getMaster()->getPlayer()->getGUID();

    else if(creature->getPlayer())

        id = creature->getPlayer()->getGUID();

 
    if (isPassive() && !hasBeenAttacked(id)) {

            return false;

    }

                 

    // std::string value;

     //if(getStorage(505, value)) {

       //if(creature->isSummon()){

         // if(value != creature->getMaster()->getName())

           //   return false;                    

       //}else if(value != creature->getName()) //&& value != "0"){ -- se bugar 

         //  return false;   

    // }  

 
 const std::list<Creature*>& summons = creature->getSummons();

 CreatureList::const_iterator itt = summons.begin();

 for(uint32_t i = 1; itt != summons.end(); ++itt, ++i)

 {

  if (i >= 1 && *itt){

   if((isHostile() || isSummon() || !isHostile() && getHealth() !=  getMaxHealth()) && setAttackedCreature(*itt) && !isSummon())

   Dispatcher::getInstance().addTask(createTask(

    boost::bind(&Game::checkCreatureAttack, &g_game, getID())));

  

  return setFollowCreature(*itt, true);

        }

  

 }

 

 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())));

 
 return setFollowCreature(creature, true);

}

 

creature.cpp

 

Spoiler
void Creature::addDamagePoints(Creature* attacker, int32_t damagePoints)

{

    

 if(damagePoints < 0)

  return;

 
 uint32_t attackerId = 0;

    if(attacker){

        if(attacker->getPlayer())

            attackerId = attacker->getPlayer()->getGUID();

        else if(attacker->getMaster() && attacker->getMaster()->getPlayer())

            attackerId = attacker->getMaster()->getPlayer()->getGUID();

        else

            attackerId = attacker->getID();

    }

 uint32_t summonId = 0;

 if(attacker)

  attackerId = attacker->getID();

  

 if((*(attacker->getSummons().begin())))

        summonId = (*(attacker->getSummons().begin()))->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);

 

 it = damageMap.find(summonId);

 if(it != damageMap.end())

 {

  it->second.ticks = OTSYS_TIME();

  if(damagePoints > 0)

   it->second.total += damagePoints;

 }

 else

  damageMap[summonId] = CountBlock_t(damagePoints);

 
 if(damagePoints > 0)

  lastHitCreature = attackerId;

}

 

xml

Spoiler

  <flags>

    <flag summonable="1"/>

    <flag attackable="1"/>

    <flag hostile="1"/>

 <flag passive="1" />

    <flag illusionable="1"/>

    <flag convinceable="1"/>

    <flag pushable="1"/>

    <flag canpushitems="0"/>

    <flag canpushcreatures="0"/>

    <flag targetdistance="1"/>

    <flag staticattack="100"/>

    <flag runonhealth="0"/>

  </flags>

 

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

Ahh, daolvorson, isso meio q bugou o sistema de loot, percebi que o player n estava mais enviando a msg, então quando fui printar a tabela de deathlist do onDeath, diz q quem matou o pokemon foi o "fire", e eu estava usando magia de tipo fire... mas antes eu usava essa magia eu e recebia o loot normal...

Link para o comentário
Compartilhar em outros sites

17 horas atrás, dalvorsn disse:

No monster.cpp no select target tu deixa assim:

    uint32_t id = creature->getID();    if(creature->getMaster() && creature->getMaster()->getPlayer())        id = creature->getMaster()->getPlayer()->getGUID();    else if(creature->getPlayer())        id = creature->getPlayer()->getGUID();    if (isPassive() && !hasBeenAttacked(id)) {            return false;    }

E o no creature.cpp no addDamagePoints tu deixa assim:

void CreatureaddDamagePoints(Creature* attacker, int32_t damagePoints){	if(damagePoints < 0)		return;	uint32_t attackerId = 0;    if(attacker){        if(attacker->getPlayer())            attackerId = attacker->getPlayer()->getGUID();        else if(attacker->getMaster() && attacker->getMaster()->getPlayer())            attackerId = attacker->getMaster()->getPlayer()->getGUID();        else            attackerId = attacker->getID();    }

 

Agora se atenta a uma coisa, quando fizer isso, ele vai sempre que houver um master e ele for um player, ou quando for um player salvar o guid. Então outros lugares que esteja usando o hasBeenAttacked deve ter essa logica também, caso contrário não irão encontrar

 

Opa, muito obrigado amigo. Tinha reparado nisso ao testar melhor, só que fiquei sem tempo essa semana para ver como iria corrigir, mas acho que não faria melhor. Vou editar o tópico e colocar os devidos créditos =):

20 horas atrás, Ceetros disse:

Posto aqui só com devida permissão da administração/criado do topico.

Pode postar amigo, sem problema nenhum. O importante é o bem da comunidade =):

Link para o comentário
Compartilhar em outros sites

21 minutos atrás, Kilowog disse:

 

Opa, muito obrigado amigo. Tinha reparado nisso ao testar melhor, só que fiquei sem tempo essa semana para ver como iria corrigir, mas acho que não faria melhor. Vou editar o tópico e colocar os devidos créditos =):

Pode postar amigo, sem problema nenhum. O importante é o bem da comunidade =):

Lembrando que o code do Dalvorso está bugando o Loot System, pois ele está pegando o creature id diferente do nescessário para adicionar no corpse owner, dai não envia a mensagem para o player que matou

Link para o comentário
Compartilhar em outros sites

2 minutos atrás, Drazyn1291 disse:

Lembrando que o code do Dalvorso está bugando o Loot System, pois ele está pegando o creature id diferente do nescessário para adicionar no corpse owner, dai não envia a mensagem para o player que matou

 

Posta o código do AutoLoot. Acredito que seja melhor atacar o problema do autoloot, já que é só alterar o servidor e não a source.

Link para o comentário
Compartilhar em outros sites

4 minutos atrás, Kilowog disse:

 

Posta o código do AutoLoot. Acredito que seja melhor atacar o problema do autoloot, já que é só alterar o servidor e não a source.

Autoloot? Não carinha, você não entendeu, o Loot mesmo, que envia mensagem com os nome dos itemids etc, não está chegando, testei o onDeath, o deathList está retornando uma tabela com o elemento da spell e uso e não o cid do player '-'

 

 

Além disso, sem o onDeath funcionando corretamente iria acarreta vários problemas...

 

Obs: Não uso o DXP não!

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

5 minutos atrás, Drazyn1291 disse:

Autoloot? Não carinha, você não entendeu, o Loot mesmo, que envia mensagem com os nome dos itemids etc, não está chegando, testei o onDeath, o deathList está retornando uma tabela com o elemento da spell e uso e não o cid do player '-'

 

Há kkkkk Saquei, só tenho como pegar em código a noite, mas no código do Dalvorso, deixe de fora as alterações esta alteração:

void CreatureaddDamagePoints(Creature* attacker, int32_t damagePoints){	if(damagePoints < 0)		return;	uint32_t attackerId = 0;    if(attacker){        if(attacker->getPlayer())            attackerId = attacker->getPlayer()->getGUID();        else if(attacker->getMaster() && attacker->getMaster()->getPlayer())            attackerId = attacker->getMaster()->getPlayer()->getGUID();        else            attackerId = attacker->getID();    }

 

Ver ai.

 

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

16 minutos atrás, Kilowog disse:

 

Há kkkkk Saquei, só tenhoc omo pegar em código a noite, mas no código do Dalvorso, deixe de fora as alterações esta alteração:

void CreatureaddDamagePoints(Creature* attacker, int32_t damagePoints){	if(damagePoints < 0)		return;	uint32_t attackerId = 0;    if(attacker){        if(attacker->getPlayer())            attackerId = attacker->getPlayer()->getGUID();        else if(attacker->getMaster() && attacker->getMaster()->getPlayer())            attackerId = attacker->getMaster()->getPlayer()->getGUID();        else            attackerId = attacker->getID();    }

 

Ver ai.

 

Fiz isso, agora o monster nem atacando está mais, e o loot message voltou!

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

Agora, Drazyn1291 disse:

Fiz isso, agora nem atacando está mais o summon

 

Vou ver com calma hoje a noite e posto se consigo algo. Provavelmente tem que fazer uma cadeia de if igual foi feita, só que no LootSystem.

Link para o comentário
Compartilhar em outros sites

2 horas atrás, Kilowog disse:

 

Vou ver com calma hoje a noite e posto se consigo algo. Provavelmente tem que fazer uma cadeia de if igual foi feita, só que no LootSystem.

ceetros pode postar a versão 0.3.6?

Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...