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::UpdateEnmityFromCure(CBattleEntity* PEntity, uint16 level, uint16 CureAmount, bool isCureV) { if (isCureV) { UpdateEnmity(PEntity, 400, 700); } else { CureAmount = (CureAmount < 1 ? 1 : CureAmount); uint16 mod = battleutils::GetEnmityModCure(level); uint16 CE = 40. / mod * CureAmount; uint16 VE = 240. / mod * CureAmount; // you're too far away so i'm ignoring you if (!IsWithinEnmityRange(PEntity)) { CE = 0; VE = 0; } // Crash fix, PEntity was in ACTION_FALL if (PEntity->PBattleAI->GetCurrentAction() == ACTION_FALL) return; EnmityList_t::iterator PEnmity = m_EnmityList.lower_bound(PEntity->id); // current highest enmity before this update CBattleEntity* OldEntity = GetHighestEnmity(); if (PEnmity != m_EnmityList.end() && !m_EnmityList.key_comp()(PEntity->id, PEnmity->first)) { float bonus = CalculateEnmityBonus(PEntity); float tranquilHeartReduction = 1.f - battleutils::HandleTranquilHeart(PEntity); int newCE = PEnmity->second->CE + (CE * bonus * tranquilHeartReduction); int newVE = PEnmity->second->VE + (VE * bonus * tranquilHeartReduction); //Check for cap limit PEnmity->second->CE = dsp_cap(newCE, 1, 10000); PEnmity->second->VE = dsp_cap(newVE, 0, 10000); } else if (CE >= 0 && VE >= 0) { EnmityObject_t* PEnmityObject = new EnmityObject_t; float bonus = CalculateEnmityBonus(PEntity); float tranquilHeartReduction = 1.f - battleutils::HandleTranquilHeart(PEntity); PEnmityObject->CE = dsp_cap(CE * bonus * tranquilHeartReduction, 1, 10000); PEnmityObject->VE = dsp_cap(VE * bonus * tranquilHeartReduction, 0, 10000); PEnmityObject->PEnmityOwner = PEntity; PEnmityObject->maxTH = 0; m_EnmityList.insert(PEnmity, EnmityList_t::value_type(PEntity->id, PEnmityObject)); } } }
uint8 CEnmityContainer::GetHighestTH() { CBattleEntity* PEntity = nullptr; uint8 THLvl = 0; for (auto it = m_EnmityList.cbegin(); it != m_EnmityList.cend(); ++it) { const EnmityObject_t& PEnmityObject = it->second; PEntity = PEnmityObject.PEnmityOwner; if (PEntity != nullptr && !PEntity->isDead() && IsWithinEnmityRange(PEntity) && PEnmityObject.maxTH > THLvl) THLvl = PEnmityObject.maxTH; } return THLvl; }
uint8 CEnmityContainer::GetHighestTH() { CBattleEntity* PEntity = nullptr; uint8 THLvl = 0; for (EnmityList_t::iterator it = m_EnmityList.begin(); it != m_EnmityList.end(); ++it) { EnmityObject_t* PEnmityObject = it->second; PEntity = PEnmityObject->PEnmityOwner; if (PEntity != nullptr && !PEntity->isDead() && IsWithinEnmityRange(PEntity) && PEnmityObject->maxTH > THLvl) THLvl = PEnmityObject->maxTH; } return THLvl; }
void CEnmityContainer::UpdateEnmityFromCure(CBattleEntity* PEntity, uint16 level, uint16 CureAmount, bool isCureV) { if (!IsWithinEnmityRange(PEntity)) return; int16 CE; int16 VE; float bonus = CalculateEnmityBonus(PEntity); float tranquilHeartReduction = 1.f - battleutils::HandleTranquilHeart(PEntity); if (isCureV) { CE = 400 * bonus * tranquilHeartReduction; VE = 700 * bonus * tranquilHeartReduction; } else { CureAmount = (CureAmount < 1 ? 1 : CureAmount); uint16 mod = battleutils::GetEnmityModCure(level); CE = 40. / mod * CureAmount * bonus * tranquilHeartReduction; VE = 240. / mod * CureAmount * bonus * tranquilHeartReduction; } auto enmity_obj = m_EnmityList.find(PEntity->id); if (enmity_obj != m_EnmityList.end()) { enmity_obj->second.CE = dsp_cap(enmity_obj->second.CE + CE, 0, 10000); enmity_obj->second.VE = dsp_cap(enmity_obj->second.VE + VE, 0, 10000); enmity_obj->second.active = true; } else m_EnmityList.emplace(PEntity->id, EnmityObject_t{ PEntity, dsp_cap(CE, 0, 10000), dsp_cap(VE, 0, 10000), true, 0 }); }
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; } // Crash fix, PEntity was in ACTION_FALL if (PEntity->PBattleAI->GetCurrentAction() == ACTION_FALL) return; EnmityList_t::iterator PEnmity = m_EnmityList.lower_bound(PEntity->id); // current highest enmity before this update CBattleEntity* OldEntity = GetHighestEnmity(); if( PEnmity != m_EnmityList.end() && !m_EnmityList.key_comp()(PEntity->id, PEnmity->first)) { int8 enmityBonus = 0; if (PEntity->objtype & TYPE_PC) { enmityBonus = ((CCharEntity*)PEntity)->PMeritPoints->GetMeritValue(MERIT_ENMITY_INCREASE, (CCharEntity*)PEntity) - ((CCharEntity*)PEntity)->PMeritPoints->GetMeritValue(MERIT_ENMITY_DECREASE, (CCharEntity*)PEntity); } float bonus = (100.0f + dsp_cap(PEntity->getMod(MOD_ENMITY)+enmityBonus, -50, 100)) / 100.0f; PEnmity->second->CE += CE * bonus; PEnmity->second->VE += VE * bonus; //Check for cap limit PEnmity->second->CE = dsp_cap(PEnmity->second->CE, 1, 10000); PEnmity->second->VE = dsp_cap(PEnmity->second->VE, 1, 10000); } else { EnmityObject_t* PEnmityObject = new EnmityObject_t; int8 enmityBonus = 0; if (PEntity->objtype & TYPE_PC) { enmityBonus = ((CCharEntity*)PEntity)->PMeritPoints->GetMeritValue(MERIT_ENMITY_INCREASE, (CCharEntity*)PEntity) - ((CCharEntity*)PEntity)->PMeritPoints->GetMeritValue(MERIT_ENMITY_DECREASE, (CCharEntity*)PEntity); } float bonus = (100.0f + dsp_cap(PEntity->getMod(MOD_ENMITY)+enmityBonus, -50, 100)) / 100.0f; PEnmityObject->CE = CE * bonus; PEnmityObject->VE = VE * bonus; PEnmityObject->PEnmityOwner = PEntity; m_EnmityList.insert(PEnmity, EnmityList_t::value_type(PEntity->id, PEnmityObject)); if(withMaster && PEntity->PMaster != NULL) { //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!=NULL && PEntity->PMaster->objtype == TYPE_PC) { UpdateEnmity(PEntity->PMaster, 0, 0); } } } }
void CEnmityContainer::UpdateEnmity(CBattleEntity* PEntity, int16 CE, int16 VE, bool withMaster, bool aggroEnmity) { // you're too far away so i'm ignoring you if (!IsWithinEnmityRange(PEntity)) { CE = 0; VE = 0; } auto PMob = dynamic_cast<CMobEntity*>(m_EnmityHolder); if (PMob && PMob->m_HiPCLvl < PEntity->GetMLevel()) PMob->m_HiPCLvl = PEntity->GetMLevel(); EnmityList_t::iterator PEnmity = m_EnmityList.lower_bound(PEntity->id); // current highest enmity before this update CBattleEntity* OldEntity = GetHighestEnmity(); if (PEnmity != m_EnmityList.end() && !m_EnmityList.key_comp()(PEntity->id, PEnmity->first)) { float bonus = CalculateEnmityBonus(PEntity); if (PEnmity->second->CE == 0 && CE + VE <= 0) return; int newCE = PEnmity->second->CE + ((CE > 0) ? CE * bonus : CE); int newVE = PEnmity->second->VE + ((VE > 0) ? VE * bonus : VE); //Check for cap limit PEnmity->second->CE = dsp_cap(newCE, 1, 10000); PEnmity->second->VE = dsp_cap(newVE, 0, 10000); PEnmity->second->isAggroEnmity = aggroEnmity; if (CE + VE > 0 && PEntity->getMod(MOD_TREASURE_HUNTER) > PEnmity->second->maxTH) PEnmity->second->maxTH = (uint8)(PEntity->getMod(MOD_TREASURE_HUNTER)); } else if (CE >= 0 && VE >= 0) { EnmityObject_t* PEnmityObject = new EnmityObject_t; bool initial = true; for (auto&& enmityObject : m_EnmityList) { if (enmityObject.second->CE > 0 || enmityObject.second->VE > 0) { initial = false; break; } } if (initial) CE += 200; float bonus = CalculateEnmityBonus(PEntity); PEnmityObject->CE = dsp_cap(CE * bonus, 0, 10000); PEnmityObject->VE = dsp_cap(VE * bonus, 0, 10000); PEnmityObject->PEnmityOwner = PEntity; PEnmityObject->isAggroEnmity = aggroEnmity; if (CE + VE > 0) PEnmityObject->maxTH = (uint8)(PEntity->getMod(MOD_TREASURE_HUNTER)); else PEnmityObject->maxTH = 0; m_EnmityList.insert(PEnmity, EnmityList_t::value_type(PEntity->id, PEnmityObject)); 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) { UpdateEnmity(PEntity->PMaster, 0, 0); } } } }
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; } // Crash fix, PEntity was in ACTION_FALL if (PEntity->PBattleAI->GetCurrentAction() == ACTION_FALL) return; EnmityList_t::iterator PEnmity = m_EnmityList.lower_bound(PEntity->id); // current highest enmity before this update CBattleEntity* OldEntity = GetHighestEnmity(); if( PEnmity != m_EnmityList.end() && !m_EnmityList.key_comp()(PEntity->id, PEnmity->first)) { float bonus = CalculateEnmityBonus(PEntity); if (PEnmity->second->CE == 0 && CE + VE <= 0) return; PEnmity->second->CE += CE > 0 ? CE * bonus : CE; PEnmity->second->VE += VE > 0 ? VE * bonus : VE; //Check for cap limit PEnmity->second->CE = dsp_cap(PEnmity->second->CE, 1, 10000); PEnmity->second->VE = dsp_cap(PEnmity->second->VE, 0, 10000); if (CE + VE > 0 && PEntity->getMod(MOD_TREASURE_HUNTER) > PEnmity->second->maxTH) PEnmity->second->maxTH = (uint8)(PEntity->getMod(MOD_TREASURE_HUNTER)); } else if (CE >= 0 && VE >= 0) { EnmityObject_t* PEnmityObject = new EnmityObject_t; float bonus = CalculateEnmityBonus(PEntity); PEnmityObject->CE = CE * bonus; PEnmityObject->VE = VE * bonus; PEnmityObject->PEnmityOwner = PEntity; if (CE + VE > 0) PEnmityObject->maxTH = (uint8)(PEntity->getMod(MOD_TREASURE_HUNTER)); else PEnmityObject->maxTH = 0; m_EnmityList.insert(PEnmity, EnmityList_t::value_type(PEntity->id, PEnmityObject)); if(withMaster && PEntity->PMaster != NULL) { //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!=NULL && PEntity->PMaster->objtype == TYPE_PC) { UpdateEnmity(PEntity->PMaster, 0, 0); } } } }