From 1aa3a4b11a692f55f51ccd53ee7b666ec25d7be9 Mon Sep 17 00:00:00 2001 From: Alex King <89047260+Kinglykrab@users.noreply.github.com> Date: Sat, 2 Mar 2024 16:18:37 -0500 Subject: [PATCH] [Bug Fix] Fix Bots/Bot Pets ending up on XTargets (#4132) * [XTargets] * Update eqemu_logsys.h * Update client.cpp * Update table column * Undo unnecessary commit --- common/eqemu_logsys.h | 2 ++ common/eqemu_logsys_log_aliases.h | 10 ++++++++ zone/client.cpp | 39 ++++++++++++++++++++++++------- 3 files changed, 42 insertions(+), 9 deletions(-) diff --git a/common/eqemu_logsys.h b/common/eqemu_logsys.h index d9d4cb7ae..8bf474f34 100644 --- a/common/eqemu_logsys.h +++ b/common/eqemu_logsys.h @@ -141,6 +141,7 @@ namespace Logs { Zoning, EqTime, Corpses, + XTargets, MaxCategoryID /* Don't Remove this */ }; @@ -241,6 +242,7 @@ namespace Logs { "Zoning", "EqTime", "Corpses", + "XTargets" }; } diff --git a/common/eqemu_logsys_log_aliases.h b/common/eqemu_logsys_log_aliases.h index 70c652414..10c9cd98a 100644 --- a/common/eqemu_logsys_log_aliases.h +++ b/common/eqemu_logsys_log_aliases.h @@ -834,6 +834,16 @@ OutF(LogSys, Logs::Detail, Logs::Corpses, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\ } while (0) +#define LogXTargets(message, ...) do {\ + if (LogSys.IsLogEnabled(Logs::General, Logs::XTargets))\ + OutF(LogSys, Logs::General, Logs::XTargets, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\ +} while (0) + +#define LogXTargetsDetail(message, ...) do {\ + if (LogSys.IsLogEnabled(Logs::Detail, Logs::XTargets))\ + OutF(LogSys, Logs::Detail, Logs::XTargets, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\ +} while (0) + #define Log(debug_level, log_category, message, ...) do {\ if (LogSys.IsLogEnabled(debug_level, log_category))\ LogSys.Out(debug_level, log_category, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\ diff --git a/zone/client.cpp b/zone/client.cpp index 273803abc..1bc6a8d96 100644 --- a/zone/client.cpp +++ b/zone/client.cpp @@ -6765,23 +6765,36 @@ void Client::UpdateClientXTarget(Client *c) // IT IS NOT SAFE TO CALL THIS IF IT'S NOT INITIAL AGGRO void Client::AddAutoXTarget(Mob *m, bool send) { + if (m->IsBot() || (m->IsPet() && m->IsPetOwnerBot())) { + return; + } + m_activeautohatermgr->increment_count(m); - if (!XTargettingAvailable() || !XTargetAutoAddHaters || IsXTarget(m)) + if (!XTargettingAvailable() || !XTargetAutoAddHaters || IsXTarget(m)) { return; + } - for(int i = 0; i < GetMaxXTargets(); ++i) - { - if((XTargets[i].Type == Auto) && (XTargets[i].ID == 0)) - { + for (int i = 0; i < GetMaxXTargets(); ++i) { + if (XTargets[i].Type == Auto && XTargets[i].ID == 0) { XTargets[i].ID = m->GetID(); - if (send) // if we don't send we're bulk sending updates later on + + if (send) { // if we don't send we're bulk sending updates later on SendXTargetPacket(i, m); - else + } else { XTargets[i].dirty = true; + } + break; } } + + LogXTargets( + "Adding [{}] to [{}] ({}) XTargets", + m->GetCleanName(), + GetCleanName(), + GetID() + ); } void Client::RemoveXTarget(Mob *m, bool OnlyAutoSlots) @@ -6790,15 +6803,23 @@ void Client::RemoveXTarget(Mob *m, bool OnlyAutoSlots) // now we may need to clean up our CurrentTargetNPC entries for (int i = 0; i < GetMaxXTargets(); ++i) { if (XTargets[i].Type == CurrentTargetNPC && XTargets[i].ID == m->GetID()) { - XTargets[i].Type = Auto; - XTargets[i].ID = 0; + XTargets[i].Type = Auto; + XTargets[i].ID = 0; XTargets[i].dirty = true; } } + auto r = GetRaid(); if (r) { r->UpdateRaidXTargets(); } + + LogXTargets( + "Removing [{}] from [{}] ({}) XTargets", + m->GetCleanName(), + GetCleanName(), + GetID() + ); } void Client::UpdateXTargetType(XTargetType Type, Mob *m, const char *Name)