void CEnmityContainer::AddPartyEnmity(CCharEntity* PChar) { // TODO: добавляемые персонажи уже могут быть в списке enmity, я не уверен, что добавление базового значения здесь актуально if (PChar->PParty != NULL) { if (PChar->PParty->m_PAlliance == NULL) { for (uint8 i = 0; i < PChar->PParty->members.size(); ++i) { CBattleEntity* PTarget = (CBattleEntity*)PChar->PParty->members[i]; if (distance(PChar->loc.p, PTarget->loc.p) <= 40) { AddBaseEnmity(PTarget); } } }else if (PChar->PParty->m_PAlliance != NULL) { for (uint8 a = 0; a < PChar->PParty->m_PAlliance->partyList.size(); ++a) { for (uint8 i = 0; i < PChar->PParty->m_PAlliance->partyList.at(a)->members.size(); ++i) { CBattleEntity* PTarget = (CBattleEntity*)PChar->PParty->m_PAlliance->partyList.at(a)->members[i]; if (distance(PChar->loc.p, PTarget->loc.p) <= 40) { AddBaseEnmity(PTarget); } } } } } }
void CEnmityContainer::UpdateEnmity(CBattleEntity* PEntity, int16 CE, int16 VE, bool withMaster) { // you're too far away so i'm ignoring you if (!IsWithinEnmityRange(PEntity)) { CE = 0; VE = 0; } auto enmity_obj = m_EnmityList.find(PEntity->id); if (enmity_obj != m_EnmityList.end()) { float bonus = CalculateEnmityBonus(PEntity); int newCE = enmity_obj->second.CE + ((CE > 0) ? CE * bonus : CE); int newVE = enmity_obj->second.VE + ((VE > 0) ? VE * bonus : VE); //Check for cap limit enmity_obj->second.CE = dsp_cap(newCE, 0, 10000); enmity_obj->second.VE = dsp_cap(newVE, 0, 10000); enmity_obj->second.active = true; if (CE + VE > 0 && PEntity->getMod(Mod::TREASURE_HUNTER) > enmity_obj->second.maxTH) enmity_obj->second.maxTH = (uint8)(PEntity->getMod(Mod::TREASURE_HUNTER)); } else if (CE >= 0 && VE >= 0) { bool initial = true; for (auto&& enmityObject : m_EnmityList) { if (enmityObject.second.active) { initial = false; break; } } if (initial) CE += 200; float bonus = CalculateEnmityBonus(PEntity); CE = dsp_cap(CE * bonus, 0, 10000); VE = dsp_cap(VE * bonus, 0, 10000); auto maxTH = 0; if (CE + VE > 0) maxTH = (uint8)(PEntity->getMod(Mod::TREASURE_HUNTER)); m_EnmityList.emplace(PEntity->id, EnmityObject_t {PEntity, CE, VE, true, (uint8)maxTH}); if (withMaster && PEntity->PMaster != nullptr) { //add master to the enmity list //add master to the enmity list (charmed mob) if (PEntity->objtype == TYPE_PET || PEntity->objtype == TYPE_MOB && PEntity->PMaster != nullptr && PEntity->PMaster->objtype == TYPE_PC) { AddBaseEnmity(PEntity->PMaster); } } } }
void CEnmityContainer::AddPartyEnmity(CCharEntity* PChar) { // TODO: добавляемые персонажи уже могут быть в списке enmity, я не уверен, что добавление базового значения здесь актуально PChar->ForAlliance([this, PChar](CBattleEntity* PMember) { if (distance(PChar->loc.p, PMember->loc.p) <= 40) { AddBaseEnmity(PMember); } }); }