[Performance] Reduced CPU footprint in non-combat zones doing constant checks for combat related activities

This commit is contained in:
Akkadius 2017-03-25 23:32:49 -05:00
parent 9e41795594
commit 719098a97c
3 changed files with 62 additions and 50 deletions

View File

@ -1,5 +1,8 @@
EQEMu Changelog (Started on Sept 24, 2003 15:50) EQEMu Changelog (Started on Sept 24, 2003 15:50)
------------------------------------------------------- -------------------------------------------------------
== 03/25/2017 ==
Akkadius: Reduced CPU footprint in non-combat zones doing constant checks for combat related activities
== 03/12/2017 == == 03/12/2017 ==
Akkadius: Akkadius:
- Implemented range rules for packets and other functions - Implemented range rules for packets and other functions

View File

@ -616,7 +616,7 @@ bool Client::Process() {
//At this point, we are still connected, everything important has taken //At this point, we are still connected, everything important has taken
//place, now check to see if anybody wants to aggro us. //place, now check to see if anybody wants to aggro us.
// only if client is not feigned // only if client is not feigned
if(ret && !GetFeigned() && scanarea_timer.Check()) { if(zone->CanDoCombat() && ret && !GetFeigned() && scanarea_timer.Check()) {
entity_list.CheckClientAggro(this); entity_list.CheckClientAggro(this);
} }
#endif #endif

View File

@ -726,6 +726,7 @@ void Client::AI_SpellCast()
void Client::AI_Process() void Client::AI_Process()
{ {
if (!IsAIControlled()) if (!IsAIControlled())
return; return;
@ -956,6 +957,10 @@ void Mob::AI_Process() {
bool engaged = IsEngaged(); bool engaged = IsEngaged();
bool doranged = false; bool doranged = false;
if (!zone->CanDoCombat()) {
engaged = false;
}
// Begin: Additions for Wiz Fear Code // Begin: Additions for Wiz Fear Code
// //
if(RuleB(Combat, EnableFearPathing)){ if(RuleB(Combat, EnableFearPathing)){
@ -1016,13 +1021,14 @@ void Mob::AI_Process() {
SetTarget(hate_list.GetClosestEntOnHateList(this)); SetTarget(hate_list.GetClosestEntOnHateList(this));
else else
{ {
if(AI_target_check_timer->Check()) if (AI_target_check_timer->Check())
{ {
if (IsFocused()) { if (IsFocused()) {
if (!target) { if (!target) {
SetTarget(hate_list.GetEntWithMostHateOnList(this)); SetTarget(hate_list.GetEntWithMostHateOnList(this));
} }
} else { }
else {
if (!ImprovedTaunt()) if (!ImprovedTaunt())
SetTarget(hate_list.GetEntWithMostHateOnList(this)); SetTarget(hate_list.GetEntWithMostHateOnList(this));
} }
@ -1042,28 +1048,29 @@ void Mob::AI_Process() {
#ifdef BOTS #ifdef BOTS
if (IsPet() && GetOwner() && GetOwner()->IsBot() && target == GetOwner()) if (IsPet() && GetOwner() && GetOwner()->IsBot() && target == GetOwner())
{ {
// this blocks all pet attacks against owner..bot pet test (copied above check) // this blocks all pet attacks against owner..bot pet test (copied above check)
RemoveFromHateList(this); RemoveFromHateList(this);
return; return;
} }
#endif //BOTS #endif //BOTS
if(DivineAura()) if (DivineAura())
return; return;
auto npcSpawnPoint = CastToNPC()->GetSpawnPoint(); auto npcSpawnPoint = CastToNPC()->GetSpawnPoint();
if(GetSpecialAbility(TETHER)) { if (GetSpecialAbility(TETHER)) {
float tether_range = static_cast<float>(GetSpecialAbilityParam(TETHER, 0)); float tether_range = static_cast<float>(GetSpecialAbilityParam(TETHER, 0));
tether_range = tether_range > 0.0f ? tether_range * tether_range : pAggroRange * pAggroRange; tether_range = tether_range > 0.0f ? tether_range * tether_range : pAggroRange * pAggroRange;
if(DistanceSquaredNoZ(m_Position, npcSpawnPoint) > tether_range) { if (DistanceSquaredNoZ(m_Position, npcSpawnPoint) > tether_range) {
GMMove(npcSpawnPoint.x, npcSpawnPoint.y, npcSpawnPoint.z, npcSpawnPoint.w); GMMove(npcSpawnPoint.x, npcSpawnPoint.y, npcSpawnPoint.z, npcSpawnPoint.w);
} }
} else if(GetSpecialAbility(LEASH)) { }
else if (GetSpecialAbility(LEASH)) {
float leash_range = static_cast<float>(GetSpecialAbilityParam(LEASH, 0)); float leash_range = static_cast<float>(GetSpecialAbilityParam(LEASH, 0));
leash_range = leash_range > 0.0f ? leash_range * leash_range : pAggroRange * pAggroRange; leash_range = leash_range > 0.0f ? leash_range * leash_range : pAggroRange * pAggroRange;
if(DistanceSquaredNoZ(m_Position, npcSpawnPoint) > leash_range) { if (DistanceSquaredNoZ(m_Position, npcSpawnPoint) > leash_range) {
GMMove(npcSpawnPoint.x, npcSpawnPoint.y, npcSpawnPoint.z, npcSpawnPoint.w); GMMove(npcSpawnPoint.x, npcSpawnPoint.y, npcSpawnPoint.z, npcSpawnPoint.w);
SetHP(GetMaxHP()); SetHP(GetMaxHP());
BuffFadeAll(); BuffFadeAll();
@ -1080,16 +1087,16 @@ void Mob::AI_Process() {
{ {
if (AI_movement_timer->Check()) if (AI_movement_timer->Check())
{ {
if(CalculateHeadingToTarget(GetTarget()->GetX(), GetTarget()->GetY()) != m_Position.w) if (CalculateHeadingToTarget(GetTarget()->GetX(), GetTarget()->GetY()) != m_Position.w)
{ {
SetHeading(CalculateHeadingToTarget(GetTarget()->GetX(), GetTarget()->GetY())); SetHeading(CalculateHeadingToTarget(GetTarget()->GetX(), GetTarget()->GetY()));
SendPosition(); SendPosition();
} }
SetCurrentSpeed(0); SetCurrentSpeed(0);
} }
if(IsMoving()) if (IsMoving())
{ {
if(CalculateHeadingToTarget(GetTarget()->GetX(), GetTarget()->GetY()) != m_Position.w) if (CalculateHeadingToTarget(GetTarget()->GetX(), GetTarget()->GetY()) != m_Position.w)
{ {
SetHeading(CalculateHeadingToTarget(GetTarget()->GetX(), GetTarget()->GetY())); SetHeading(CalculateHeadingToTarget(GetTarget()->GetX(), GetTarget()->GetY()));
SendPosition(); SendPosition();
@ -1098,13 +1105,13 @@ void Mob::AI_Process() {
} }
//casting checked above... //casting checked above...
if(target && !IsStunned() && !IsMezzed() && GetAppearance() != eaDead && !IsMeleeDisabled()) { if (target && !IsStunned() && !IsMezzed() && GetAppearance() != eaDead && !IsMeleeDisabled()) {
//we should check to see if they die mid-attacks, previous //we should check to see if they die mid-attacks, previous
//crap of checking target for null was not gunna cut it //crap of checking target for null was not gunna cut it
//try main hand first //try main hand first
if(attack_timer.Check()) { if (attack_timer.Check()) {
DoMainHandAttackRounds(target); DoMainHandAttackRounds(target);
TriggerDefensiveProcs(target, EQEmu::inventory::slotPrimary, false); TriggerDefensiveProcs(target, EQEmu::inventory::slotPrimary, false);
@ -1150,17 +1157,17 @@ void Mob::AI_Process() {
if (owner) { if (owner) {
int16 flurry_chance = owner->aabonuses.PetFlurry + int16 flurry_chance = owner->aabonuses.PetFlurry +
owner->spellbonuses.PetFlurry + owner->itembonuses.PetFlurry; owner->spellbonuses.PetFlurry + owner->itembonuses.PetFlurry;
if (flurry_chance && zone->random.Roll(flurry_chance)) if (flurry_chance && zone->random.Roll(flurry_chance))
Flurry(nullptr); Flurry(nullptr);
} }
} }
if ((IsPet() || IsTempPet()) && IsPetOwnerClient()){ if ((IsPet() || IsTempPet()) && IsPetOwnerClient()) {
if (spellbonuses.PC_Pet_Rampage[0] || itembonuses.PC_Pet_Rampage[0] || aabonuses.PC_Pet_Rampage[0]){ if (spellbonuses.PC_Pet_Rampage[0] || itembonuses.PC_Pet_Rampage[0] || aabonuses.PC_Pet_Rampage[0]) {
int chance = spellbonuses.PC_Pet_Rampage[0] + itembonuses.PC_Pet_Rampage[0] + aabonuses.PC_Pet_Rampage[0]; int chance = spellbonuses.PC_Pet_Rampage[0] + itembonuses.PC_Pet_Rampage[0] + aabonuses.PC_Pet_Rampage[0];
if(zone->random.Roll(chance)) { if (zone->random.Roll(chance)) {
Rampage(nullptr); Rampage(nullptr);
} }
} }
@ -1170,30 +1177,30 @@ void Mob::AI_Process() {
{ {
int rampage_chance = GetSpecialAbilityParam(SPECATK_RAMPAGE, 0); int rampage_chance = GetSpecialAbilityParam(SPECATK_RAMPAGE, 0);
rampage_chance = rampage_chance > 0 ? rampage_chance : 20; rampage_chance = rampage_chance > 0 ? rampage_chance : 20;
if(zone->random.Roll(rampage_chance)) { if (zone->random.Roll(rampage_chance)) {
ExtraAttackOptions opts; ExtraAttackOptions opts;
int cur = GetSpecialAbilityParam(SPECATK_RAMPAGE, 3); int cur = GetSpecialAbilityParam(SPECATK_RAMPAGE, 3);
if(cur > 0) { if (cur > 0) {
opts.damage_flat = cur; opts.damage_flat = cur;
} }
cur = GetSpecialAbilityParam(SPECATK_RAMPAGE, 4); cur = GetSpecialAbilityParam(SPECATK_RAMPAGE, 4);
if(cur > 0) { if (cur > 0) {
opts.armor_pen_percent = cur / 100.0f; opts.armor_pen_percent = cur / 100.0f;
} }
cur = GetSpecialAbilityParam(SPECATK_RAMPAGE, 5); cur = GetSpecialAbilityParam(SPECATK_RAMPAGE, 5);
if(cur > 0) { if (cur > 0) {
opts.armor_pen_flat = cur; opts.armor_pen_flat = cur;
} }
cur = GetSpecialAbilityParam(SPECATK_RAMPAGE, 6); cur = GetSpecialAbilityParam(SPECATK_RAMPAGE, 6);
if(cur > 0) { if (cur > 0) {
opts.crit_percent = cur / 100.0f; opts.crit_percent = cur / 100.0f;
} }
cur = GetSpecialAbilityParam(SPECATK_RAMPAGE, 7); cur = GetSpecialAbilityParam(SPECATK_RAMPAGE, 7);
if(cur > 0) { if (cur > 0) {
opts.crit_flat = cur; opts.crit_flat = cur;
} }
Rampage(&opts); Rampage(&opts);
@ -1205,30 +1212,30 @@ void Mob::AI_Process() {
{ {
int rampage_chance = GetSpecialAbilityParam(SPECATK_AREA_RAMPAGE, 0); int rampage_chance = GetSpecialAbilityParam(SPECATK_AREA_RAMPAGE, 0);
rampage_chance = rampage_chance > 0 ? rampage_chance : 20; rampage_chance = rampage_chance > 0 ? rampage_chance : 20;
if(zone->random.Roll(rampage_chance)) { if (zone->random.Roll(rampage_chance)) {
ExtraAttackOptions opts; ExtraAttackOptions opts;
int cur = GetSpecialAbilityParam(SPECATK_AREA_RAMPAGE, 3); int cur = GetSpecialAbilityParam(SPECATK_AREA_RAMPAGE, 3);
if(cur > 0) { if (cur > 0) {
opts.damage_flat = cur; opts.damage_flat = cur;
} }
cur = GetSpecialAbilityParam(SPECATK_AREA_RAMPAGE, 4); cur = GetSpecialAbilityParam(SPECATK_AREA_RAMPAGE, 4);
if(cur > 0) { if (cur > 0) {
opts.armor_pen_percent = cur / 100.0f; opts.armor_pen_percent = cur / 100.0f;
} }
cur = GetSpecialAbilityParam(SPECATK_AREA_RAMPAGE, 5); cur = GetSpecialAbilityParam(SPECATK_AREA_RAMPAGE, 5);
if(cur > 0) { if (cur > 0) {
opts.armor_pen_flat = cur; opts.armor_pen_flat = cur;
} }
cur = GetSpecialAbilityParam(SPECATK_AREA_RAMPAGE, 6); cur = GetSpecialAbilityParam(SPECATK_AREA_RAMPAGE, 6);
if(cur > 0) { if (cur > 0) {
opts.crit_percent = cur / 100.0f; opts.crit_percent = cur / 100.0f;
} }
cur = GetSpecialAbilityParam(SPECATK_AREA_RAMPAGE, 7); cur = GetSpecialAbilityParam(SPECATK_AREA_RAMPAGE, 7);
if(cur > 0) { if (cur > 0) {
opts.crit_flat = cur; opts.crit_flat = cur;
} }
@ -1243,7 +1250,7 @@ void Mob::AI_Process() {
DoOffHandAttackRounds(target); DoOffHandAttackRounds(target);
//now special attacks (kick, etc) //now special attacks (kick, etc)
if(IsNPC()) if (IsNPC())
CastToNPC()->DoClassAttacks(target); CastToNPC()->DoClassAttacks(target);
} }
@ -1252,18 +1259,19 @@ void Mob::AI_Process() {
else { else {
//we cannot reach our target... //we cannot reach our target...
//underwater stuff only works with water maps in the zone! //underwater stuff only works with water maps in the zone!
if(IsNPC() && CastToNPC()->IsUnderwaterOnly() && zone->HasWaterMap()) { if (IsNPC() && CastToNPC()->IsUnderwaterOnly() && zone->HasWaterMap()) {
auto targetPosition = glm::vec3(target->GetX(), target->GetY(), target->GetZ()); auto targetPosition = glm::vec3(target->GetX(), target->GetY(), target->GetZ());
if(!zone->watermap->InLiquid(targetPosition)) { if (!zone->watermap->InLiquid(targetPosition)) {
Mob *tar = hate_list.GetEntWithMostHateOnList(this); Mob *tar = hate_list.GetEntWithMostHateOnList(this);
if(tar == target) { if (tar == target) {
WipeHateList(); WipeHateList();
Heal(); Heal();
BuffFadeAll(); BuffFadeAll();
AI_walking_timer->Start(100); AI_walking_timer->Start(100);
pLastFightingDelayMoving = Timer::GetCurrentTime(); pLastFightingDelayMoving = Timer::GetCurrentTime();
return; return;
} else if(tar != nullptr) { }
else if (tar != nullptr) {
SetTarget(tar); SetTarget(tar);
return; return;
} }
@ -1274,35 +1282,35 @@ void Mob::AI_Process() {
if (!HateSummon()) if (!HateSummon())
{ {
//could not summon them, check ranged... //could not summon them, check ranged...
if(GetSpecialAbility(SPECATK_RANGED_ATK)) if (GetSpecialAbility(SPECATK_RANGED_ATK))
doranged = true; doranged = true;
// Now pursue // Now pursue
// TODO: Check here for another person on hate list with close hate value // TODO: Check here for another person on hate list with close hate value
if(AI_PursueCastCheck()){ if (AI_PursueCastCheck()) {
//we did something, so do not process movement. //we did something, so do not process movement.
} }
else if (AI_movement_timer->Check()) else if (AI_movement_timer->Check())
{ {
if(!IsRooted()) { if (!IsRooted()) {
Log.Out(Logs::Detail, Logs::AI, "Pursuing %s while engaged.", target->GetName()); Log.Out(Logs::Detail, Logs::AI, "Pursuing %s while engaged.", target->GetName());
if(!RuleB(Pathing, Aggro) || !zone->pathing) if (!RuleB(Pathing, Aggro) || !zone->pathing)
CalculateNewPosition2(target->GetX(), target->GetY(), target->GetZ(), GetRunspeed()); CalculateNewPosition2(target->GetX(), target->GetY(), target->GetZ(), GetRunspeed());
else else
{ {
bool WaypointChanged, NodeReached; bool WaypointChanged, NodeReached;
glm::vec3 Goal = UpdatePath(target->GetX(), target->GetY(), target->GetZ(), glm::vec3 Goal = UpdatePath(target->GetX(), target->GetY(), target->GetZ(),
GetRunspeed(), WaypointChanged, NodeReached); GetRunspeed(), WaypointChanged, NodeReached);
if(WaypointChanged) if (WaypointChanged)
tar_ndx = 20; tar_ndx = 20;
CalculateNewPosition2(Goal.x, Goal.y, Goal.z, GetRunspeed()); CalculateNewPosition2(Goal.x, Goal.y, Goal.z, GetRunspeed());
} }
} }
else if(IsMoving()) { else if (IsMoving()) {
SetHeading(CalculateHeadingToTarget(target->GetX(), target->GetY())); SetHeading(CalculateHeadingToTarget(target->GetX(), target->GetY()));
SetCurrentSpeed(0); SetCurrentSpeed(0);
@ -1311,11 +1319,12 @@ void Mob::AI_Process() {
} }
} }
} }
else else {
{
if (m_PlayerState & static_cast<uint32>(PlayerState::Aggressive)) if (m_PlayerState & static_cast<uint32>(PlayerState::Aggressive))
SendRemovePlayerState(PlayerState::Aggressive); SendRemovePlayerState(PlayerState::Aggressive);
if(AI_feign_remember_timer->Check()) {
if(!zone->CanDoCombat() && AI_feign_remember_timer->Check()) {
// 6/14/06 // 6/14/06
// Improved Feign Death Memory // Improved Feign Death Memory
// check to see if any of our previous feigned targets have gotten up. // check to see if any of our previous feigned targets have gotten up.
@ -1340,7 +1349,7 @@ void Mob::AI_Process() {
{ {
//we processed a spell action, so do nothing else. //we processed a spell action, so do nothing else.
} }
else if (AI_scan_area_timer->Check()) else if (!zone->CanDoCombat() && AI_scan_area_timer->Check())
{ {
/* /*
* This is where NPCs look around to see if they want to attack anybody. * This is where NPCs look around to see if they want to attack anybody.