From 3717c6133e21c188bdb3343fad4631710e17e790 Mon Sep 17 00:00:00 2001 From: crow Date: Tue, 2 Sep 2025 18:00:33 -0500 Subject: [PATCH] clean-ups and fixes simplified code fixed bug where neutral creatures were not captured by the aggroby filter trim white spaces so space between filter and message is permitted but not required --- src/ChatFilter.cpp | 43 ++++++++++++++++--------------------------- 1 file changed, 16 insertions(+), 27 deletions(-) diff --git a/src/ChatFilter.cpp b/src/ChatFilter.cpp index 0b3e7f7a..1cdab40b 100644 --- a/src/ChatFilter.cpp +++ b/src/ChatFilter.cpp @@ -9,9 +9,11 @@ #include "Playerbots.h" #include "RtiTargetValue.h" #include "AiFactory.h" +#include "Log.h" #include #include +#include static std::string ToLower(const std::string& str) { @@ -439,25 +441,18 @@ public: return message; } + // Trim any leading spaces after @aura or @noaura (can use space between prefix and spell ID if desired, but not required) std::string auraIdOrName = message.substr(prefixLen); + auraIdOrName.erase(0, auraIdOrName.find_first_not_of(' ')); if (auraIdOrName.empty()) { return message; } - std::string rest = ""; uint32 auraId = 0; - size_t spacePos = auraIdOrName.find(' '); std::string idStr = (spacePos != std::string::npos) ? auraIdOrName.substr(0, spacePos) : auraIdOrName; - if (spacePos != std::string::npos) - { - rest = auraIdOrName.substr(spacePos + 1); - } - else - { - rest = ""; - } + std::string rest = (spacePos != std::string::npos) ? auraIdOrName.substr(spacePos + 1) : ""; if (!idStr.empty()) { bool isNumeric = std::all_of(idStr.begin(), idStr.end(), ::isdigit); @@ -468,10 +463,7 @@ public: } if (auraId == 0) - { - // Only allow numeric spell IDs return message; - } bool hasAura = bot->HasAura(auraId); bool match = isNoAura ? !hasAura : hasAura; @@ -496,15 +488,17 @@ public: return message; } + // Trim any leading spaces after @aggroby (can use space between prefix and entry ID/creature name if desired, but not required) std::string enemyStr = message.substr(prefixLen); + enemyStr.erase(0, enemyStr.find_first_not_of(' ')); if (enemyStr.empty()) { return message; } + // If creature name is more than one word, it must be enclosed in quotes, e.g. @aggroby "Scarlet Commander Mograine" flee std::string rest = ""; std::string enemyName = ""; - std::string entryIdStr = ""; bool isName = false; uint32 entryId = 0; @@ -534,11 +528,11 @@ public: } else { - size_t spacePos = enemyStr.find(' '); - std::string idOrName = (spacePos != std::string::npos) ? enemyStr.substr(0, spacePos) : enemyStr; - if (spacePos != std::string::npos) + size_t splitPos = enemyStr.find_first_of(" "); + std::string idOrName = (splitPos != std::string::npos) ? enemyStr.substr(0, splitPos) : enemyStr; + if (splitPos != std::string::npos) { - rest = enemyStr.substr(spacePos + 1); + rest = enemyStr.substr(splitPos + 1); } else { @@ -559,22 +553,17 @@ public: } } - // Use nearest hostile npcs value and filter by entryID or name within 100 yards const float radius = 100.0f; - GuidVector npcs = botAI->GetAiObjectContext()->GetValue("nearest hostile npcs")->Get(); + GuidVector npcs = botAI->GetAiObjectContext()->GetValue("nearest npcs")->Get(); bool match = false; for (const auto& guid : npcs) { - Unit* unit = botAI->GetUnit(guid); - if (!unit) + Creature* c = botAI->GetCreature(guid); + if (!c) { continue; } - if (!unit->IsCreature()) - { - continue; - } - Creature* c = static_cast(unit); + bool nameMatch = isName && ToLower(c->GetName()) == ToLower(enemyName); bool idMatch = (entryId != 0) && c->GetEntry() == entryId; if ((nameMatch || idMatch) && c->GetDistance2d(bot) <= radius)