2 minutos atrás, Ceetros disse:Posto aqui só com devida permissão da administração/criado do topico.
- Fórum
- OTServ
- Recursos
- Linguagens de Programação
- [c++] passive system
info
Grupo: Conde
Registrado: 03/11/11
Posts: 714
Reputação: +67
Gênero: Masculino
Char no Tibia: esqueci 20+

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
info
Grupo: Conde
Registrado: 14/04/15
Posts: 956
Reputação: +333
Gênero: Masculino

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 ![]()
Recomendo o @Kilowog Atualizar o tópico, adicionei isso ao meu server e funcionou perfeitamente ![]()
info
Grupo: Visconde
Registrado: 27/02/13
Posts: 446
Reputação: +282
Gênero: Masculino

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 ^^
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
{
return (!creature->isRemoved() && creature->isAttackable() && creature->getZone() != ZONE_PROTECTION
&& canSeeCreature(creature) && creature->getPosition().z == getPosition().z);
}
{
#ifdef __DEBUG__
std::cout << "Selecting target... " << std::endl;
#endif
if(!isTarget(creature))
return false;
// return false;
// 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();
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;
// }
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;
}
Dispatcher::getInstance().addTask(createTask(
boost::bind(&Game::checkCreatureAttack, &g_game, getID())));
}
creature.cpp
{
if(damagePoints < 0)
return;
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();
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);
lastHitCreature = attackerId;
}
xml
<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 Junho 13 por nociam
info
Grupo: Conde
Registrado: 14/04/15
Posts: 956
Reputação: +333
Gênero: Masculino

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...
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 ![]()
info
Grupo: Conde
Registrado: 14/04/15
Posts: 956
Reputação: +333
Gênero: Masculino

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
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.
info
Grupo: Conde
Registrado: 14/04/15
Posts: 956
Reputação: +333
Gênero: Masculino

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 Junho 14 por Drazyn1291
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 Junho 14 por Kilowog
info
Grupo: Conde
Registrado: 14/04/15
Posts: 956
Reputação: +333
Gênero: Masculino

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 Junho 14 por Drazyn1291
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.
info
Grupo: Conde
Registrado: 03/11/11
Posts: 714
Reputação: +67
Gênero: Masculino
Char no Tibia: esqueci 20+

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?




info
Registrado: 31/12/69
Posts: 0
Reputação: 0
Posto aqui só com devida permissão da administração/criado do topico.