From ee2a399ac8544bbb6cc9d56e88252afce8405fc1 Mon Sep 17 00:00:00 2001 From: Keleborn <22352763+Celandriel@users.noreply.github.com> Date: Fri, 13 Feb 2026 09:19:54 -0800 Subject: [PATCH 01/25] Refactor newrpginfo data union to std::variant (#2079) # Pull Request As I began modifying the newrpginfo to change the types of data it stored, or add new data I found myself with the issue of ending up either with garbage memory if the information wasnt properly stored on status change, or needing complicated destructor patterns for non trivial data sets. --- ## Design Philosophy Make rpginfo able to handle more complicated information in a strongly --- ## Feature Evaluation No Feature changes --- ## How to Test the Changes - Server should be stable for an extended period of time. - Bots should be able to complete quests, fly, etc as they did before. ## Complexity & Impact - Does this change add new decision branches? - [X ] No - [ ] Yes (**explain below**) - Does this change increase per-bot or per-tick processing? - [ ] No - [ X] Yes (**describe and justify impact**) Potentially as there can be more memory involved in the object. - Could this logic scale poorly under load? - [X ] No - [ ] Yes (**explain why**) --- ## Defaults & Configuration - Does this change modify default bot behavior? - [ X] No - [ ] Yes (**explain why**) If this introduces more advanced or AI-heavy logic: - [ ] Lightweight mode remains the default - [ ] More complex behavior is optional and thereby configurable --- ## AI Assistance - Was AI assistance (e.g. ChatGPT or similar tools) used while working on this change? - [ ] No - [ X] Yes (**explain below**) If yes, please specify: - Gemini suggested the use of std::variant as an alternative data structure. I found additinal external references that correlated with the same suggestion of moving away from a union. - Implementation was performed manually with Co-pilot auto-complete --- ## Final Checklist In progress. - [ ] Stability is not compromised - [ ] Performance impact is understood, tested, and acceptable - [ ] Added logic complexity is justified and explained - [ ] Documentation updated if needed --- ## Notes for Reviewers Im not 100% sure if this is a good design choice. There are some things I didnt quite like by the end of this, specifically having to double check whenever accessing data whether exists or not even though an action has already been triggered. But I have a PR in the works where I want to store a full flight path vector, and the union was giving me issues. (It appears that state changes may be occuring in the same tick between RPG status update and the stated action, leading to incorrect data gathering. I ended up solving it by first checking a pointer to the object, and then getting the reference. ```c++ auto* dataPtr = std::get_if(&info.data); if (!dataPtr) return false; auto& data = *dataPtr; ``` --------- Co-authored-by: bashermens <31279994+hermensbas@users.noreply.github.com> --- src/Ai/Base/Value/GrindTargetValue.cpp | 2 +- src/Ai/World/Rpg/Action/NewRpgAction.cpp | 157 ++++++++++++--------- src/Ai/World/Rpg/Action/NewRpgAction.h | 4 +- src/Ai/World/Rpg/NewRpgInfo.cpp | 139 ++++++++++-------- src/Ai/World/Rpg/NewRpgInfo.h | 30 ++-- src/Ai/World/Rpg/Trigger/NewRpgTrigger.cpp | 2 +- src/Bot/RandomPlayerbotMgr.cpp | 2 +- src/PlayerbotAIConfig.h | 21 ++- 8 files changed, 196 insertions(+), 161 deletions(-) diff --git a/src/Ai/Base/Value/GrindTargetValue.cpp b/src/Ai/Base/Value/GrindTargetValue.cpp index ce021a2d9a3..573de8fb06f 100644 --- a/src/Ai/Base/Value/GrindTargetValue.cpp +++ b/src/Ai/Base/Value/GrindTargetValue.cpp @@ -107,7 +107,7 @@ Unit* GrindTargetValue::FindTargetForGrinding(uint32 assistCount) continue; } - bool inactiveGrindStatus = botAI->rpgInfo.status != RPG_WANDER_RANDOM && botAI->rpgInfo.status != RPG_IDLE; + bool inactiveGrindStatus = botAI->rpgInfo.GetStatus() != RPG_WANDER_RANDOM && botAI->rpgInfo.GetStatus() != RPG_IDLE; float aggroRange = 30.0f; if (unit->ToCreature()) diff --git a/src/Ai/World/Rpg/Action/NewRpgAction.cpp b/src/Ai/World/Rpg/Action/NewRpgAction.cpp index 41fec2291c0..2c42741c885 100644 --- a/src/Ai/World/Rpg/Action/NewRpgAction.cpp +++ b/src/Ai/World/Rpg/Action/NewRpgAction.cpp @@ -64,17 +64,18 @@ bool StartRpgDoQuestAction::Execute(Event event) bool NewRpgStatusUpdateAction::Execute(Event event) { NewRpgInfo& info = botAI->rpgInfo; - switch (info.status) + NewRpgStatus status = info.GetStatus(); + switch (status) { case RPG_IDLE: - { return RandomChangeStatus({RPG_GO_CAMP, RPG_GO_GRIND, RPG_WANDER_RANDOM, RPG_WANDER_NPC, RPG_DO_QUEST, RPG_TRAVEL_FLIGHT, RPG_REST}); - } + case RPG_GO_GRIND: { - WorldPosition& originalPos = info.go_grind.pos; - assert(info.go_grind.pos != WorldPosition()); + auto& data = std::get(info.data); + WorldPosition& originalPos = data.pos; + assert(data.pos != WorldPosition()); // GO_GRIND -> WANDER_RANDOM if (bot->GetExactDist(originalPos) < 10.0f) { @@ -85,8 +86,9 @@ bool NewRpgStatusUpdateAction::Execute(Event event) } case RPG_GO_CAMP: { - WorldPosition& originalPos = info.go_camp.pos; - assert(info.go_camp.pos != WorldPosition()); + auto& data = std::get(info.data); + WorldPosition& originalPos = data.pos; + assert(data.pos != WorldPosition()); // GO_CAMP -> WANDER_NPC if (bot->GetExactDist(originalPos) < 10.0f) { @@ -126,7 +128,8 @@ bool NewRpgStatusUpdateAction::Execute(Event event) } case RPG_TRAVEL_FLIGHT: { - if (info.flight.inFlight && !bot->IsInFlight()) + auto& data = std::get(info.data); + if (data.inFlight && !bot->IsInFlight()) { // flight arrival info.ChangeToIdle(); @@ -154,8 +157,10 @@ bool NewRpgGoGrindAction::Execute(Event event) { if (SearchQuestGiverAndAcceptOrReward()) return true; + if (auto* data = std::get_if(&botAI->rpgInfo.data)) + return MoveFarTo(data->pos); - return MoveFarTo(botAI->rpgInfo.go_grind.pos); + return false; } bool NewRpgGoCampAction::Execute(Event event) @@ -163,7 +168,10 @@ bool NewRpgGoCampAction::Execute(Event event) if (SearchQuestGiverAndAcceptOrReward()) return true; - return MoveFarTo(botAI->rpgInfo.go_camp.pos); + if (auto* data = std::get_if(&botAI->rpgInfo.data)) + return MoveFarTo(data->pos); + + return false; } bool NewRpgWanderRandomAction::Execute(Event event) @@ -177,7 +185,11 @@ bool NewRpgWanderRandomAction::Execute(Event event) bool NewRpgWanderNpcAction::Execute(Event event) { NewRpgInfo& info = botAI->rpgInfo; - if (!info.wander_npc.npcOrGo) + auto* dataPtr = std::get_if(&info.data); + if (!dataPtr) + return false; + auto& data = *dataPtr; + if (!data.npcOrGo) { // No npc can be found, switch to IDLE ObjectGuid npcOrGo = ChooseNpcOrGameObjectToInteract(); @@ -186,33 +198,32 @@ bool NewRpgWanderNpcAction::Execute(Event event) info.ChangeToIdle(); return true; } - info.wander_npc.npcOrGo = npcOrGo; - info.wander_npc.lastReach = 0; + data.npcOrGo = npcOrGo; + data.lastReach = 0; return true; } - WorldObject* object = ObjectAccessor::GetWorldObject(*bot, info.wander_npc.npcOrGo); + WorldObject* object = ObjectAccessor::GetWorldObject(*bot, data.npcOrGo); if (object && IsWithinInteractionDist(object)) { - if (!info.wander_npc.lastReach) + if (!data.lastReach) { - info.wander_npc.lastReach = getMSTime(); + data.lastReach = getMSTime(); if (bot->CanInteractWithQuestGiver(object)) - InteractWithNpcOrGameObjectForQuest(info.wander_npc.npcOrGo); + InteractWithNpcOrGameObjectForQuest(data.npcOrGo); return true; } - if (info.wander_npc.lastReach && GetMSTimeDiffToNow(info.wander_npc.lastReach) < npcStayTime) + if (data.lastReach && GetMSTimeDiffToNow(data.lastReach) < npcStayTime) return false; // has reached the npc for more than `npcStayTime`, select the next target - info.wander_npc.npcOrGo = ObjectGuid(); - info.wander_npc.lastReach = 0; + data.npcOrGo = ObjectGuid(); + data.lastReach = 0; } else - { - return MoveWorldObjectTo(info.wander_npc.npcOrGo); - } + return MoveWorldObjectTo(data.npcOrGo); + return true; } @@ -222,29 +233,33 @@ bool NewRpgDoQuestAction::Execute(Event event) return true; NewRpgInfo& info = botAI->rpgInfo; - uint32 questId = RPG_INFO(quest, questId); - const Quest* quest = RPG_INFO(quest, quest); + auto* dataPtr = std::get_if(&info.data); + if (!dataPtr) + return false; + auto& data = *dataPtr; + uint32 questId = data.questId; + const Quest* quest = data.quest; uint8 questStatus = bot->GetQuestStatus(questId); switch (questStatus) { case QUEST_STATUS_INCOMPLETE: - return DoIncompleteQuest(); + return DoIncompleteQuest(data); case QUEST_STATUS_COMPLETE: - return DoCompletedQuest(); + return DoCompletedQuest(data); default: break; } - botAI->rpgInfo.ChangeToIdle(); + info.ChangeToIdle(); return true; } -bool NewRpgDoQuestAction::DoIncompleteQuest() +bool NewRpgDoQuestAction::DoIncompleteQuest(NewRpgInfo::DoQuest& data) { - uint32 questId = RPG_INFO(do_quest, questId); - if (botAI->rpgInfo.do_quest.pos != WorldPosition()) + uint32 questId = data.questId; + if (data.pos != WorldPosition()) { /// @TODO: extract to a new function - int32 currentObjective = botAI->rpgInfo.do_quest.objectiveIdx; + int32 currentObjective = data.objectiveIdx; // check if the objective has completed Quest const* quest = sObjectMgr->GetQuestTemplate(questId); const QuestStatusData& q_status = bot->getQuestStatusMap().at(questId); @@ -263,12 +278,12 @@ bool NewRpgDoQuestAction::DoIncompleteQuest() // the current objective is completed, clear and find a new objective later if (completed) { - botAI->rpgInfo.do_quest.lastReachPOI = 0; - botAI->rpgInfo.do_quest.pos = WorldPosition(); - botAI->rpgInfo.do_quest.objectiveIdx = 0; + data.lastReachPOI = 0; + data.pos = WorldPosition(); + data.objectiveIdx = 0; } } - if (botAI->rpgInfo.do_quest.pos == WorldPosition()) + if (data.pos == WorldPosition()) { std::vector poiInfo; if (!GetQuestPOIPosAndObjectiveIdx(questId, poiInfo)) @@ -291,28 +306,28 @@ bool NewRpgDoQuestAction::DoIncompleteQuest() return false; WorldPosition pos(bot->GetMapId(), dx, dy, dz); - botAI->rpgInfo.do_quest.lastReachPOI = 0; - botAI->rpgInfo.do_quest.pos = pos; - botAI->rpgInfo.do_quest.objectiveIdx = objectiveIdx; + data.lastReachPOI = 0; + data.pos = pos; + data.objectiveIdx = objectiveIdx; } - if (bot->GetDistance(botAI->rpgInfo.do_quest.pos) > 10.0f && !botAI->rpgInfo.do_quest.lastReachPOI) + if (bot->GetDistance(data.pos) > 10.0f && !data.lastReachPOI) { - return MoveFarTo(botAI->rpgInfo.do_quest.pos); + return MoveFarTo(data.pos); } // Now we are near the quest objective // kill mobs and looting quest should be done automatically by grind strategy - if (!botAI->rpgInfo.do_quest.lastReachPOI) + if (!data.lastReachPOI) { - botAI->rpgInfo.do_quest.lastReachPOI = getMSTime(); + data.lastReachPOI = getMSTime(); return true; } // stayed at this POI for more than 5 minutes - if (GetMSTimeDiffToNow(botAI->rpgInfo.do_quest.lastReachPOI) >= poiStayTime) + if (GetMSTimeDiffToNow(data.lastReachPOI) >= poiStayTime) { bool hasProgression = false; - int32 currentObjective = botAI->rpgInfo.do_quest.objectiveIdx; + int32 currentObjective = data.objectiveIdx; // check if the objective has progression Quest const* quest = sObjectMgr->GetQuestTemplate(questId); const QuestStatusData& q_status = bot->getQuestStatusMap().at(questId); @@ -339,21 +354,21 @@ bool NewRpgDoQuestAction::DoIncompleteQuest() return true; } // clear and select another poi later - botAI->rpgInfo.do_quest.lastReachPOI = 0; - botAI->rpgInfo.do_quest.pos = WorldPosition(); - botAI->rpgInfo.do_quest.objectiveIdx = 0; + data.lastReachPOI = 0; + data.pos = WorldPosition(); + data.objectiveIdx = 0; return true; } return MoveRandomNear(20.0f); } -bool NewRpgDoQuestAction::DoCompletedQuest() +bool NewRpgDoQuestAction::DoCompletedQuest(NewRpgInfo::DoQuest& data) { - uint32 questId = RPG_INFO(quest, questId); - const Quest* quest = RPG_INFO(quest, quest); + uint32 questId = data.questId; + const Quest* quest = data.quest; - if (RPG_INFO(quest, objectiveIdx) != -1) + if (data.objectiveIdx != -1) { // if quest is completed, back to poi with -1 idx to reward BroadcastHelper::BroadcastQuestUpdateComplete(botAI, bot, quest); @@ -376,26 +391,26 @@ bool NewRpgDoQuestAction::DoCompletedQuest() return false; WorldPosition pos(bot->GetMapId(), dx, dy, dz); - botAI->rpgInfo.do_quest.lastReachPOI = 0; - botAI->rpgInfo.do_quest.pos = pos; - botAI->rpgInfo.do_quest.objectiveIdx = -1; + data.lastReachPOI = 0; + data.pos = pos; + data.objectiveIdx = -1; } - if (botAI->rpgInfo.do_quest.pos == WorldPosition()) + if (data.pos == WorldPosition()) return false; - if (bot->GetDistance(botAI->rpgInfo.do_quest.pos) > 10.0f && !botAI->rpgInfo.do_quest.lastReachPOI) - return MoveFarTo(botAI->rpgInfo.do_quest.pos); + if (bot->GetDistance(data.pos) > 10.0f && !data.lastReachPOI) + return MoveFarTo(data.pos); // Now we are near the qoi of reward // the quest should be rewarded by SearchQuestGiverAndAcceptOrReward - if (!botAI->rpgInfo.do_quest.lastReachPOI) + if (!data.lastReachPOI) { - botAI->rpgInfo.do_quest.lastReachPOI = getMSTime(); + data.lastReachPOI = getMSTime(); return true; } // stayed at this POI for more than 5 minutes - if (GetMSTimeDiffToNow(botAI->rpgInfo.do_quest.lastReachPOI) >= poiStayTime) + if (GetMSTimeDiffToNow(data.lastReachPOI) >= poiStayTime) { // e.g. Can not reward quest to gameobjects /// @TODO: It may be better to make lowPriorityQuest a global set shared by all bots (or saved in db) @@ -410,29 +425,33 @@ bool NewRpgDoQuestAction::DoCompletedQuest() bool NewRpgTravelFlightAction::Execute(Event event) { + NewRpgInfo& info = botAI->rpgInfo; + auto* dataPtr = std::get_if(&info.data); + if (!dataPtr) + return false; + + auto& data = *dataPtr; if (bot->IsInFlight()) { - botAI->rpgInfo.flight.inFlight = true; + data.inFlight = true; return false; } - Creature* flightMaster = ObjectAccessor::GetCreature(*bot, botAI->rpgInfo.flight.fromFlightMaster); + Creature* flightMaster = ObjectAccessor::GetCreature(*bot, data.fromFlightMaster); if (!flightMaster || !flightMaster->IsAlive()) { botAI->rpgInfo.ChangeToIdle(); return true; } - const TaxiNodesEntry* entry = sTaxiNodesStore.LookupEntry(botAI->rpgInfo.flight.toNode); + const TaxiNodesEntry* entry = sTaxiNodesStore.LookupEntry(data.toNode); if (bot->GetDistance(flightMaster) > INTERACTION_DISTANCE) - { return MoveFarTo(flightMaster); - } - std::vector nodes = {botAI->rpgInfo.flight.fromNode, botAI->rpgInfo.flight.toNode}; + + std::vector nodes = {data.fromNode, data.toNode}; botAI->RemoveShapeshift(); if (bot->IsMounted()) - { bot->Dismount(); - } + if (!bot->ActivateTaxiPathTo(nodes, flightMaster, 0)) { LOG_DEBUG("playerbots", "[New RPG] {} active taxi path {} (from {} to {}) failed", bot->GetName(), diff --git a/src/Ai/World/Rpg/Action/NewRpgAction.h b/src/Ai/World/Rpg/Action/NewRpgAction.h index 0e621fc406a..a8cb7a2bcef 100644 --- a/src/Ai/World/Rpg/Action/NewRpgAction.h +++ b/src/Ai/World/Rpg/Action/NewRpgAction.h @@ -90,8 +90,8 @@ class NewRpgDoQuestAction : public NewRpgBaseAction bool Execute(Event event) override; protected: - bool DoIncompleteQuest(); - bool DoCompletedQuest(); + bool DoIncompleteQuest(NewRpgInfo::DoQuest& data); + bool DoCompletedQuest(NewRpgInfo::DoQuest& data); const uint32 poiStayTime = 5 * 60 * 1000; }; diff --git a/src/Ai/World/Rpg/NewRpgInfo.cpp b/src/Ai/World/Rpg/NewRpgInfo.cpp index 889fb1ff929..def0d472de1 100644 --- a/src/Ai/World/Rpg/NewRpgInfo.cpp +++ b/src/Ai/World/Rpg/NewRpgInfo.cpp @@ -6,71 +6,65 @@ void NewRpgInfo::ChangeToGoGrind(WorldPosition pos) { - Reset(); - status = RPG_GO_GRIND; - go_grind = GoGrind(); - go_grind.pos = pos; + startT = getMSTime(); + data = GoGrind{pos}; } void NewRpgInfo::ChangeToGoCamp(WorldPosition pos) { - Reset(); - status = RPG_GO_CAMP; - go_camp = GoCamp(); - go_camp.pos = pos; + startT = getMSTime(); + data = GoCamp{pos}; } void NewRpgInfo::ChangeToWanderNpc() { - Reset(); - status = RPG_WANDER_NPC; - wander_npc = WanderNpc(); + startT = getMSTime(); + data = WanderNpc{}; } void NewRpgInfo::ChangeToWanderRandom() { - Reset(); - status = RPG_WANDER_RANDOM; - WANDER_RANDOM = WanderRandom(); + startT = getMSTime(); + data = WanderRandom{}; } void NewRpgInfo::ChangeToDoQuest(uint32 questId, const Quest* quest) { - Reset(); - status = RPG_DO_QUEST; - do_quest = DoQuest(); + startT = getMSTime(); + DoQuest do_quest; do_quest.questId = questId; do_quest.quest = quest; + data = do_quest; } void NewRpgInfo::ChangeToTravelFlight(ObjectGuid fromFlightMaster, uint32 fromNode, uint32 toNode) { - Reset(); - status = RPG_TRAVEL_FLIGHT; - flight = TravelFlight(); + startT = getMSTime(); + TravelFlight flight; flight.fromFlightMaster = fromFlightMaster; flight.fromNode = fromNode; flight.toNode = toNode; + flight.inFlight = false; + data = flight; } void NewRpgInfo::ChangeToRest() { - Reset(); - status = RPG_REST; - rest = Rest(); + startT = getMSTime(); + data = Rest{}; } void NewRpgInfo::ChangeToIdle() { - Reset(); - status = RPG_IDLE; + startT = getMSTime(); + data = Idle{}; } bool NewRpgInfo::CanChangeTo(NewRpgStatus status) { return true; } void NewRpgInfo::Reset() { - *this = NewRpgInfo(); + data = Idle{}; startT = getMSTime(); } @@ -82,58 +76,83 @@ void NewRpgInfo::SetMoveFarTo(WorldPosition pos) moveFarPos = pos; } +NewRpgStatus NewRpgInfo::GetStatus() +{ + return std::visit([](auto&& arg) -> NewRpgStatus { + using T = std::decay_t; + if constexpr (std::is_same_v) return RPG_IDLE; + if constexpr (std::is_same_v) return RPG_GO_GRIND; + if constexpr (std::is_same_v) return RPG_GO_CAMP; + if constexpr (std::is_same_v) return RPG_WANDER_NPC; + if constexpr (std::is_same_v) return RPG_WANDER_RANDOM; + if constexpr (std::is_same_v) return RPG_REST; + if constexpr (std::is_same_v) return RPG_DO_QUEST; + if constexpr (std::is_same_v) return RPG_TRAVEL_FLIGHT; + return RPG_IDLE; + }, data); +} + std::string NewRpgInfo::ToString() { std::stringstream out; out << "Status: "; - switch (status) + std::visit([&out, this](auto&& arg) { - case RPG_GO_GRIND: + using T = std::decay_t; + if constexpr (std::is_same_v) + { out << "GO_GRIND"; - out << "\nGrindPos: " << go_grind.pos.GetMapId() << " " << go_grind.pos.GetPositionX() << " " - << go_grind.pos.GetPositionY() << " " << go_grind.pos.GetPositionZ(); + out << "\nGrindPos: " << arg.pos.GetMapId() << " " << arg.pos.GetPositionX() << " " + << arg.pos.GetPositionY() << " " << arg.pos.GetPositionZ(); out << "\nlastGoGrind: " << startT; - break; - case RPG_GO_CAMP: + } + else if constexpr (std::is_same_v) + { out << "GO_CAMP"; - out << "\nCampPos: " << go_camp.pos.GetMapId() << " " << go_camp.pos.GetPositionX() << " " - << go_camp.pos.GetPositionY() << " " << go_camp.pos.GetPositionZ(); + out << "\nCampPos: " << arg.pos.GetMapId() << " " << arg.pos.GetPositionX() << " " + << arg.pos.GetPositionY() << " " << arg.pos.GetPositionZ(); out << "\nlastGoCamp: " << startT; - break; - case RPG_WANDER_NPC: + } + else if constexpr (std::is_same_v) + { out << "WANDER_NPC"; - out << "\nnpcOrGoEntry: " << wander_npc.npcOrGo.GetCounter(); + out << "\nnpcOrGoEntry: " << arg.npcOrGo.GetCounter(); out << "\nlastWanderNpc: " << startT; - out << "\nlastReachNpcOrGo: " << wander_npc.lastReach; - break; - case RPG_WANDER_RANDOM: + out << "\nlastReachNpcOrGo: " << arg.lastReach; + } + else if constexpr (std::is_same_v) + { out << "WANDER_RANDOM"; out << "\nlastWanderRandom: " << startT; - break; - case RPG_IDLE: + } + else if constexpr (std::is_same_v) + { out << "IDLE"; - break; - case RPG_REST: + } + else if constexpr (std::is_same_v) + { out << "REST"; out << "\nlastRest: " << startT; - break; - case RPG_DO_QUEST: + } + else if constexpr (std::is_same_v) + { out << "DO_QUEST"; - out << "\nquestId: " << do_quest.questId; - out << "\nobjectiveIdx: " << do_quest.objectiveIdx; - out << "\npoiPos: " << do_quest.pos.GetMapId() << " " << do_quest.pos.GetPositionX() << " " - << do_quest.pos.GetPositionY() << " " << do_quest.pos.GetPositionZ(); - out << "\nlastReachPOI: " << do_quest.lastReachPOI ? GetMSTimeDiffToNow(do_quest.lastReachPOI) : 0; - break; - case RPG_TRAVEL_FLIGHT: + out << "\nquestId: " << arg.questId; + out << "\nobjectiveIdx: " << arg.objectiveIdx; + out << "\npoiPos: " << arg.pos.GetMapId() << " " << arg.pos.GetPositionX() << " " + << arg.pos.GetPositionY() << " " << arg.pos.GetPositionZ(); + out << "\nlastReachPOI: " << (arg.lastReachPOI ? GetMSTimeDiffToNow(arg.lastReachPOI) : 0); + } + else if constexpr (std::is_same_v) + { out << "TRAVEL_FLIGHT"; - out << "\nfromFlightMaster: " << flight.fromFlightMaster.GetEntry(); - out << "\nfromNode: " << flight.fromNode; - out << "\ntoNode: " << flight.toNode; - out << "\ninFlight: " << flight.inFlight; - break; - default: + out << "\nfromFlightMaster: " << arg.fromFlightMaster.GetEntry(); + out << "\nfromNode: " << arg.fromNode; + out << "\ntoNode: " << arg.toNode; + out << "\ninFlight: " << arg.inFlight; + } + else out << "UNKNOWN"; - } + }, data); return out.str(); } diff --git a/src/Ai/World/Rpg/NewRpgInfo.h b/src/Ai/World/Rpg/NewRpgInfo.h index 20f801bf735..5b6ae3cb95e 100644 --- a/src/Ai/World/Rpg/NewRpgInfo.h +++ b/src/Ai/World/Rpg/NewRpgInfo.h @@ -13,7 +13,8 @@ using NewRpgStatusTransitionProb = std::vector>; struct NewRpgInfo { - NewRpgInfo() {} + NewRpgInfo() : data(Idle{}) {} + ~NewRpgInfo() = default; // RPG_GO_GRIND struct GoGrind @@ -61,7 +62,6 @@ struct NewRpgInfo struct Idle { }; - NewRpgStatus status{RPG_IDLE}; uint32 startT{0}; // start timestamp of the current status @@ -72,18 +72,19 @@ struct NewRpgInfo WorldPosition moveFarPos; // END MOVE_FAR - union - { - GoGrind go_grind; - GoCamp go_camp; - WanderNpc wander_npc; - WanderRandom WANDER_RANDOM; - DoQuest do_quest; - Rest rest; - DoQuest quest; - TravelFlight flight; - }; + using RpgData = std::variant< + Idle, + GoGrind, + GoCamp, + WanderNpc, + WanderRandom, + DoQuest, + Rest, + TravelFlight + >; + RpgData data; + NewRpgStatus GetStatus(); bool HasStatusPersisted(uint32 maxDuration) { return GetMSTimeDiffToNow(startT) > maxDuration; } void ChangeToGoGrind(WorldPosition pos); void ChangeToGoCamp(WorldPosition pos); @@ -127,7 +128,4 @@ struct NewRpgStatistic } }; -// not sure is it necessary but keep it for now -#define RPG_INFO(x, y) botAI->rpgInfo.x.y - #endif diff --git a/src/Ai/World/Rpg/Trigger/NewRpgTrigger.cpp b/src/Ai/World/Rpg/Trigger/NewRpgTrigger.cpp index 0804320ad94..65e78eb4cae 100644 --- a/src/Ai/World/Rpg/Trigger/NewRpgTrigger.cpp +++ b/src/Ai/World/Rpg/Trigger/NewRpgTrigger.cpp @@ -1,4 +1,4 @@ #include "NewRpgTriggers.h" #include "PlayerbotAI.h" -bool NewRpgStatusTrigger::IsActive() { return status == botAI->rpgInfo.status; } +bool NewRpgStatusTrigger::IsActive() { return status == botAI->rpgInfo.GetStatus(); } diff --git a/src/Bot/RandomPlayerbotMgr.cpp b/src/Bot/RandomPlayerbotMgr.cpp index 892368c66f1..c2b3fae3c26 100644 --- a/src/Bot/RandomPlayerbotMgr.cpp +++ b/src/Bot/RandomPlayerbotMgr.cpp @@ -3252,7 +3252,7 @@ void RandomPlayerbotMgr::PrintStats() if (sPlayerbotAIConfig.enableNewRpgStrategy) { - rpgStatusCount[botAI->rpgInfo.status]++; + rpgStatusCount[botAI->rpgInfo.GetStatus()]++; rpgStasticTotal += botAI->rpgStatistic; botAI->rpgStatistic = NewRpgStatistic(); } diff --git a/src/PlayerbotAIConfig.h b/src/PlayerbotAIConfig.h index 729fc5be161..27177565cdf 100644 --- a/src/PlayerbotAIConfig.h +++ b/src/PlayerbotAIConfig.h @@ -42,21 +42,20 @@ enum class HealingManaEfficiency : uint8 enum NewRpgStatus : int { - RPG_STATUS_START = 0, - // Going to far away place - RPG_GO_GRIND = 0, - RPG_GO_CAMP = 1, + //Initial Status + RPG_IDLE = 0, + RPG_GO_GRIND = 1, + RPG_GO_CAMP = 2, // Exploring nearby - RPG_WANDER_RANDOM = 2, - RPG_WANDER_NPC = 3, + RPG_WANDER_RANDOM = 3, + RPG_WANDER_NPC = 4, // Do Quest (based on quest status) - RPG_DO_QUEST = 4, + RPG_DO_QUEST = 5, // Travel - RPG_TRAVEL_FLIGHT = 5, + + RPG_TRAVEL_FLIGHT = 6, // Taking a break - RPG_REST = 6, - // Initial status - RPG_IDLE = 7, + RPG_REST = 7, RPG_STATUS_END = 8 }; From 80b3823f128adaed494ef5e2ac2ed6d8dda93cb8 Mon Sep 17 00:00:00 2001 From: Keleborn <22352763+Celandriel@users.noreply.github.com> Date: Fri, 13 Feb 2026 09:22:27 -0800 Subject: [PATCH 02/25] Warnings PR 3, remove std::move when not necessary. (#2108) # Pull Request std::move was being used in a few places to return a vector. Its not necessary. A direct return allows for some optimizations that moving wouldnt. ## How to Test the Changes -Bots should initialize correctly ## Complexity & Impact - Does this change add new decision branches? - [x] No - [ ] Yes (**explain below**) - Does this change increase per-bot or per-tick processing? - [x] No - [ ] Yes (**describe and justify impact**) - Could this logic scale poorly under load? - [x] No - [ ] Yes (**explain why**) --- ## Defaults & Configuration - Does this change modify default bot behavior? - [x] No - [ ] Yes (**explain why**) If this introduces more advanced or AI-heavy logic: - [x] Lightweight mode remains the default - [ ] More complex behavior is optional and thereby configurable --- ## AI Assistance - Was AI assistance (e.g. ChatGPT or similar tools) used while working on this change? - [x] No - [ ] Yes (**explain below**) --- ## Final Checklist - [ ] Stability is not compromised - [ ] Performance impact is understood, tested, and acceptable - [ ] Added logic complexity is justified and explained - [ ] Documentation updated if needed --- ## Notes for Reviewers Anything that significantly improves realism at the cost of stability or performance should be carefully discussed before merging. --------- Co-authored-by: bashermens <31279994+hermensbas@users.noreply.github.com> --- src/Ai/Base/Actions/ChangeTalentsAction.cpp | 4 ++-- src/Bot/Factory/RandomPlayerbotFactory.cpp | 18 +++++++++--------- src/Bot/RandomPlayerbotMgr.cpp | 2 +- src/Mgr/Item/RandomItemMgr.cpp | 8 ++++---- src/Mgr/Talent/Talentspec.cpp | 4 ++-- src/Mgr/Travel/TravelMgr.cpp | 4 ++-- src/Mgr/Travel/TravelMgr.h | 4 ++-- src/Mgr/Travel/TravelNode.cpp | 4 ++-- 8 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/Ai/Base/Actions/ChangeTalentsAction.cpp b/src/Ai/Base/Actions/ChangeTalentsAction.cpp index 9b57a201a09..df09dadaca3 100644 --- a/src/Ai/Base/Actions/ChangeTalentsAction.cpp +++ b/src/Ai/Base/Actions/ChangeTalentsAction.cpp @@ -184,7 +184,7 @@ std::string ChangeTalentsAction::SpecApply(std::string param) // // } // // } -// return std::move(ret); +// return ret; // } // std::vector ChangeTalentsAction::getPremadePaths(TalentSpec* oldSpec) @@ -201,7 +201,7 @@ std::string ChangeTalentsAction::SpecApply(std::string param) // // } // // } -// return std::move(ret); +// return ret; // } // TalentPath* ChangeTalentsAction::getPremadePath(uint32 id) diff --git a/src/Bot/Factory/RandomPlayerbotFactory.cpp b/src/Bot/Factory/RandomPlayerbotFactory.cpp index 0fd7e90e21b..e2e6ffb11a7 100644 --- a/src/Bot/Factory/RandomPlayerbotFactory.cpp +++ b/src/Bot/Factory/RandomPlayerbotFactory.cpp @@ -277,7 +277,7 @@ std::string const RandomPlayerbotFactory::CreateRandomBotName(NameRaceAndGender botName.clear(); continue; } - return std::move(botName); + return botName; } // TRUE RANDOM NAME GENERATION @@ -302,11 +302,11 @@ std::string const RandomPlayerbotFactory::CreateRandomBotName(NameRaceAndGender botName.clear(); continue; } - return std::move(botName); + return botName; } LOG_ERROR("playerbots", "Random name generation failed."); botName.clear(); - return std::move(botName); + return botName; } // Calculates the total number of required accounts, either using the specified randomBotAccountCount @@ -763,7 +763,7 @@ std::string const RandomPlayerbotFactory::CreateRandomGuildName() if (!result) { LOG_ERROR("playerbots", "No more names left for random guilds"); - return std::move(guildName); + return guildName; } Field* fields = result->Fetch(); @@ -777,13 +777,13 @@ std::string const RandomPlayerbotFactory::CreateRandomGuildName() if (!result) { LOG_ERROR("playerbots", "No more names left for random guilds"); - return std::move(guildName); + return guildName; } fields = result->Fetch(); guildName = fields[0].Get(); - return std::move(guildName); + return guildName; } void RandomPlayerbotFactory::CreateRandomArenaTeams(ArenaType type, uint32 count) @@ -905,7 +905,7 @@ std::string const RandomPlayerbotFactory::CreateRandomArenaTeamName() if (!result) { LOG_ERROR("playerbots", "No more names left for random arena teams"); - return std::move(arenaTeamName); + return arenaTeamName; } Field* fields = result->Fetch(); @@ -920,11 +920,11 @@ std::string const RandomPlayerbotFactory::CreateRandomArenaTeamName() if (!result) { LOG_ERROR("playerbots", "No more names left for random arena teams"); - return std::move(arenaTeamName); + return arenaTeamName; } fields = result->Fetch(); arenaTeamName = fields[0].Get(); - return std::move(arenaTeamName); + return arenaTeamName; } diff --git a/src/Bot/RandomPlayerbotMgr.cpp b/src/Bot/RandomPlayerbotMgr.cpp index c2b3fae3c26..fad757fa931 100644 --- a/src/Bot/RandomPlayerbotMgr.cpp +++ b/src/Bot/RandomPlayerbotMgr.cpp @@ -2680,7 +2680,7 @@ std::vector RandomPlayerbotMgr::GetBgBots(uint32 bracket) } while (result->NextRow()); } - return std::move(BgBots); + return BgBots; } CachedEvent* RandomPlayerbotMgr::FindEvent(uint32 bot, std::string const& event) diff --git a/src/Mgr/Item/RandomItemMgr.cpp b/src/Mgr/Item/RandomItemMgr.cpp index 1053e542e61..4abd2eaa9d0 100644 --- a/src/Mgr/Item/RandomItemMgr.cpp +++ b/src/Mgr/Item/RandomItemMgr.cpp @@ -1700,7 +1700,7 @@ std::vector RandomItemMgr::GetQuestIdsForItem(uint32 itemId) } } - return std::move(questIds); + return questIds; } uint32 RandomItemMgr::GetUpgrade(Player* player, std::string spec, uint8 slot, uint32 quality, uint32 itemId) @@ -1827,7 +1827,7 @@ std::vector RandomItemMgr::GetUpgradeList(Player* player, std::string sp { std::vector listItems; if (!player) - return std::move(listItems); + return listItems; // get old item statWeight uint32 oldStatWeight = 0; @@ -1848,7 +1848,7 @@ std::vector RandomItemMgr::GetUpgradeList(Player* player, std::string sp } if (!specId) - return std::move(listItems); + return listItems; if (itemId && itemInfoCache.find(itemId) != itemInfoCache.end()) { @@ -1942,7 +1942,7 @@ std::vector RandomItemMgr::GetUpgradeList(Player* player, std::string sp LOG_INFO("playerbots", "New Items: {}, Old item:%d, New items max: {}", listItems.size(), oldStatWeight, closestUpgradeWeight); - return std::move(listItems); + return listItems; } bool RandomItemMgr::HasStatWeight(uint32 itemId) diff --git a/src/Mgr/Talent/Talentspec.cpp b/src/Mgr/Talent/Talentspec.cpp index 06e70b841c5..df647baf10c 100644 --- a/src/Mgr/Talent/Talentspec.cpp +++ b/src/Mgr/Talent/Talentspec.cpp @@ -317,7 +317,7 @@ std::vector TalentSpec::GetTalentTree(uint32 tabpag if (entry.tabPage() == tabpage) retList.push_back(entry); - return std::move(retList); + return retList; } uint32 TalentSpec::GetTalentPoints(int32 tabpage) { return GetTalentPoints(talents, tabpage); }; @@ -368,7 +368,7 @@ std::string const TalentSpec::GetTalentLink() if (treeLink[2] != "0") link = link + "-" + treeLink[2]; - return std::move(link); + return link; } uint32 TalentSpec::highestTree() diff --git a/src/Mgr/Travel/TravelMgr.cpp b/src/Mgr/Travel/TravelMgr.cpp index 748f929aa70..02454edc537 100644 --- a/src/Mgr/Travel/TravelMgr.cpp +++ b/src/Mgr/Travel/TravelMgr.cpp @@ -480,7 +480,7 @@ std::string const WorldPosition::getAreaName(bool fullName, bool zoneName) } } - return std::move(areaName); + return areaName; } std::set WorldPosition::getTransports(uint32 entry) @@ -4022,7 +4022,7 @@ std::vector TravelMgr::getRpgTravelDestinations(Player* bot, retTravelLocations.push_back(dest); } - return std::move(retTravelLocations); + return retTravelLocations; } std::vector TravelMgr::getExploreTravelDestinations(Player* bot, bool ignoreFull, diff --git a/src/Mgr/Travel/TravelMgr.h b/src/Mgr/Travel/TravelMgr.h index 251313736aa..68542a7d07f 100644 --- a/src/Mgr/Travel/TravelMgr.h +++ b/src/Mgr/Travel/TravelMgr.h @@ -440,7 +440,7 @@ std::vector> GetPosList(std::vector oList) for (auto& obj : oList) retList.push_back(std::make_pair(obj, WorldPosition(obj))); - return std::move(retList); + return retList; }; template @@ -450,7 +450,7 @@ std::vector> GetPosVector(std::vector oList) for (auto& obj : oList) retList.push_back(make_pair(obj, WorldPosition(obj))); - return std::move(retList); + return retList; }; class mapTransfer diff --git a/src/Mgr/Travel/TravelNode.cpp b/src/Mgr/Travel/TravelNode.cpp index 5d740075daf..0cb88f9b11d 100644 --- a/src/Mgr/Travel/TravelNode.cpp +++ b/src/Mgr/Travel/TravelNode.cpp @@ -364,7 +364,7 @@ std::vector TravelNode::getNodeMap(bool importantOnly, std::vector< } } - return std::move(closeList); + return closeList; } bool TravelNode::isUselessLink(TravelNode* farNode) @@ -1135,7 +1135,7 @@ std::vector TravelNodeMap::getNodes(WorldPosition pos, float range) [pos](TravelNode* i, TravelNode* j) { return i->getPosition()->distance(pos) < j->getPosition()->distance(pos); }); - return std::move(retVec); + return retVec; } TravelNode* TravelNodeMap::getNode(WorldPosition pos, [[maybe_unused]] std::vector& ppath, Unit* bot, From a0a50204eca3d8cd917d63828e32c3a3b82ec3ab Mon Sep 17 00:00:00 2001 From: privatecore Date: Fri, 13 Feb 2026 18:24:11 +0100 Subject: [PATCH 03/25] Fix action validation checks: isUseful -> isPossible + codestyle fixes and corrections (#2125) # Pull Request Fix the incorrect logic flaw when processing actions from different sources. It should be: `isUseful` -> `isPossible`. The original logic is based on the Mangosbot code and the impl presented inside `Engine::DoNextAction`. This should fix all wrong validation orders for triggers and direct/specific actions. Code style is based on the AzerothCore style guide + clang-format. --- ## Design Philosophy We prioritize **stability, performance, and predictability** over behavioral realism. Complex player-mimicking logic is intentionally limited due to its negative impact on scalability, maintainability, and long-term robustness. Excessive processing overhead can lead to server hiccups, increased CPU usage, and degraded performance for all participants. Because every action and decision tree is executed **per bot and per trigger**, even small increases in logic complexity can scale poorly and negatively affect both players and world (random) bots. Bots are not expected to behave perfectly, and perfect simulation of human decision-making is not a project goal. Increased behavioral realism often introduces disproportionate cost, reduced predictability, and significantly higher maintenance overhead. Every additional branch of logic increases long-term responsibility. All decision paths must be tested, validated, and maintained continuously as the system evolves. If advanced or AI-intensive behavior is introduced, the **default configuration must remain the lightweight decision model**. More complex behavior should only be available as an **explicit opt-in option**, clearly documented as having a measurable performance cost. Principles: - **Stability before intelligence** A stable system is always preferred over a smarter one. - **Performance is a shared resource** Any increase in bot cost affects all players and all bots. - **Simple logic scales better than smart logic** Predictable behavior under load is more valuable than perfect decisions. - **Complexity must justify itself** If a feature cannot clearly explain its cost, it should not exist. - **Defaults must be cheap** Expensive behavior must always be optional and clearly communicated. - **Bots should look reasonable, not perfect** The goal is believable behavior, not human simulation. Before submitting, confirm that this change aligns with those principles. --- ## Feature Evaluation Please answer the following: - Describe the **minimum logic** required to achieve the intended behavior? - Describe the **cheapest implementation** that produces an acceptable result? - Describe the **runtime cost** when this logic executes across many bots? --- ## How to Test the Changes - Step-by-step instructions to test the change - Any required setup (e.g. multiple players, bots, specific configuration) - Expected behavior and how to verify it ## Complexity & Impact Does this change add new decision branches? - - [x] No - - [ ] Yes (**explain below**) Does this change increase per-bot or per-tick processing? - - [x] No - - [ ] Yes (**describe and justify impact**) Could this logic scale poorly under load? - - [x] No - - [ ] Yes (**explain why**) --- ## Defaults & Configuration Does this change modify default bot behavior? - - [x] No - - [ ] Yes (**explain why**) If this introduces more advanced or AI-heavy logic: - - [ ] Lightweight mode remains the default - - [ ] More complex behavior is optional and thereby configurable --- ## AI Assistance Was AI assistance (e.g. ChatGPT or similar tools) used while working on this change? - - [x] No - - [ ] Yes (**explain below**) If yes, please specify: - AI tool or model used (e.g. ChatGPT, GPT-4, Claude, etc.) - Purpose of usage (e.g. brainstorming, refactoring, documentation, code generation) - Which parts of the change were influenced or generated - Whether the result was manually reviewed and adapted AI assistance is allowed, but all submitted code must be fully understood, reviewed, and owned by the contributor. Any AI-influenced changes must be verified against existing CORE and PB logic. We expect contributors to be honest about what they do and do not understand. --- ## Final Checklist - - [x] Stability is not compromised - - [x] Performance impact is understood, tested, and acceptable - - [x] Added logic complexity is justified and explained - - [x] Documentation updated if needed --- ## Notes for Reviewers Anything that significantly improves realism at the cost of stability or performance should be carefully discussed before merging. --- src/Ai/Base/Actions/CheckMountStateAction.cpp | 114 +++++++++--------- src/Ai/Base/Actions/ChooseTargetActions.cpp | 64 +++++----- src/Ai/Base/Actions/FishingAction.h | 17 ++- src/Ai/Base/Actions/GenericSpellActions.cpp | 55 +++++---- src/Ai/Base/Actions/GenericSpellActions.h | 2 +- src/Ai/Base/Actions/NonCombatActions.cpp | 29 ++--- src/Ai/Base/Actions/RpgAction.cpp | 2 +- src/Ai/Base/Actions/UseItemAction.cpp | 23 ++-- src/Ai/Base/Actions/UseItemAction.h | 6 +- .../Druid/Action/DruidShapeshiftActions.cpp | 26 ++-- .../Druid/Action/DruidShapeshiftActions.h | 7 +- src/Ai/Class/Priest/Action/PriestActions.cpp | 6 +- src/Ai/Class/Priest/Action/PriestActions.h | 23 +++- src/Ai/Class/Rogue/Action/RogueActions.h | 25 ++-- .../Class/Warrior/Action/WarriorActions.cpp | 32 ++--- src/Ai/Class/Warrior/Action/WarriorActions.h | 9 +- .../EyeOfEternity/Action/RaidEoEActions.h | 38 +++--- src/Bot/Engine/Action/Action.h | 21 +++- src/Bot/Engine/Engine.cpp | 8 +- 19 files changed, 266 insertions(+), 241 deletions(-) diff --git a/src/Ai/Base/Actions/CheckMountStateAction.cpp b/src/Ai/Base/Actions/CheckMountStateAction.cpp index 5ab7cc0f922..0d7fe432166 100644 --- a/src/Ai/Base/Actions/CheckMountStateAction.cpp +++ b/src/Ai/Base/Actions/CheckMountStateAction.cpp @@ -55,63 +55,6 @@ MountData CollectMountData(const Player* bot) return data; } -bool CheckMountStateAction::isUseful() -{ - // Not useful when: - if (botAI->IsInVehicle() || bot->isDead() || bot->HasUnitState(UNIT_STATE_IN_FLIGHT) || - !bot->IsOutdoors() || bot->InArena()) - return false; - - master = GetMaster(); - - // Get shapeshift states, only applicable when there's a master - if (master) - { - botInShapeshiftForm = bot->GetShapeshiftForm(); - masterInShapeshiftForm = master->GetShapeshiftForm(); - } - - // Not useful when in combat and not currently mounted / travel formed - if ((bot->IsInCombat() || botAI->GetState() == BOT_STATE_COMBAT) && - !bot->IsMounted() && botInShapeshiftForm != FORM_TRAVEL && botInShapeshiftForm != FORM_FLIGHT && botInShapeshiftForm != FORM_FLIGHT_EPIC) - return false; - - // In addition to checking IsOutdoors, also check whether bot is clipping below floor slightly because that will - // cause bot to falsly indicate they are outdoors. This fixes bug where bot tries to mount indoors (which seems - // to mostly be an issue in tunnels of WSG and AV) - float posZ = bot->GetPositionZ(); - float groundLevel = bot->GetMapWaterOrGroundLevel(bot->GetPositionX(), bot->GetPositionY(), posZ); - if (!bot->IsMounted() && !bot->HasWaterWalkAura() && posZ < groundLevel) - return false; - - // Not useful when bot does not have mount strat and is not currently mounted - if (!GET_PLAYERBOT_AI(bot)->HasStrategy("mount", BOT_STATE_NON_COMBAT) && !bot->IsMounted()) - return false; - - // Not useful when level lower than minimum required - if (bot->GetLevel() < sPlayerbotAIConfig.useGroundMountAtMinLevel) - return false; - - // Allow mounting while transformed only if the form allows it - if (bot->HasAuraType(SPELL_AURA_TRANSFORM) && bot->IsInDisallowedMountForm()) - return false; - - // BG Logic - if (bot->InBattleground()) - { - // Do not use when carrying BG Flags - if (bot->HasAura(BG_WS_SPELL_WARSONG_FLAG) || bot->HasAura(BG_WS_SPELL_SILVERWING_FLAG) || bot->HasAura(BG_EY_NETHERSTORM_FLAG_SPELL)) - return false; - - // Only mount if BG starts in less than 30 sec - if (Battleground* bg = bot->GetBattleground()) - if (bg->GetStatus() == STATUS_WAIT_JOIN && bg->GetStartDelayTime() > BG_START_DELAY_30S) - return false; - } - - return true; -} - bool CheckMountStateAction::Execute(Event /*event*/) { // Determine if there are no attackers @@ -182,6 +125,63 @@ bool CheckMountStateAction::Execute(Event /*event*/) return false; } +bool CheckMountStateAction::isUseful() +{ + // Not useful when: + if (botAI->IsInVehicle() || bot->isDead() || bot->HasUnitState(UNIT_STATE_IN_FLIGHT) || + !bot->IsOutdoors() || bot->InArena()) + return false; + + master = GetMaster(); + + // Get shapeshift states, only applicable when there's a master + if (master) + { + botInShapeshiftForm = bot->GetShapeshiftForm(); + masterInShapeshiftForm = master->GetShapeshiftForm(); + } + + // Not useful when in combat and not currently mounted / travel formed + if ((bot->IsInCombat() || botAI->GetState() == BOT_STATE_COMBAT) && + !bot->IsMounted() && botInShapeshiftForm != FORM_TRAVEL && botInShapeshiftForm != FORM_FLIGHT && botInShapeshiftForm != FORM_FLIGHT_EPIC) + return false; + + // In addition to checking IsOutdoors, also check whether bot is clipping below floor slightly because that will + // cause bot to falsly indicate they are outdoors. This fixes bug where bot tries to mount indoors (which seems + // to mostly be an issue in tunnels of WSG and AV) + float posZ = bot->GetPositionZ(); + float groundLevel = bot->GetMapWaterOrGroundLevel(bot->GetPositionX(), bot->GetPositionY(), posZ); + if (!bot->IsMounted() && !bot->HasWaterWalkAura() && posZ < groundLevel) + return false; + + // Not useful when bot does not have mount strat and is not currently mounted + if (!GET_PLAYERBOT_AI(bot)->HasStrategy("mount", BOT_STATE_NON_COMBAT) && !bot->IsMounted()) + return false; + + // Not useful when level lower than minimum required + if (bot->GetLevel() < sPlayerbotAIConfig.useGroundMountAtMinLevel) + return false; + + // Allow mounting while transformed only if the form allows it + if (bot->HasAuraType(SPELL_AURA_TRANSFORM) && bot->IsInDisallowedMountForm()) + return false; + + // BG Logic + if (bot->InBattleground()) + { + // Do not use when carrying BG Flags + if (bot->HasAura(BG_WS_SPELL_WARSONG_FLAG) || bot->HasAura(BG_WS_SPELL_SILVERWING_FLAG) || bot->HasAura(BG_EY_NETHERSTORM_FLAG_SPELL)) + return false; + + // Only mount if BG starts in less than 30 sec + if (Battleground* bg = bot->GetBattleground()) + if (bg->GetStatus() == STATUS_WAIT_JOIN && bg->GetStartDelayTime() > BG_START_DELAY_30S) + return false; + } + + return true; +} + bool CheckMountStateAction::Mount() { // Remove current Shapeshift if need be diff --git a/src/Ai/Base/Actions/ChooseTargetActions.cpp b/src/Ai/Base/Actions/ChooseTargetActions.cpp index 200094c9007..3446c9b5211 100644 --- a/src/Ai/Base/Actions/ChooseTargetActions.cpp +++ b/src/Ai/Base/Actions/ChooseTargetActions.cpp @@ -30,37 +30,6 @@ bool AttackEnemyFlagCarrierAction::isUseful() PlayerHasFlag::IsCapturingFlag(bot); } -bool AttackAnythingAction::isUseful() -{ - if (!bot || !botAI) // Prevents invalid accesses - return false; - - if (!botAI->AllowActivity(GRIND_ACTIVITY)) // Bot cannot be active - return false; - - if (botAI->HasStrategy("stay", BOT_STATE_NON_COMBAT)) - return false; - - if (bot->IsInCombat()) - return false; - - Unit* target = GetTarget(); - if (!target || !target->IsInWorld()) // Checks if the target is valid and in the world - return false; - - std::string const name = std::string(target->GetName()); - if (!name.empty() && - (name.find("Dummy") != std::string::npos || - name.find("Charge Target") != std::string::npos || - name.find("Melee Target") != std::string::npos || - name.find("Ranged Target") != std::string::npos)) - { - return false; - } - - return true; -} - bool DropTargetAction::Execute(Event event) { Unit* target = context->GetValue("current target")->Get(); @@ -127,7 +96,38 @@ bool AttackAnythingAction::Execute(Event event) return result; } -bool AttackAnythingAction::isPossible() { return AttackAction::isPossible() && GetTarget(); } +bool AttackAnythingAction::isUseful() +{ + if (!bot || !botAI) // Prevents invalid accesses + return false; + + if (!botAI->AllowActivity(GRIND_ACTIVITY)) // Bot cannot be active + return false; + + if (botAI->HasStrategy("stay", BOT_STATE_NON_COMBAT)) + return false; + + if (bot->IsInCombat()) + return false; + + Unit* target = GetTarget(); + if (!target || !target->IsInWorld()) // Checks if the target is valid and in the world + return false; + + std::string const name = std::string(target->GetName()); + if (!name.empty() && + (name.find("Dummy") != std::string::npos || + name.find("Charge Target") != std::string::npos || + name.find("Melee Target") != std::string::npos || + name.find("Ranged Target") != std::string::npos)) + { + return false; + } + + return true; +} + +bool AttackAnythingAction::isPossible() { return GetTarget() && AttackAction::isPossible(); } bool DpsAssistAction::isUseful() { diff --git a/src/Ai/Base/Actions/FishingAction.h b/src/Ai/Base/Actions/FishingAction.h index 407825ed05c..35a7ab6fe6b 100644 --- a/src/Ai/Base/Actions/FishingAction.h +++ b/src/Ai/Base/Actions/FishingAction.h @@ -7,22 +7,24 @@ #define _PLAYERBOT_FISHINGACTION_H #include "Action.h" -#include "MovementActions.h" #include "Event.h" +#include "MovementActions.h" #include "Playerbots.h" extern const uint32 FISHING_SPELL; extern const uint32 FISHING_POLE; extern const uint32 FISHING_BOBBER; -WorldPosition FindWaterRadial(Player* bot, float x, float y, float z, Map* map, uint32 phaseMask, float minDistance, float maxDistance, float increment, bool checkLOS=false, int numDirections = 16); +WorldPosition FindWaterRadial(Player* bot, float x, float y, float z, Map* map, uint32 phaseMask, float minDistance, + float maxDistance, float increment, bool checkLOS = false, int numDirections = 16); class PlayerbotAI; class FishingAction : public Action { public: - FishingAction(PlayerbotAI* botAI) : Action(botAI, "go fishing"){} + FishingAction(PlayerbotAI* botAI) : Action(botAI, "go fishing") {} + bool Execute(Event event) override; bool isUseful() override; }; @@ -31,8 +33,10 @@ class EquipFishingPoleAction : public Action { public: EquipFishingPoleAction(PlayerbotAI* botAI) : Action(botAI, "equip fishing pole") {} + bool Execute(Event event) override; bool isUseful() override; + private: Item* _pole = nullptr; }; @@ -40,7 +44,8 @@ class EquipFishingPoleAction : public Action class MoveNearWaterAction : public MovementAction { public: - MoveNearWaterAction(PlayerbotAI* botAI): MovementAction(botAI, "move near water") {} + MoveNearWaterAction(PlayerbotAI* botAI) : MovementAction(botAI, "move near water") {} + bool Execute(Event event) override; bool isUseful() override; bool isPossible() override; @@ -50,6 +55,7 @@ class UseBobberAction : public Action { public: UseBobberAction(PlayerbotAI* botAI) : Action(botAI, "use fishing bobber") {} + bool Execute(Event event) override; bool isUseful() override; }; @@ -58,6 +64,7 @@ class EndMasterFishingAction : public Action { public: EndMasterFishingAction(PlayerbotAI* botAI) : Action(botAI, "end master fishing") {} + bool Execute(Event event) override; bool isUseful() override; }; @@ -66,6 +73,8 @@ class RemoveBobberStrategyAction : public Action { public: RemoveBobberStrategyAction(PlayerbotAI* botAI) : Action(botAI, "remove bobber strategy") {} + bool Execute(Event event) override; }; + #endif diff --git a/src/Ai/Base/Actions/GenericSpellActions.cpp b/src/Ai/Base/Actions/GenericSpellActions.cpp index 819816f948e..02d1decc690 100644 --- a/src/Ai/Base/Actions/GenericSpellActions.cpp +++ b/src/Ai/Base/Actions/GenericSpellActions.cpp @@ -78,62 +78,61 @@ bool CastSpellAction::Execute(Event event) return botAI->CastSpell(spell, GetTarget()); } -bool CastSpellAction::isPossible() +bool CastSpellAction::isUseful() { if (botAI->IsInVehicle() && !botAI->IsInVehicle(false, false, true)) - { - if (!sPlayerbotAIConfig.logInGroupOnly || (bot->GetGroup() && botAI->HasRealPlayerMaster())) - { - LOG_DEBUG("playerbots", "Can cast spell failed. Vehicle. - bot name: {}", bot->GetName()); - } return false; - } if (spell == "mount" && !bot->IsMounted() && !bot->IsInCombat()) return true; if (spell == "mount" && bot->IsInCombat()) { - if (!sPlayerbotAIConfig.logInGroupOnly || (bot->GetGroup() && botAI->HasRealPlayerMaster())) - { - LOG_DEBUG("playerbots", "Can cast spell failed. Mount. - bot name: {}", bot->GetName()); - } bot->Dismount(); return false; } - // Spell* currentSpell = bot->GetCurrentSpell(CURRENT_GENERIC_SPELL); //not used, line marked for removal. - return botAI->CanCastSpell(spell, GetTarget()); + Unit* spellTarget = GetTarget(); + if (!spellTarget) + return false; + + if (!spellTarget->IsInWorld() || spellTarget->GetMapId() != bot->GetMapId()) + return false; + + // float combatReach = bot->GetCombatReach() + target->GetCombatReach(); + // if (!botAI->IsRanged(bot)) + // combatReach += 4.0f / 3.0f; + + return AI_VALUE2(bool, "spell cast useful", spell); + // && ServerFacade::instance().GetDistance2d(bot, target) <= (range + combatReach); } -bool CastSpellAction::isUseful() +bool CastSpellAction::isPossible() { if (botAI->IsInVehicle() && !botAI->IsInVehicle(false, false, true)) + { + if (!sPlayerbotAIConfig.logInGroupOnly || (bot->GetGroup() && botAI->HasRealPlayerMaster())) + { + LOG_DEBUG("playerbots", "Can cast spell failed. Vehicle. - bot name: {}", bot->GetName()); + } return false; + } if (spell == "mount" && !bot->IsMounted() && !bot->IsInCombat()) return true; if (spell == "mount" && bot->IsInCombat()) { + if (!sPlayerbotAIConfig.logInGroupOnly || (bot->GetGroup() && botAI->HasRealPlayerMaster())) + { + LOG_DEBUG("playerbots", "Can cast spell failed. Mount. - bot name: {}", bot->GetName()); + } bot->Dismount(); return false; } - Unit* spellTarget = GetTarget(); - if (!spellTarget) - return false; - - if (!spellTarget->IsInWorld() || spellTarget->GetMapId() != bot->GetMapId()) - return false; - - // float combatReach = bot->GetCombatReach() + spellTarget->GetCombatReach(); - // if (!botAI->IsRanged(bot)) - // combatReach += 4.0f / 3.0f; - - return spellTarget && - AI_VALUE2(bool, "spell cast useful", - spell); // && ServerFacade::instance().GetDistance2d(bot, spellTarget) <= (range + combatReach); + // Spell* currentSpell = bot->GetCurrentSpell(CURRENT_GENERIC_SPELL); //not used, line marked for removal. + return botAI->CanCastSpell(spell, GetTarget()); } CastMeleeSpellAction::CastMeleeSpellAction(PlayerbotAI* botAI, std::string const spell) : CastSpellAction(botAI, spell) diff --git a/src/Ai/Base/Actions/GenericSpellActions.h b/src/Ai/Base/Actions/GenericSpellActions.h index b148b93ff6d..9aa83f62d60 100644 --- a/src/Ai/Base/Actions/GenericSpellActions.h +++ b/src/Ai/Base/Actions/GenericSpellActions.h @@ -23,8 +23,8 @@ class CastSpellAction : public Action std::string const GetTargetName() override { return "current target"; }; bool Execute(Event event) override; - bool isPossible() override; bool isUseful() override; + bool isPossible() override; ActionThreatType getThreatType() override { return ActionThreatType::Single; } std::vector getPrerequisites() override diff --git a/src/Ai/Base/Actions/NonCombatActions.cpp b/src/Ai/Base/Actions/NonCombatActions.cpp index 492da8ae6bf..9de1e0bae6e 100644 --- a/src/Ai/Base/Actions/NonCombatActions.cpp +++ b/src/Ai/Base/Actions/NonCombatActions.cpp @@ -49,18 +49,16 @@ bool DrinkAction::Execute(Event event) bool DrinkAction::isUseful() { - return UseItemAction::isUseful() && - AI_VALUE2(bool, "has mana", "self target") && - AI_VALUE2(uint8, "mana", "self target") < 100; + return UseItemAction::isUseful() && AI_VALUE2(bool, "has mana", "self target") && + AI_VALUE2(uint8, "mana", "self target") < 100; } bool DrinkAction::isPossible() { - return !bot->IsInCombat() && - !bot->IsMounted() && - !botAI->HasAnyAuraOf(GetTarget(), "dire bear form", "bear form", "cat form", "travel form", - "aquatic form","flight form", "swift flight form", nullptr) && - (botAI->HasCheat(BotCheatMask::food) || UseItemAction::isPossible()); + return !bot->IsInCombat() && !bot->IsMounted() && + !botAI->HasAnyAuraOf(GetTarget(), "dire bear form", "bear form", "cat form", "travel form", "aquatic form", + "flight form", "swift flight form", nullptr) && + (botAI->HasCheat(BotCheatMask::food) || UseItemAction::isPossible()); } bool EatAction::Execute(Event event) @@ -102,17 +100,12 @@ bool EatAction::Execute(Event event) return UseItemAction::Execute(event); } -bool EatAction::isUseful() -{ - return UseItemAction::isUseful() && - AI_VALUE2(uint8, "health", "self target") < 100; -} +bool EatAction::isUseful() { return UseItemAction::isUseful() && AI_VALUE2(uint8, "health", "self target") < 100; } bool EatAction::isPossible() { - return !bot->IsInCombat() && - !bot->IsMounted() && - !botAI->HasAnyAuraOf(GetTarget(), "dire bear form", "bear form", "cat form", "travel form", - "aquatic form","flight form", "swift flight form", nullptr) && - (botAI->HasCheat(BotCheatMask::food) || UseItemAction::isPossible()); + return !bot->IsInCombat() && !bot->IsMounted() && + !botAI->HasAnyAuraOf(GetTarget(), "dire bear form", "bear form", "cat form", "travel form", "aquatic form", + "flight form", "swift flight form", nullptr) && + (botAI->HasCheat(BotCheatMask::food) || UseItemAction::isPossible()); } diff --git a/src/Ai/Base/Actions/RpgAction.cpp b/src/Ai/Base/Actions/RpgAction.cpp index 919e25c58ee..1e461b068ef 100644 --- a/src/Ai/Base/Actions/RpgAction.cpp +++ b/src/Ai/Base/Actions/RpgAction.cpp @@ -85,7 +85,7 @@ bool RpgAction::SetNextRpgAction() isChecked = true; Action* action = botAI->GetAiObjectContext()->GetAction(nextAction.getName()); - if (!dynamic_cast(action) || !action->isPossible() || !action->isUseful()) + if (!dynamic_cast(action) || !action->isUseful() || !action->isPossible()) continue; actions.push_back(action); diff --git a/src/Ai/Base/Actions/UseItemAction.cpp b/src/Ai/Base/Actions/UseItemAction.cpp index 473816e3ece..77c865dba86 100644 --- a/src/Ai/Base/Actions/UseItemAction.cpp +++ b/src/Ai/Base/Actions/UseItemAction.cpp @@ -7,9 +7,9 @@ #include "ChatHelper.h" #include "Event.h" +#include "ItemPackets.h" #include "ItemUsageValue.h" #include "Playerbots.h" -#include "ItemPackets.h" bool UseItemAction::Execute(Event event) { @@ -416,13 +416,6 @@ bool UseHearthStone::Execute(Event event) bool UseHearthStone::isUseful() { return !bot->InBattleground(); } -bool UseRandomRecipe::isUseful() -{ - return !bot->IsInCombat() && !botAI->HasActivePlayerMaster() && !bot->InBattleground(); -} - -bool UseRandomRecipe::isPossible() { return AI_VALUE2(uint32, "item count", "recipe") > 0; } - bool UseRandomRecipe::Execute(Event event) { std::vector recipes = AI_VALUE2(std::vector, "inventory items", "recipe"); @@ -445,12 +438,12 @@ bool UseRandomRecipe::Execute(Event event) return used; } -bool UseRandomQuestItem::isUseful() +bool UseRandomRecipe::isUseful() { - return !botAI->HasActivePlayerMaster() && !bot->InBattleground() && !bot->HasUnitState(UNIT_STATE_IN_FLIGHT); + return !bot->IsInCombat() && !botAI->HasActivePlayerMaster() && !bot->InBattleground(); } -bool UseRandomQuestItem::isPossible() { return AI_VALUE2(uint32, "item count", "quest") > 0; } +bool UseRandomRecipe::isPossible() { return AI_VALUE2(uint32, "item count", "recipe") > 0; } bool UseRandomQuestItem::Execute(Event event) { @@ -478,7 +471,6 @@ bool UseRandomQuestItem::Execute(Event event) break; } } - } if (!item) @@ -490,3 +482,10 @@ bool UseRandomQuestItem::Execute(Event event) return used; } + +bool UseRandomQuestItem::isUseful() +{ + return !botAI->HasActivePlayerMaster() && !bot->InBattleground() && !bot->HasUnitState(UNIT_STATE_IN_FLIGHT); +} + +bool UseRandomQuestItem::isPossible() { return AI_VALUE2(uint32, "item count", "quest") > 0; } diff --git a/src/Ai/Base/Actions/UseItemAction.h b/src/Ai/Base/Actions/UseItemAction.h index 2b0c7e1911c..263bc29dc4a 100644 --- a/src/Ai/Base/Actions/UseItemAction.h +++ b/src/Ai/Base/Actions/UseItemAction.h @@ -69,8 +69,8 @@ class UseHearthStone : public UseItemAction public: UseHearthStone(PlayerbotAI* botAI) : UseItemAction(botAI, "hearthstone", true) {} - bool isUseful() override; bool Execute(Event event) override; + bool isUseful() override; }; class UseRandomRecipe : public UseItemAction @@ -78,9 +78,9 @@ class UseRandomRecipe : public UseItemAction public: UseRandomRecipe(PlayerbotAI* botAI) : UseItemAction(botAI, "random recipe", true) {} + bool Execute(Event event) override; bool isUseful() override; bool isPossible() override; - bool Execute(Event event) override; }; class UseRandomQuestItem : public UseItemAction @@ -88,9 +88,9 @@ class UseRandomQuestItem : public UseItemAction public: UseRandomQuestItem(PlayerbotAI* botAI) : UseItemAction(botAI, "random quest item", true) {} + bool Execute(Event event) override; bool isUseful() override; bool isPossible() override; - bool Execute(Event event) override; }; #endif diff --git a/src/Ai/Class/Druid/Action/DruidShapeshiftActions.cpp b/src/Ai/Class/Druid/Action/DruidShapeshiftActions.cpp index 1f066dc349d..42e639f93bb 100644 --- a/src/Ai/Class/Druid/Action/DruidShapeshiftActions.cpp +++ b/src/Ai/Class/Druid/Action/DruidShapeshiftActions.cpp @@ -7,20 +7,19 @@ #include "Playerbots.h" -bool CastBearFormAction::isPossible() +bool CastBearFormAction::isUseful() { - return CastBuffSpellAction::isPossible() && !botAI->HasAura("dire bear form", GetTarget()); + return CastBuffSpellAction::isUseful() && !botAI->HasAura("dire bear form", GetTarget()); } -bool CastBearFormAction::isUseful() +bool CastBearFormAction::isPossible() { - return CastBuffSpellAction::isUseful() && !botAI->HasAura("dire bear form", GetTarget()); + return CastBuffSpellAction::isPossible() && !botAI->HasAura("dire bear form", GetTarget()); } std::vector CastDireBearFormAction::getAlternatives() { - return NextAction::merge({ NextAction("bear form") }, - CastSpellAction::getAlternatives()); + return NextAction::merge({NextAction("bear form")}, CastSpellAction::getAlternatives()); } bool CastTravelFormAction::isUseful() @@ -32,22 +31,17 @@ bool CastTravelFormAction::isUseful() !botAI->HasAura("dash", bot); } -bool CastCasterFormAction::isUseful() -{ - return botAI->HasAnyAuraOf(GetTarget(), "dire bear form", "bear form", "cat form", "travel form", "aquatic form", - "flight form", "swift flight form", "moonkin form", nullptr) && - AI_VALUE2(uint8, "mana", "self target") > sPlayerbotAIConfig.mediumHealth; -} - bool CastCasterFormAction::Execute(Event event) { botAI->RemoveShapeshift(); return true; } -bool CastCancelTreeFormAction::isUseful() +bool CastCasterFormAction::isUseful() { - return botAI->HasAura(33891, bot); + return botAI->HasAnyAuraOf(GetTarget(), "dire bear form", "bear form", "cat form", "travel form", "aquatic form", + "flight form", "swift flight form", "moonkin form", nullptr) && + AI_VALUE2(uint8, "mana", "self target") > sPlayerbotAIConfig.mediumHealth; } bool CastCancelTreeFormAction::Execute(Event event) @@ -56,6 +50,8 @@ bool CastCancelTreeFormAction::Execute(Event event) return true; } +bool CastCancelTreeFormAction::isUseful() { return botAI->HasAura(33891, bot); } + bool CastTreeFormAction::isUseful() { return GetTarget() && CastSpellAction::isUseful() && !botAI->HasAura(33891, bot); diff --git a/src/Ai/Class/Druid/Action/DruidShapeshiftActions.h b/src/Ai/Class/Druid/Action/DruidShapeshiftActions.h index 26e14c42ca1..9d75f268208 100644 --- a/src/Ai/Class/Druid/Action/DruidShapeshiftActions.h +++ b/src/Ai/Class/Druid/Action/DruidShapeshiftActions.h @@ -15,8 +15,8 @@ class CastBearFormAction : public CastBuffSpellAction public: CastBearFormAction(PlayerbotAI* botAI) : CastBuffSpellAction(botAI, "bear form") {} - bool isPossible() override; bool isUseful() override; + bool isPossible() override; }; class CastDireBearFormAction : public CastBuffSpellAction @@ -37,6 +37,7 @@ class CastTreeFormAction : public CastBuffSpellAction { public: CastTreeFormAction(PlayerbotAI* botAI) : CastBuffSpellAction(botAI, "tree of life") {} + bool isUseful() override; }; @@ -65,9 +66,9 @@ class CastCasterFormAction : public CastBuffSpellAction public: CastCasterFormAction(PlayerbotAI* botAI) : CastBuffSpellAction(botAI, "caster form") {} + bool Execute(Event event) override; bool isUseful() override; bool isPossible() override { return true; } - bool Execute(Event event) override; }; class CastCancelTreeFormAction : public CastBuffSpellAction @@ -75,9 +76,9 @@ class CastCancelTreeFormAction : public CastBuffSpellAction public: CastCancelTreeFormAction(PlayerbotAI* botAI) : CastBuffSpellAction(botAI, "cancel tree form") {} + bool Execute(Event event) override; bool isUseful() override; bool isPossible() override { return true; } - bool Execute(Event event) override; }; #endif diff --git a/src/Ai/Class/Priest/Action/PriestActions.cpp b/src/Ai/Class/Priest/Action/PriestActions.cpp index ae55b104dc7..bdc33ac3403 100644 --- a/src/Ai/Class/Priest/Action/PriestActions.cpp +++ b/src/Ai/Class/Priest/Action/PriestActions.cpp @@ -8,16 +8,14 @@ #include "Event.h" #include "Playerbots.h" -bool CastRemoveShadowformAction::isUseful() { return botAI->HasAura("shadowform", AI_VALUE(Unit*, "self target")); } - -bool CastRemoveShadowformAction::isPossible() { return true; } - bool CastRemoveShadowformAction::Execute(Event event) { botAI->RemoveAura("shadowform"); return true; } +bool CastRemoveShadowformAction::isUseful() { return botAI->HasAura("shadowform", AI_VALUE(Unit*, "self target")); } + Unit* CastPowerWordShieldOnAlmostFullHealthBelowAction::GetTarget() { Group* group = bot->GetGroup(); diff --git a/src/Ai/Class/Priest/Action/PriestActions.h b/src/Ai/Class/Priest/Action/PriestActions.h index 1b09414d484..4e94f27cca4 100644 --- a/src/Ai/Class/Priest/Action/PriestActions.h +++ b/src/Ai/Class/Priest/Action/PriestActions.h @@ -56,7 +56,10 @@ HEAL_PARTY_ACTION(CastRenewOnPartyAction, "renew", 15.0f, HealingManaEfficiency: class CastPrayerOfMendingAction : public HealPartyMemberAction { public: - CastPrayerOfMendingAction(PlayerbotAI* botAI) : HealPartyMemberAction(botAI, "prayer of mending", 10.0f, HealingManaEfficiency::HIGH, false) {} + CastPrayerOfMendingAction(PlayerbotAI* botAI) + : HealPartyMemberAction(botAI, "prayer of mending", 10.0f, HealingManaEfficiency::HIGH, false) + { + } }; HEAL_PARTY_ACTION(CastBindingHealAction, "binding heal", 15.0f, HealingManaEfficiency::MEDIUM); @@ -65,7 +68,8 @@ HEAL_PARTY_ACTION(CastPrayerOfHealingAction, "prayer of healing", 15.0f, Healing class CastCircleOfHealingAction : public HealPartyMemberAction { public: - CastCircleOfHealingAction(PlayerbotAI* ai) : HealPartyMemberAction(ai, "circle of healing", 15.0f, HealingManaEfficiency::HIGH) + CastCircleOfHealingAction(PlayerbotAI* ai) + : HealPartyMemberAction(ai, "circle of healing", 15.0f, HealingManaEfficiency::HIGH) { } }; @@ -134,15 +138,15 @@ class CastRemoveShadowformAction : public Action public: CastRemoveShadowformAction(PlayerbotAI* botAI) : Action(botAI, "remove shadowform") {} - bool isUseful() override; - bool isPossible() override; bool Execute(Event event) override; + bool isUseful() override; }; class CastDispersionAction : public CastSpellAction { public: CastDispersionAction(PlayerbotAI* ai) : CastSpellAction(ai, "dispersion") {} + virtual std::string const GetTargetName() { return "self target"; } }; @@ -158,6 +162,7 @@ class CastHymnOfHopeAction : public CastSpellAction { public: CastHymnOfHopeAction(PlayerbotAI* ai) : CastSpellAction(ai, "hymn of hope") {} + virtual std::string const GetTargetName() { return "self target"; } }; @@ -165,6 +170,7 @@ class CastDivineHymnAction : public CastSpellAction { public: CastDivineHymnAction(PlayerbotAI* ai) : CastSpellAction(ai, "divine hymn") {} + virtual std::string const GetTargetName() { return "self target"; } }; @@ -172,6 +178,7 @@ class CastShadowfiendAction : public CastSpellAction { public: CastShadowfiendAction(PlayerbotAI* ai) : CastSpellAction(ai, "shadowfiend") {} + virtual std::string const GetTargetName() { return "current target"; } }; @@ -182,6 +189,7 @@ class CastPowerWordShieldOnAlmostFullHealthBelowAction : public HealPartyMemberA : HealPartyMemberAction(ai, "power word: shield", 15.0f, HealingManaEfficiency::HIGH) { } + bool isUseful() override; Unit* GetTarget() override; }; @@ -193,6 +201,7 @@ class CastPowerWordShieldOnNotFullAction : public HealPartyMemberAction : HealPartyMemberAction(ai, "power word: shield", 5.0f, HealingManaEfficiency::HIGH) { } + bool isUseful() override; Unit* GetTarget() override; }; @@ -201,13 +210,17 @@ class CastMindSearAction : public CastSpellAction { public: CastMindSearAction(PlayerbotAI* ai) : CastSpellAction(ai, "mind sear") {} + ActionThreatType getThreatType() override { return ActionThreatType::Aoe; } }; class CastGuardianSpiritOnPartyAction : public HealPartyMemberAction { public: - CastGuardianSpiritOnPartyAction(PlayerbotAI* ai) : HealPartyMemberAction(ai, "guardian spirit", 40.0f, HealingManaEfficiency::MEDIUM) {} + CastGuardianSpiritOnPartyAction(PlayerbotAI* ai) + : HealPartyMemberAction(ai, "guardian spirit", 40.0f, HealingManaEfficiency::MEDIUM) + { + } }; #endif diff --git a/src/Ai/Class/Rogue/Action/RogueActions.h b/src/Ai/Class/Rogue/Action/RogueActions.h index c31dfbd7e64..dd0ad4735e8 100644 --- a/src/Ai/Class/Rogue/Action/RogueActions.h +++ b/src/Ai/Class/Rogue/Action/RogueActions.h @@ -27,6 +27,7 @@ class CastHungerForBloodAction : public CastBuffSpellAction { public: CastHungerForBloodAction(PlayerbotAI* botAI) : CastBuffSpellAction(botAI, "hunger for blood") {} + std::string const GetTargetName() override { return "current target"; } }; @@ -43,9 +44,9 @@ class CastStealthAction : public CastBuffSpellAction public: CastStealthAction(PlayerbotAI* botAI) : CastBuffSpellAction(botAI, "stealth") {} - std::string const GetTargetName() override { return "self target"; } bool isUseful() override; bool isPossible() override; + std::string const GetTargetName() override { return "self target"; } }; class UnstealthAction : public Action @@ -61,8 +62,8 @@ class CheckStealthAction : public Action public: CheckStealthAction(PlayerbotAI* botAI) : Action(botAI, "check stealth") {} - bool isPossible() override { return true; } bool Execute(Event event) override; + bool isPossible() override { return true; } }; class CastKickAction : public CastSpellAction @@ -131,6 +132,7 @@ class CastEnvenomAction : public CastMeleeSpellAction { public: CastEnvenomAction(PlayerbotAI* ai) : CastMeleeSpellAction(ai, "envenom") {} + bool isUseful() override; bool isPossible() override; }; @@ -139,37 +141,42 @@ class CastTricksOfTheTradeOnMainTankAction : public BuffOnMainTankAction { public: CastTricksOfTheTradeOnMainTankAction(PlayerbotAI* ai) : BuffOnMainTankAction(ai, "tricks of the trade", true) {} - virtual bool isUseful() override; + + bool isUseful() override; }; class UseDeadlyPoisonAction : public UseItemAction { public: UseDeadlyPoisonAction(PlayerbotAI* ai) : UseItemAction(ai, "Deadly Poison") {} - virtual bool Execute(Event event) override; - virtual bool isPossible() override; + + bool Execute(Event event) override; + bool isPossible() override; }; class UseInstantPoisonAction : public UseItemAction { public: UseInstantPoisonAction(PlayerbotAI* ai) : UseItemAction(ai, "Instant Poison") {} - virtual bool Execute(Event event) override; - virtual bool isPossible() override; + + bool Execute(Event event) override; + bool isPossible() override; }; class UseInstantPoisonOffHandAction : public UseItemAction { public: UseInstantPoisonOffHandAction(PlayerbotAI* ai) : UseItemAction(ai, "Instant Poison Off Hand") {} - virtual bool Execute(Event event) override; - virtual bool isPossible() override; + + bool Execute(Event event) override; + bool isPossible() override; }; class FanOfKnivesAction : public CastMeleeSpellAction { public: FanOfKnivesAction(PlayerbotAI* ai) : CastMeleeSpellAction(ai, "fan of knives") {} + ActionThreatType getThreatType() override { return ActionThreatType::Aoe; } }; diff --git a/src/Ai/Class/Warrior/Action/WarriorActions.cpp b/src/Ai/Class/Warrior/Action/WarriorActions.cpp index 9733226a955..0bde24cd942 100644 --- a/src/Ai/Class/Warrior/Action/WarriorActions.cpp +++ b/src/Ai/Class/Warrior/Action/WarriorActions.cpp @@ -176,20 +176,19 @@ Unit* CastShatteringThrowAction::GetTarget() return nullptr; // No valid target } -bool CastShatteringThrowAction::isUseful() +bool CastShatteringThrowAction::Execute(Event event) { - - // Spell cooldown check - if (!bot->HasSpell(64382)) - { + Unit* target = GetTarget(); + if (!target) return false; - } - // Spell cooldown check - if (bot->HasSpellCooldown(64382)) - { + return botAI->CastSpell("shattering throw", target); +} + +bool CastShatteringThrowAction::isUseful() +{ + if (!bot->HasSpell(64382) || bot->HasSpellCooldown(64382)) return false; - } GuidVector enemies = AI_VALUE(GuidVector, "possible targets"); @@ -220,25 +219,12 @@ bool CastShatteringThrowAction::isPossible() // Range check: Shattering Throw is 30 yards if (!bot->IsWithinDistInMap(target, 30.0f)) - { return false; - } // Check line of sight if (!bot->IsWithinLOSInMap(target)) - { return false; - } // If the minimal checks above pass, simply return true. return true; } - -bool CastShatteringThrowAction::Execute(Event event) -{ - Unit* target = GetTarget(); - if (!target) - return false; - - return botAI->CastSpell("shattering throw", target); -} diff --git a/src/Ai/Class/Warrior/Action/WarriorActions.h b/src/Ai/Class/Warrior/Action/WarriorActions.h index ea72fb269a9..7910fc0d8ed 100644 --- a/src/Ai/Class/Warrior/Action/WarriorActions.h +++ b/src/Ai/Class/Warrior/Action/WarriorActions.h @@ -25,8 +25,7 @@ MELEE_ACTION_U(CastBattleShoutTauntAction, "battle shout", CastSpellAction::isUs class CastDemoralizingShoutAction : public CastMeleeDebuffSpellAction { public: - CastDemoralizingShoutAction(PlayerbotAI* botAI) - : CastMeleeDebuffSpellAction(botAI, "demoralizing shout") {} + CastDemoralizingShoutAction(PlayerbotAI* botAI) : CastMeleeDebuffSpellAction(botAI, "demoralizing shout") {} }; class CastDemoralizingShoutWithoutLifeTimeCheckAction : public CastMeleeDebuffSpellAction @@ -140,8 +139,8 @@ class CastVigilanceAction : public BuffOnPartyAction public: CastVigilanceAction(PlayerbotAI* botAI) : BuffOnPartyAction(botAI, "vigilance") {} - Unit* GetTarget() override; bool Execute(Event event) override; + Unit* GetTarget() override; }; class CastRetaliationAction : public CastBuffSpellAction @@ -157,10 +156,10 @@ class CastShatteringThrowAction : public CastSpellAction public: CastShatteringThrowAction(PlayerbotAI* botAI) : CastSpellAction(botAI, "shattering throw") {} - Unit* GetTarget() override; + bool Execute(Event event) override; bool isUseful() override; bool isPossible() override; - bool Execute(Event event) override; + Unit* GetTarget() override; }; #endif diff --git a/src/Ai/Raid/EyeOfEternity/Action/RaidEoEActions.h b/src/Ai/Raid/EyeOfEternity/Action/RaidEoEActions.h index c6fe064c05e..0d5b6fcc364 100644 --- a/src/Ai/Raid/EyeOfEternity/Action/RaidEoEActions.h +++ b/src/Ai/Raid/EyeOfEternity/Action/RaidEoEActions.h @@ -1,9 +1,9 @@ #ifndef _PLAYERBOT_RAIDEOEACTIONS_H #define _PLAYERBOT_RAIDEOEACTIONS_H -#include "MovementActions.h" #include "AttackAction.h" #include "GenericSpellActions.h" +#include "MovementActions.h" #include "PlayerbotAI.h" #include "Playerbots.h" @@ -13,34 +13,38 @@ const std::pair MALYGOS_STACK_POSITION = {755.0f, 1301.0f}; class MalygosPositionAction : public MovementAction { public: - MalygosPositionAction(PlayerbotAI* botAI, std::string const name = "malygos position") - : MovementAction(botAI, name) {} + MalygosPositionAction(PlayerbotAI* botAI, std::string const name = "malygos position") : MovementAction(botAI, name) + { + } + bool Execute(Event event) override; }; class MalygosTargetAction : public AttackAction { public: - MalygosTargetAction(PlayerbotAI* botAI, std::string const name = "malygos target") - : AttackAction(botAI, name) {} - bool Execute(Event event) override; -}; + MalygosTargetAction(PlayerbotAI* botAI, std::string const name = "malygos target") : AttackAction(botAI, name) {} -class PullPowerSparkAction : public CastSpellAction -{ -public: - PullPowerSparkAction(PlayerbotAI* botAI, std::string const name = "pull power spark") - : CastSpellAction(botAI, name) {} bool Execute(Event event) override; - bool isPossible() override; - bool isUseful() override; }; +//class PullPowerSparkAction : public CastSpellAction +//{ +//public: +// PullPowerSparkAction(PlayerbotAI* botAI, std::string const name = "pull power spark") : CastSpellAction(botAI, name) +// { +// } + +// bool Execute(Event event) override; +// bool isUseful() override; +// bool isPossible() override; +//}; + class KillPowerSparkAction : public AttackAction { public: - KillPowerSparkAction(PlayerbotAI* botAI, std::string const name = "kill power spark") - : AttackAction(botAI, name) {} + KillPowerSparkAction(PlayerbotAI* botAI, std::string const name = "kill power spark") : AttackAction(botAI, name) {} + bool Execute(Event event) override; }; @@ -48,6 +52,7 @@ class EoEFlyDrakeAction : public MovementAction { public: EoEFlyDrakeAction(PlayerbotAI* ai) : MovementAction(ai, "eoe fly drake") {} + bool Execute(Event event) override; bool isPossible() override; }; @@ -56,6 +61,7 @@ class EoEDrakeAttackAction : public Action { public: EoEDrakeAttackAction(PlayerbotAI* botAI) : Action(botAI, "eoe drake attack") {} + bool Execute(Event event) override; bool isPossible() override; diff --git a/src/Bot/Engine/Action/Action.h b/src/Bot/Engine/Action/Action.h index 2395c5ea87f..6c54d24b970 100644 --- a/src/Bot/Engine/Action/Action.h +++ b/src/Bot/Engine/Action/Action.h @@ -60,8 +60,27 @@ class Action : public AiNamedObject virtual ~Action(void) {} virtual bool Execute([[maybe_unused]] Event event) { return true; } - virtual bool isPossible() { return true; } + + /** + * @brief First validation check - determines if this action is contextually useful + * + * Performs lightweight checks to evaluate whether the action makes sense + * in the current situation. Called before isPossible() during action selection. + * + * @return true if the action is useful, false otherwise + */ virtual bool isUseful() { return true; } + + /** + * @brief Second validation check - determines if this action can be executed + * + * Performs hard pre-execution validation against the event and game state. + * Called after isUseful() passes, before Execute(). + * + * @return true if the action is possible, false otherwise + */ + virtual bool isPossible() { return true; } + virtual std::vector getPrerequisites() { return {}; } virtual std::vector getAlternatives() { return {}; } virtual std::vector getContinuers() { return {}; } diff --git a/src/Bot/Engine/Engine.cpp b/src/Bot/Engine/Engine.cpp index bc24baf560b..bb4f2eb351d 100644 --- a/src/Bot/Engine/Engine.cpp +++ b/src/Bot/Engine/Engine.cpp @@ -323,16 +323,16 @@ ActionResult Engine::ExecuteAction(std::string const name, Event event, std::str q->Qualify(qualifier); } - if (!action->isPossible()) + if (!action->isUseful()) { delete actionNode; - return ACTION_RESULT_IMPOSSIBLE; + return ACTION_RESULT_USELESS; } - if (!action->isUseful()) + if (!action->isPossible()) { delete actionNode; - return ACTION_RESULT_USELESS; + return ACTION_RESULT_IMPOSSIBLE; } action->MakeVerbose(); From 17b8d7f68b4e7fe9626eebcd3ea319419b4e0f8e Mon Sep 17 00:00:00 2001 From: Alex Dcnh <140754794+Wishmaster117@users.noreply.github.com> Date: Fri, 13 Feb 2026 18:24:42 +0100 Subject: [PATCH 04/25] Stage1 refactor world position method names (#2126) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Pull Request This change replaces the non‑standard WorldPosition::getX/getY/getZ/getO/getMapId wrappers with the core getters (GetPositionX/Y/Z, GetOrientation, GetMapId) and removes the redundant wrappers. Goal: align the module with AzerothCore conventions, reduce local adapters, and improve long‑term maintainability. --- ## Design Philosophy This is a structural cleanup only (coordinate access) and does not alter any AI behavior or decision logic. It follows the stability/performance-first philosophy and does not add branches or extra runtime work. Before submitting: yes, this change aligns with the principles of stability, performance, and predictability. Principles: - **Stability before intelligence** A stable system is always preferred over a smarter one. - **Performance is a shared resource** Any increase in bot cost affects all players and all bots. - **Simple logic scales better than smart logic** Predictable behavior under load is more valuable than perfect decisions. - **Complexity must justify itself** If a feature cannot clearly explain its cost, it should not exist. - **Defaults must be cheap** Expensive behavior must always be optional and clearly communicated. - **Bots should look reasonable, not perfect** The goal is believable behavior, not human simulation. Before submitting, confirm that this change aligns with those principles. --- ## Feature Evaluation Please answer the following: - Minimum logic required: use core getters (GetPositionX/Y/Z, GetMapId, GetOrientation) wherever coordinates are needed. - Cheapest implementation: direct call replacement and removal of redundant wrappers. - Runtime cost: negligible (same data access, no additional logic). --- ## How to Test the Changes - No functional testing required (behavior‑neutral refactor). - Recommended: compile the module and run a normal server startup as validation. ## Complexity & Impact Does this change add new decision branches? - - [x] No - - [x] Yes (**explain below**) Does this change increase per-bot or per-tick processing? - - [x] No - - [ ] Yes (**describe and justify impact**) Could this logic scale poorly under load? - - [x] No - - [ ] Yes (**explain why**) --- ## Defaults & Configuration Does this change modify default bot behavior? - - [x] No - - [ ] Yes (**explain why**) If this introduces more advanced or AI-heavy logic: - - [x] Lightweight mode remains the default - - [x] More complex behavior is optional and thereby configurable --- ## AI Assistance Was AI assistance (e.g. ChatGPT or similar tools) used while working on this change? - - [ ] No - - [x] Yes (**explain below**) If yes, please specify: - AI tool or model used: Copilot - Purpose of usage: Translate this PR text from french to English --- ## Final Checklist - - [x] Stability is not compromised - - [x] Performance impact is understood, tested, and acceptable - - [x] Added logic complexity is justified and explained - - [x] Documentation updated if needed --- ## Notes for Reviewers This is a core-friendly cleanup only, with no behavioral change. No additional logic or CPU cost is introduced. --- src/Ai/Base/Actions/ChooseRpgTargetAction.cpp | 4 +- src/Ai/Base/Actions/DebugAction.cpp | 100 +++++++------- src/Ai/Base/Actions/MovementActions.cpp | 48 +++---- .../Base/Actions/ReviveFromCorpseAction.cpp | 14 +- src/Ai/Base/Actions/RpgSubActions.cpp | 4 +- src/Ai/Base/Actions/RtscAction.cpp | 10 +- src/Ai/Base/Actions/SeeSpellAction.cpp | 12 +- src/Ai/Base/Trigger/RpgTriggers.cpp | 6 +- src/Ai/Base/Trigger/StuckTriggers.cpp | 2 +- .../PitOfSaron/Action/PitOfSaronActions.cpp | 28 ++-- .../GruulsLair/Util/RaidGruulsLairHelpers.cpp | 16 +-- .../Raid/Icecrown/Action/RaidIccActions.cpp | 6 +- src/Ai/World/Rpg/Action/NewRpgBaseAction.cpp | 4 +- src/Bot/PlayerbotAI.cpp | 5 +- src/Bot/RandomPlayerbotMgr.cpp | 4 +- src/Mgr/Move/FleeManager.cpp | 6 +- src/Mgr/Travel/TravelMgr.cpp | 128 +++++++++--------- src/Mgr/Travel/TravelMgr.h | 66 ++++----- src/Mgr/Travel/TravelNode.cpp | 49 +++---- src/Mgr/Travel/TravelNode.h | 10 +- 20 files changed, 269 insertions(+), 253 deletions(-) diff --git a/src/Ai/Base/Actions/ChooseRpgTargetAction.cpp b/src/Ai/Base/Actions/ChooseRpgTargetAction.cpp index 7d83c2b2bcb..ce3d63562ed 100644 --- a/src/Ai/Base/Actions/ChooseRpgTargetAction.cpp +++ b/src/Ai/Base/Actions/ChooseRpgTargetAction.cpp @@ -320,7 +320,7 @@ bool ChooseRpgTargetAction::isFollowValid(Player* bot, WorldPosition pos) inDungeon = true; if (realMaster && realMaster->IsInWorld() && realMaster->GetMap()->IsDungeon() && - (realMaster->GetMapId() != pos.getMapId())) + (realMaster->GetMapId() != pos.GetMapId())) return false; } @@ -334,7 +334,7 @@ bool ChooseRpgTargetAction::isFollowValid(Player* bot, WorldPosition pos) return false; Formation* formation = AI_VALUE(Formation*, "formation"); - float distance = groupLeader->GetDistance2d(pos.getX(), pos.getY()); + float distance = groupLeader->GetDistance2d(pos.GetPositionX(), pos.GetPositionY()); if (!botAI->HasActivePlayerMaster() && distance < 50.0f) { diff --git a/src/Ai/Base/Actions/DebugAction.cpp b/src/Ai/Base/Actions/DebugAction.cpp index 578ece17c41..d7fe0f8b75c 100644 --- a/src/Ai/Base/Actions/DebugAction.cpp +++ b/src/Ai/Base/Actions/DebugAction.cpp @@ -28,8 +28,8 @@ bool DebugAction::Execute(Event event) uint32 areaId = 0; uint32 zoneId = 0; - sMapMgr->GetZoneAndAreaId(PHASEMASK_NORMAL, zoneId, areaId, pos.getMapId(), pos.getX(), pos.getY(), - pos.getZ()); + sMapMgr->GetZoneAndAreaId(PHASEMASK_NORMAL, zoneId, areaId, pos.GetMapId(), pos.GetPositionX(), pos.GetPositionY(), + pos.GetPositionZ()); std::ostringstream out; out << zoneId << "," << areaId << "," << (pos.getAreaName().empty() ? "none" : pos.getAreaName()) << ","; @@ -298,7 +298,7 @@ bool DebugAction::Execute(Event event) for (auto p : ppath) { Creature* wpCreature = - bot->SummonCreature(1, p.getX(), p.getY(), p.getZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 20000.0f); + bot->SummonCreature(1, p.GetPositionX(), p.GetPositionY(), p.GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 20000.0f); // addAura(246, wpCreature); units.push_back(wpCreature->GetGUID()); @@ -325,11 +325,11 @@ bool DebugAction::Execute(Event event) WorldPosition botPos(bot); WorldPosition botPos1 = botPos; - botPos.setX(botPos.getX() + cos(ang) * dist); - botPos.setY(botPos.getY() + sin(ang) * dist); + botPos.setX(botPos.GetPositionX() + cos(ang) * dist); + botPos.setY(botPos.GetPositionY() + sin(ang) * dist); botPos.setZ(botPos.getHeight() + 2); - Creature* wpCreature = bot->SummonCreature(2334, botPos.getX(), botPos.getY(), botPos.getZ(), 0, + Creature* wpCreature = bot->SummonCreature(2334, botPos.GetPositionX(), botPos.GetPositionY(), botPos.GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 10000.0f); FakeSpell(spellEffect, wpCreature, wpCreature, prev->GetGUID(), {}, {}, botPos, botPos); @@ -352,11 +352,11 @@ bool DebugAction::Execute(Event event) WorldPosition botPos(bot); WorldPosition botPos1 = botPos; - botPos.setX(botPos.getX() + cos(ang) * dist); - botPos.setY(botPos.getY() + sin(ang) * dist); + botPos.setX(botPos.GetPositionX() + cos(ang) * dist); + botPos.setY(botPos.GetPositionY() + sin(ang) * dist); botPos.setZ(botPos.getHeight() + 2); - Creature* wpCreature = bot->SummonCreature(2334, botPos.getX(), botPos.getY(), botPos.getZ(), 0, + Creature* wpCreature = bot->SummonCreature(2334, botPos.GetPositionX(), botPos.GetPositionY(), botPos.GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 10000.0f); if (wpCreature) @@ -383,11 +383,11 @@ bool DebugAction::Execute(Event event) WorldPosition botPos(bot); WorldPosition botPos1 = botPos; - botPos.setX(botPos.getX() + cos(ang) * dist); - botPos.setY(botPos.getY() + sin(ang) * dist); + botPos.setX(botPos.GetPositionX() + cos(ang) * dist); + botPos.setY(botPos.GetPositionY() + sin(ang) * dist); botPos.setZ(botPos.getHeight() + 2); - Creature* wpCreature = bot->SummonCreature(2334, botPos.getX(), botPos.getY(), botPos.getZ(), 0, + Creature* wpCreature = bot->SummonCreature(2334, botPos.GetPositionX(), botPos.GetPositionY(), botPos.GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 5000.0f + i * 100.0f); wpCreature->SetObjectScale(0.5f); @@ -411,11 +411,11 @@ bool DebugAction::Execute(Event event) WorldPosition botPos(bot); - botPos.setX(botPos.getX() + cos(ang) * dist); - botPos.setY(botPos.getY() + sin(ang) * dist); + botPos.setX(botPos.GetPositionX() + cos(ang) * dist); + botPos.setY(botPos.GetPositionY() + sin(ang) * dist); botPos.setZ(botPos.getHeight() + 2); - Creature* wpCreature = bot->SummonCreature(2334, botPos.getX(), botPos.getY(), botPos.getZ(), 0, + Creature* wpCreature = bot->SummonCreature(2334, botPos.GetPositionX(), botPos.GetPositionY(), botPos.GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 10000.0f); units.push_back(wpCreature->GetGUID()); @@ -480,13 +480,13 @@ bool DebugAction::Execute(Event event) uint32 effect = dx + dy * 10 + spellEffect * 100; WorldPosition botPos(bot); - botPos.setX(botPos.getX() + (dx - 5) * 5); - botPos.setY(botPos.getY() + (dy - 5) * 5); + botPos.setX(botPos.GetPositionX() + (dx - 5) * 5); + botPos.setY(botPos.GetPositionY() + (dy - 5) * 5); botPos.setZ(botPos.getHeight()); Creature* wpCreature = - bot->SummonCreature((dy == 0 && (dx == 0 || dx == 2)) ? 6 : 2, botPos.getX(), botPos.getY(), - botPos.getZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 10000.0f); + bot->SummonCreature((dy == 0 && (dx == 0 || dx == 2)) ? 6 : 2, botPos.GetPositionX(), botPos.GetPositionY(), + botPos.GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 10000.0f); if (wpCreature) { @@ -512,11 +512,11 @@ bool DebugAction::Execute(Event event) uint32 effect = dx + dy * 10 + spellEffect * 100; WorldPosition botPos(bot); - botPos.setX(botPos.getX() + (dx - 5) * 5); - botPos.setY(botPos.getY() + (dy - 5) * 5); + botPos.setX(botPos.GetPositionX() + (dx - 5) * 5); + botPos.setY(botPos.GetPositionY() + (dy - 5) * 5); botPos.setZ(botPos.getHeight()); - Creature* wpCreature = bot->SummonCreature(effect, botPos.getX(), botPos.getY(), botPos.getZ(), 0, + Creature* wpCreature = bot->SummonCreature(effect, botPos.GetPositionX(), botPos.GetPositionY(), botPos.GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 10000.0f); } } @@ -532,8 +532,8 @@ bool DebugAction::Execute(Event event) uint32 effect = dx + dy * 10 + spellEffect * 100; WorldPosition botPos(bot); - botPos.setX(botPos.getX() + (dx - 5) * 5); - botPos.setY(botPos.getY() + (dy - 5) * 5); + botPos.setX(botPos.GetPositionX() + (dx - 5) * 5); + botPos.setY(botPos.GetPositionY() + (dy - 5) * 5); botPos.setZ(botPos.getHeight()); FakeSpell(effect, bot, nullptr, ObjectGuid::Empty, {}, {}, botPos, botPos, true); @@ -552,11 +552,11 @@ bool DebugAction::Execute(Event event) uint32 effect = dx + dy * 10 + spellEffect * 100; WorldPosition botPos(bot); - botPos.setX(botPos.getX() + (dx - 5) * 5); - botPos.setY(botPos.getY() + (dy - 5) * 5); + botPos.setX(botPos.GetPositionX() + (dx - 5) * 5); + botPos.setY(botPos.GetPositionY() + (dy - 5) * 5); botPos.setZ(botPos.getHeight()); - Creature* wpCreature = bot->SummonCreature(2334, botPos.getX(), botPos.getY(), botPos.getZ(), 0, + Creature* wpCreature = bot->SummonCreature(2334, botPos.GetPositionX(), botPos.GetPositionY(), botPos.GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 10000.0f); if (wpCreature) @@ -568,7 +568,7 @@ bool DebugAction::Execute(Event event) // wpCreature->SendMessageToSet(&data, true); datMap.push_back(data); - // wpCreature->MonsterMoveWithSpeed(botPos.getX(), botPos.getY() + 80, botPos.getZ(), 8.0f, true, + // wpCreature->MonsterMoveWithSpeed(botPos.GetPositionX(), botPos.GetPositionY() + 80, botPos.GetPositionZ(), 8.0f, true, // true); } } @@ -600,13 +600,13 @@ bool DebugAction::Execute(Event event) uint32 effect = dx + dy * 10 + spellEffect * 100; WorldPosition botPos(bot); - botPos.setX(botPos.getX() + (dx - 5) * 5); - botPos.setY(botPos.getY() + (dy - 5) * 5); + botPos.setX(botPos.GetPositionX() + (dx - 5) * 5); + botPos.setY(botPos.GetPositionY() + (dy - 5) * 5); botPos.setZ(botPos.getHeight()); Creature* wpCreature = - bot->SummonCreature((dy == 0 && (dx == 0 || dx == 2)) ? 6 : 2, botPos.getX(), botPos.getY(), - botPos.getZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 10000.0f); + bot->SummonCreature((dy == 0 && (dx == 0 || dx == 2)) ? 6 : 2, botPos.GetPositionX(), botPos.GetPositionY(), + botPos.GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 10000.0f); if (wpCreature) { @@ -646,12 +646,12 @@ bool DebugAction::Execute(Event event) uint32 effect = dx + dy * 10 + spellEffect * 100; WorldPosition botPos(bot); - botPos.setX(botPos.getX() + (dx - 5) * 5); - botPos.setY(botPos.getY() + (dy - 5) * 5); + botPos.setX(botPos.GetPositionX() + (dx - 5) * 5); + botPos.setY(botPos.GetPositionY() + (dy - 5) * 5); botPos.setZ(botPos.getHeight()); - wpCreature = bot->SummonCreature((dy == 0 && (dx == 0 || dx == 2)) ? 6 : 2, botPos.getX(), - botPos.getY(), botPos.getZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 10000.0f); + wpCreature = bot->SummonCreature((dy == 0 && (dx == 0 || dx == 2)) ? 6 : 2, botPos.GetPositionX(), + botPos.GetPositionY(), botPos.GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 10000.0f); if (wpCreature && lCreature) { @@ -675,11 +675,11 @@ bool DebugAction::Execute(Event event) uint32 effect = dx + dy * 10 + spellEffect * 100; WorldPosition botPos(bot); - botPos.setX(botPos.getX() + (dx - 5) * 5); - botPos.setY(botPos.getY() + (dy - 5) * 5); + botPos.setX(botPos.GetPositionX() + (dx - 5) * 5); + botPos.setY(botPos.GetPositionY() + (dy - 5) * 5); botPos.setZ(botPos.getHeight()); - wpCreature = bot->SummonCreature(2334, botPos.getX(), botPos.getY(), botPos.getZ(), 0, + wpCreature = bot->SummonCreature(2334, botPos.GetPositionX(), botPos.GetPositionY(), botPos.GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 10000.0f); if (wpCreature) @@ -708,11 +708,11 @@ bool DebugAction::Execute(Event event) { WorldPosition botPos(bot); - botPos.setX(botPos.getX() + (dx - 5) * 5); - botPos.setY(botPos.getY() + (dy - 5) * 5); + botPos.setX(botPos.GetPositionX() + (dx - 5) * 5); + botPos.setY(botPos.GetPositionY() + (dy - 5) * 5); botPos.setZ(botPos.getHeight()); - Creature* wpCreature = bot->SummonCreature(2334, botPos.getX(), botPos.getY(), botPos.getZ(), 0, + Creature* wpCreature = bot->SummonCreature(2334, botPos.GetPositionX(), botPos.GetPositionY(), botPos.GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 10000.0f); all_targets.push_back(wpCreature->GetGUID()); @@ -788,11 +788,11 @@ bool DebugAction::Execute(Event event) { WorldPosition botPos(bot); - botPos.setX(botPos.getX() + (dx - 5) * 5); - botPos.setY(botPos.getY() + (dy - 5) * 5); + botPos.setX(botPos.GetPositionX() + (dx - 5) * 5); + botPos.setY(botPos.GetPositionY() + (dy - 5) * 5); botPos.setZ(botPos.getHeight()); - Creature* wpCreature = bot->SummonCreature(2334, botPos.getX(), botPos.getY(), botPos.getZ(), 0, + Creature* wpCreature = bot->SummonCreature(2334, botPos.GetPositionX(), botPos.GetPositionY(), botPos.GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 10000.0f); all_targets.push_back(wpCreature->GetGUID()); @@ -868,13 +868,13 @@ bool DebugAction::Execute(Event event) uint32 effect = dx + dy * 10 + soundEffects * 100; WorldPosition botPos(bot); - botPos.setX(botPos.getX() + (dx - 5) * 5); - botPos.setY(botPos.getY() + (dy - 5) * 5); + botPos.setX(botPos.GetPositionX() + (dx - 5) * 5); + botPos.setY(botPos.GetPositionY() + (dy - 5) * 5); botPos.setZ(botPos.getHeight()); Creature* wpCreature = - bot->SummonCreature((dy == 0 && (dx == 0 || dx == 2)) ? 6 : 2, botPos.getX(), botPos.getY(), - botPos.getZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 10000.0f); + bot->SummonCreature((dy == 0 && (dx == 0 || dx == 2)) ? 6 : 2, botPos.GetPositionX(), botPos.GetPositionY(), + botPos.GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 10000.0f); wpCreature->PlayDistanceSound(effect); } @@ -964,7 +964,7 @@ void DebugAction::FakeSpell(uint32 spellId, Unit* truecaster, Unit* caster, Obje m_targets.SetDst(dest); if ((spellInfo && spellInfo->Targets & TARGET_FLAG_SOURCE_LOCATION) || forceDest) - m_targets.SetSrc(source.getX(), source.getY(), source.getZ()); + m_targets.SetSrc(source.GetPositionX(), source.GetPositionY(), source.GetPositionZ()); if (!forceDest && target) if (!spellInfo || diff --git a/src/Ai/Base/Actions/MovementActions.cpp b/src/Ai/Base/Actions/MovementActions.cpp index c595dff6e43..d4090c0ef2b 100644 --- a/src/Ai/Base/Actions/MovementActions.cpp +++ b/src/Ai/Base/Actions/MovementActions.cpp @@ -370,7 +370,7 @@ bool MovementAction::MoveTo(uint32 mapId, float x, float y, float z, bool idle, // { // movePosition = endPosition; - // if (startPosition.getMapId() != endPosition.getMapId() || totalDistance > maxDist) + // if (startPosition.GetMapId() != endPosition.GetMapId() || totalDistance > maxDist) // { // if (!TravelNodeMap::instance().getNodes().empty() && !bot->InBattleground()) // { @@ -421,7 +421,7 @@ bool MovementAction::MoveTo(uint32 mapId, float x, float y, float z, bool idle, // { // //Use standard PathGenerator to find a route. // PathGenerator path(mover); - // path.CalculatePath(movePosition.getX(), movePosition.getY(), movePosition.getZ(), false); + // path.CalculatePath(movePosition.GetPositionX(), movePosition.GetPositionY(), movePosition.GetPositionZ(), false); // PathType type = path.GetPathType(); // Movement::PointsArray const& points = path.GetPath(); // movePath.addPath(startPosition.fromPointsArray(points)); @@ -485,8 +485,8 @@ bool MovementAction::MoveTo(uint32 mapId, float x, float y, float z, bool idle, // else // { // LOG_DEBUG("playerbots", "!entry"); - // return bot->TeleportTo(movePosition.getMapId(), movePosition.getX(), movePosition.getY(), - // movePosition.getZ(), movePosition.getO(), 0); + // return bot->TeleportTo(movePosition.GetMapId(), movePosition.GetPositionX(), movePosition.GetPositionY(), + // movePosition.GetPositionZ(), movePosition.GetOrientation(), 0); // } // } @@ -563,14 +563,14 @@ bool MovementAction::MoveTo(uint32 mapId, float x, float y, float z, bool idle, // AI_VALUE(LastMovement&, "last movement").setPath(movePath); - // if (!movePosition || movePosition.getMapId() != bot->GetMapId()) + // if (!movePosition || movePosition.GetMapId() != bot->GetMapId()) // { // movePath.clear(); // AI_VALUE(LastMovement&, "last movement").setPath(movePath); // if (botAI->HasStrategy("debug move", BOT_STATE_NON_COMBAT)) // botAI->TellMasterNoFacing("No point. Rebuilding."); - // LOG_DEBUG("playerbots", "!movePosition || movePosition.getMapId() != bot->GetMapId()"); + // LOG_DEBUG("playerbots", "!movePosition || movePosition.GetMapId() != bot->GetMapId()"); // return false; // } @@ -609,15 +609,15 @@ bool MovementAction::MoveTo(uint32 mapId, float x, float y, float z, bool idle, // float cz = z; // for (auto i : movePath.getPath()) // { - // CreateWp(bot, i.point.getX(), i.point.getY(), i.point.getZ(), 0.f, 2334); + // CreateWp(bot, i.point.GetPositionX(), i.point.GetPositionY(), i.point.GetPositionZ(), 0.f, 2334); - // cx = i.point.getX(); - // cy = i.point.getY(); - // cz = i.point.getZ(); + // cx = i.point.GetPositionX(); + // cy = i.point.GetPositionY(); + // cz = i.point.GetPositionZ(); // } // } // else - // CreateWp(bot, movePosition.getX(), movePosition.getY(), movePosition.getZ(), 0, 2334, true); + // CreateWp(bot, movePosition.GetPositionX(), movePosition.GetPositionY(), movePosition.GetPositionZ(), 0, 2334, true); // } // //Log bot movement @@ -634,8 +634,8 @@ bool MovementAction::MoveTo(uint32 mapId, float x, float y, float z, bool idle, // sPlayerbotAIConfig.log("bot_movement.csv", out.str().c_str()); // } - // // LOG_DEBUG("playerbots", "({}, {}) -> ({}, {})", startPosition.getX(), startPosition.getY(), - // movePosition.getX(), movePosition.getY()); if (!react) + // // LOG_DEBUG("playerbots", "({}, {}) -> ({}, {})", startPosition.GetPositionX(), startPosition.GetPositionY(), + // movePosition.GetPositionX(), movePosition.GetPositionY()); if (!react) // if (totalDistance > maxDist) // WaitForReach(startPosition.distance(movePosition) - 10.0f); // else @@ -671,7 +671,7 @@ bool MovementAction::MoveTo(uint32 mapId, float x, float y, float z, bool idle, // // else // // { // // mover->GetMotionMaster()->GetDestination(x, y, z); - // // if (movePosition.distance(WorldPosition(movePosition.getMapId(), x, y, z, 0)) > minDist) + // // if (movePosition.distance(WorldPosition(movePosition.GetMapId(), x, y, z, 0)) > minDist) // // { // // mover->StopMoving(); // // mover->GetMotionMaster()->Clear(); @@ -685,8 +685,8 @@ bool MovementAction::MoveTo(uint32 mapId, float x, float y, float z, bool idle, // AI_VALUE(LastMovement&, "last movement").nextTeleport = now + // (time_t)MoveDelay(startPosition.distance(movePosition)); LOG_DEBUG("playerbots", "totalDistance > maxDist && - // !detailedMove && !botAI->HasPlayerNearby(&movePosition)"); return bot->TeleportTo(movePosition.getMapId(), - // movePosition.getX(), movePosition.getY(), movePosition.getZ(), startPosition.getAngleTo(movePosition)); + // !detailedMove && !botAI->HasPlayerNearby(&movePosition)"); return bot->TeleportTo(movePosition.GetMapId(), + // movePosition.GetPositionX(), movePosition.GetPositionY(), movePosition.GetPositionZ(), startPosition.getAngleTo(movePosition)); // } // // walk if master walks and is close @@ -708,9 +708,9 @@ bool MovementAction::MoveTo(uint32 mapId, float x, float y, float z, bool idle, // if (!bot->HasAuraType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED) && !bot->HasAuraType(SPELL_AURA_FLY)) // { // bot->SetWalk(masterWalking); - // bot->GetMotionMaster()->MovePoint(movePosition.getMapId(), movePosition.getX(), movePosition.getY(), - // movePosition.getZ(), generatePath); WaitForReach(startPosition.distance(movePosition)); - // // LOG_DEBUG("playerbots", "Movepoint to ({}, {})", movePosition.getX(), movePosition.getY()); + // bot->GetMotionMaster()->MovePoint(movePosition.GetMapId(), movePosition.GetPositionX(), movePosition.GetPositionY(), + // movePosition.GetPositionZ(), generatePath); WaitForReach(startPosition.distance(movePosition)); + // // LOG_DEBUG("playerbots", "Movepoint to ({}, {})", movePosition.GetPositionX(), movePosition.GetPositionY()); // } // else // { @@ -756,9 +756,9 @@ bool MovementAction::MoveTo(uint32 mapId, float x, float y, float z, bool idle, // } // } - // bot->GetMotionMaster()->MovePoint(movePosition.getMapId(), Position(movePosition.getX(), movePosition.getY(), - // movePosition.getZ(), 0.f)); WaitForReach(startPosition.distance(movePosition)); LOG_DEBUG("playerbots", - // "Movepoint to ({}, {})", movePosition.getX(), movePosition.getY()); + // bot->GetMotionMaster()->MovePoint(movePosition.GetMapId(), Position(movePosition.GetPositionX(), movePosition.GetPositionY(), + // movePosition.GetPositionZ(), 0.f)); WaitForReach(startPosition.distance(movePosition)); LOG_DEBUG("playerbots", + // "Movepoint to ({}, {})", movePosition.GetPositionX(), movePosition.GetPositionY()); // } // AI_VALUE(LastMovement&, "last movement").setShort(movePosition); @@ -1190,7 +1190,7 @@ bool MovementAction::Follow(Unit* target, float distance, float angle) WorldPosition cPos(corpse); if (botPos.fDist(cPos) > sPlayerbotAIConfig.spellDistance) - return MoveTo(cPos.getMapId(), cPos.getX(), cPos.getY(), cPos.getZ()); + return MoveTo(cPos.GetMapId(), cPos.GetPositionX(), cPos.GetPositionY(), cPos.GetPositionZ()); } } @@ -1217,7 +1217,7 @@ bool MovementAction::Follow(Unit* target, float distance, float angle) if ((lDist * 1.5 < tDist && ang < static_cast(M_PI) / 2) || target->HasUnitState(UNIT_STATE_IN_FLIGHT)) { - return MoveTo(longMove.getMapId(), longMove.getX(), longMove.getY(), longMove.getZ()); + return MoveTo(longMove.GetMapId(), longMove.GetPositionX(), longMove.GetPositionY(), longMove.GetPositionZ()); } } } diff --git a/src/Ai/Base/Actions/ReviveFromCorpseAction.cpp b/src/Ai/Base/Actions/ReviveFromCorpseAction.cpp index 4af96fc6981..970d378f475 100644 --- a/src/Ai/Base/Actions/ReviveFromCorpseAction.cpp +++ b/src/Ai/Base/Actions/ReviveFromCorpseAction.cpp @@ -150,7 +150,7 @@ bool FindCorpseAction::Execute(Event event) { float rx, ry, rz; if (manager.CalculateDestination(&rx, &ry, &rz)) - moveToPos = WorldPosition(moveToPos.getMapId(), rx, ry, rz, 0.0); + moveToPos = WorldPosition(moveToPos.GetMapId(), rx, ry, rz, 0.0); else if (!moveToPos.GetReachableRandomPointOnGround(bot, reclaimDist, urand(0, 1))) moveToPos = corpsePos; } @@ -170,7 +170,7 @@ bool FindCorpseAction::Execute(Event event) { bot->GetMotionMaster()->Clear(); bot->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_TELEPORTED | AURA_INTERRUPT_FLAG_CHANGE_MAP); - bot->TeleportTo(moveToPos.getMapId(), moveToPos.getX(), moveToPos.getY(), moveToPos.getZ(), 0); + bot->TeleportTo(moveToPos.GetMapId(), moveToPos.GetPositionX(), moveToPos.GetPositionY(), moveToPos.GetPositionZ(), 0); } moved = true; @@ -184,7 +184,7 @@ bool FindCorpseAction::Execute(Event event) if (deadTime < 10 * MINUTE && dCount < 5) // Look for corpse up to 30 minutes. { moved = - MoveTo(moveToPos.getMapId(), moveToPos.getX(), moveToPos.getY(), moveToPos.getZ(), false, false); + MoveTo(moveToPos.GetMapId(), moveToPos.GetPositionX(), moveToPos.GetPositionY(), moveToPos.GetPositionZ(), false, false); } if (!moved) @@ -237,10 +237,10 @@ GraveyardStruct const* SpiritHealerAction::GetGrave(bool startZone) { uint32 areaId = 0; uint32 zoneId = 0; - sMapMgr->GetZoneAndAreaId(bot->GetPhaseMask(), zoneId, areaId, travelPos.getMapId(), travelPos.getX(), - travelPos.getY(), travelPos.getZ()); - ClosestGrave = sGraveyard->GetClosestGraveyard(travelPos.getMapId(), travelPos.getX(), travelPos.getY(), - travelPos.getZ(), bot->GetTeamId(), areaId, zoneId, + sMapMgr->GetZoneAndAreaId(bot->GetPhaseMask(), zoneId, areaId, travelPos.GetMapId(), travelPos.GetPositionX(), + travelPos.GetPositionY(), travelPos.GetPositionZ()); + ClosestGrave = sGraveyard->GetClosestGraveyard(travelPos.GetMapId(), travelPos.GetPositionX(), travelPos.GetPositionY(), + travelPos.GetPositionZ(), bot->GetTeamId(), areaId, zoneId, bot->getClass() == CLASS_DEATH_KNIGHT); if (ClosestGrave) diff --git a/src/Ai/Base/Actions/RpgSubActions.cpp b/src/Ai/Base/Actions/RpgSubActions.cpp index 43bff6ab830..3f0947ac83a 100644 --- a/src/Ai/Base/Actions/RpgSubActions.cpp +++ b/src/Ai/Base/Actions/RpgSubActions.cpp @@ -150,7 +150,7 @@ bool RpgTaxiAction::Execute(Event event) bot->GetSession()->HandleCancelMountAuraOpcode(emptyPacket); uint32 node = - sObjectMgr->GetNearestTaxiNode(guidP.getX(), guidP.getY(), guidP.getZ(), guidP.getMapId(), bot->GetTeamId()); + sObjectMgr->GetNearestTaxiNode(guidP.GetPositionX(), guidP.GetPositionY(), guidP.GetPositionZ(), guidP.GetMapId(), bot->GetTeamId()); std::vector nodes; for (uint32 i = 0; i < sTaxiPathStore.GetNumRows(); ++i) @@ -208,7 +208,7 @@ bool RpgDiscoverAction::Execute(Event event) GuidPosition guidP = rpg->guidP(); uint32 node = - sObjectMgr->GetNearestTaxiNode(guidP.getX(), guidP.getY(), guidP.getZ(), guidP.getMapId(), bot->GetTeamId()); + sObjectMgr->GetNearestTaxiNode(guidP.GetPositionX(), guidP.GetPositionY(), guidP.GetPositionZ(), guidP.GetMapId(), bot->GetTeamId()); if (!node) return false; diff --git a/src/Ai/Base/Actions/RtscAction.cpp b/src/Ai/Base/Actions/RtscAction.cpp index 4ed91d29c06..8309a4f09f1 100644 --- a/src/Ai/Base/Actions/RtscAction.cpp +++ b/src/Ai/Base/Actions/RtscAction.cpp @@ -80,8 +80,9 @@ bool RTSCAction::Execute(Event event) SET_AI_VALUE2(WorldPosition, "RTSC saved location", locationName, spellPosition); Creature* wpCreature = - bot->SummonCreature(15631, spellPosition.getX(), spellPosition.getY(), spellPosition.getZ(), - spellPosition.getO(), TEMPSUMMON_TIMED_DESPAWN, 2000.0f); + bot->SummonCreature(15631, spellPosition.GetPositionX(), spellPosition.GetPositionY(), + spellPosition.GetPositionZ(), spellPosition.GetOrientation(), TEMPSUMMON_TIMED_DESPAWN, + 2000.0f); wpCreature->SetObjectScale(0.5f); return true; @@ -110,8 +111,9 @@ bool RTSCAction::Execute(Event event) if (spellPosition) { Creature* wpCreature = - bot->SummonCreature(15631, spellPosition.getX(), spellPosition.getY(), spellPosition.getZ(), - spellPosition.getO(), TEMPSUMMON_TIMED_DESPAWN, 2000.0f); + bot->SummonCreature(15631, spellPosition.GetPositionX(), spellPosition.GetPositionY(), + spellPosition.GetPositionZ(), spellPosition.GetOrientation(), + TEMPSUMMON_TIMED_DESPAWN, 2000.0f); wpCreature->SetObjectScale(0.5f); } diff --git a/src/Ai/Base/Actions/SeeSpellAction.cpp b/src/Ai/Base/Actions/SeeSpellAction.cpp index bec9577cf68..03117586e42 100644 --- a/src/Ai/Base/Actions/SeeSpellAction.cpp +++ b/src/Ai/Base/Actions/SeeSpellAction.cpp @@ -134,8 +134,8 @@ bool SeeSpellAction::Execute(Event event) SET_AI_VALUE2(WorldPosition, "RTSC saved location", locationName, spellPosition); Creature* wpCreature = - bot->SummonCreature(15631, spellPosition.getX(), spellPosition.getY(), spellPosition.getZ(), - spellPosition.getO(), TEMPSUMMON_TIMED_DESPAWN, 2000.0f); + bot->SummonCreature(15631, spellPosition.GetPositionX(), spellPosition.GetPositionY(), spellPosition.GetPositionZ(), + spellPosition.GetOrientation(), TEMPSUMMON_TIMED_DESPAWN, 2000.0f); wpCreature->SetObjectScale(0.5f); RESET_AI_VALUE(std::string, "RTSC next spell action"); @@ -167,14 +167,14 @@ bool SeeSpellAction::MoveToSpell(WorldPosition& spellPosition, bool inFormation) PositionMap& posMap = AI_VALUE(PositionMap&, "position"); PositionInfo stayPosition = posMap["stay"]; - stayPosition.Set(spellPosition.getX(), spellPosition.getY(), spellPosition.getZ(), spellPosition.getMapId()); + stayPosition.Set(spellPosition.GetPositionX(), spellPosition.GetPositionY(), spellPosition.GetPositionZ(), spellPosition.GetMapId()); posMap["stay"] = stayPosition; } - if (bot->IsWithinLOS(spellPosition.getX(), spellPosition.getY(), spellPosition.getZ())) - return MoveNear(spellPosition.getMapId(), spellPosition.getX(), spellPosition.getY(), spellPosition.getZ(), 0); + if (bot->IsWithinLOS(spellPosition.GetPositionX(), spellPosition.GetPositionY(), spellPosition.GetPositionZ())) + return MoveNear(spellPosition.GetMapId(), spellPosition.GetPositionX(), spellPosition.GetPositionY(), spellPosition.GetPositionZ(), 0); - return MoveTo(spellPosition.getMapId(), spellPosition.getX(), spellPosition.getY(), spellPosition.getZ(), false, + return MoveTo(spellPosition.GetMapId(), spellPosition.GetPositionX(), spellPosition.GetPositionY(), spellPosition.GetPositionZ(), false, false); } diff --git a/src/Ai/Base/Trigger/RpgTriggers.cpp b/src/Ai/Base/Trigger/RpgTriggers.cpp index f390359be31..0151c6c5e77 100644 --- a/src/Ai/Base/Trigger/RpgTriggers.cpp +++ b/src/Ai/Base/Trigger/RpgTriggers.cpp @@ -46,7 +46,8 @@ bool RpgTaxiTrigger::IsActive() return false; uint32 node = - sObjectMgr->GetNearestTaxiNode(guidP.getX(), guidP.getY(), guidP.getZ(), guidP.getMapId(), bot->GetTeamId()); + sObjectMgr->GetNearestTaxiNode(guidP.GetPositionX(), guidP.GetPositionY(), guidP.GetPositionZ(), + guidP.GetMapId(), bot->GetTeamId()); if (!node) return false; @@ -68,7 +69,8 @@ bool RpgDiscoverTrigger::IsActive() return false; uint32 node = - sObjectMgr->GetNearestTaxiNode(guidP.getX(), guidP.getY(), guidP.getZ(), guidP.getMapId(), bot->GetTeamId()); + sObjectMgr->GetNearestTaxiNode(guidP.GetPositionX(), guidP.GetPositionY(), guidP.GetPositionZ(), + guidP.GetMapId(), bot->GetTeamId()); if (bot->m_taxi.IsTaximaskNodeKnown(node)) return false; diff --git a/src/Ai/Base/Trigger/StuckTriggers.cpp b/src/Ai/Base/Trigger/StuckTriggers.cpp index f0a54345a1e..b6ade75d867 100644 --- a/src/Ai/Base/Trigger/StuckTriggers.cpp +++ b/src/Ai/Base/Trigger/StuckTriggers.cpp @@ -90,7 +90,7 @@ bool MoveLongStuckTrigger::IsActive() } if (cell.GridX() > 0 && cell.GridY() > 0 && - !MMAP::MMapFactory::createOrGetMMapMgr()->loadMap(botPos.getMapId(), cell.GridX(), cell.GridY())) + !MMAP::MMapFactory::createOrGetMMapMgr()->loadMap(botPos.GetMapId(), cell.GridX(), cell.GridY())) { // LOG_INFO("playerbots", "Bot {} {}:{} <{}> was in unloaded grid {},{} on map {}", // bot->GetGUID().ToString().c_str(), bot->GetTeamId() == TEAM_ALLIANCE ? "A" : "H", bot->GetLevel(), diff --git a/src/Ai/Dungeon/PitOfSaron/Action/PitOfSaronActions.cpp b/src/Ai/Dungeon/PitOfSaron/Action/PitOfSaronActions.cpp index f34b98462eb..d435a208d90 100644 --- a/src/Ai/Dungeon/PitOfSaron/Action/PitOfSaronActions.cpp +++ b/src/Ai/Dungeon/PitOfSaron/Action/PitOfSaronActions.cpp @@ -193,17 +193,18 @@ bool IckAndKrickAction::ExplosiveBarrage(bool explosiveBarrage, Unit* boss) { float angle = i * ANGLE_INCREMENT; Position potentialPos; - potentialPos.m_positionX = bot->GetPositionX() + SAFE_DISTANCE * cos(angle); - potentialPos.m_positionY = bot->GetPositionY() + SAFE_DISTANCE * sin(angle); - potentialPos.m_positionZ = bot->GetPositionZ(); + potentialPos.Relocate(bot->GetPositionX() + SAFE_DISTANCE * cos(angle), + bot->GetPositionY() + SAFE_DISTANCE * sin(angle), + bot->GetPositionZ()); // Check if position is valid (not in a wall) - if (!bot->IsWithinLOS(potentialPos.m_positionX, potentialPos.m_positionY, potentialPos.m_positionZ)) + if (!bot->IsWithinLOS(potentialPos.GetPositionX(), potentialPos.GetPositionY(), + potentialPos.GetPositionZ())) continue; // Check if position is within maximum allowed distance from boss - if (boss && sqrt(pow(potentialPos.m_positionX - boss->GetPositionX(), 2) + - pow(potentialPos.m_positionY - boss->GetPositionY(), 2)) > MAX_BOSS_DISTANCE) + if (boss && sqrt(pow(potentialPos.GetPositionX() - boss->GetPositionX(), 2) + + pow(potentialPos.GetPositionY() - boss->GetPositionY(), 2)) > MAX_BOSS_DISTANCE) continue; // Score this position based on: @@ -216,8 +217,8 @@ bool IckAndKrickAction::ExplosiveBarrage(bool explosiveBarrage, Unit* boss) float minOrbDist = std::numeric_limits::max(); for (Unit* orb : orbs) { - float orbDist = sqrt(pow(potentialPos.m_positionX - orb->GetPositionX(), 2) + - pow(potentialPos.m_positionY - orb->GetPositionY(), 2)); + float orbDist = sqrt(pow(potentialPos.GetPositionX() - orb->GetPositionX(), 2) + + pow(potentialPos.GetPositionY() - orb->GetPositionY(), 2)); minOrbDist = std::min(minOrbDist, orbDist); } score += minOrbDist * 2.0f; // Weight orb distance more heavily @@ -225,16 +226,16 @@ bool IckAndKrickAction::ExplosiveBarrage(bool explosiveBarrage, Unit* boss) // Check distance from other players for (const Position& playerPos : playerPositions) { - float playerDist = sqrt(pow(potentialPos.m_positionX - playerPos.m_positionX, 2) + - pow(potentialPos.m_positionY - playerPos.m_positionY, 2)); + float playerDist = sqrt(pow(potentialPos.GetPositionX() - playerPos.GetPositionX(), 2) + + pow(potentialPos.GetPositionY() - playerPos.GetPositionY(), 2)); score += std::min(playerDist, 10.0f); // Cap player distance contribution } // Factor in proximity to boss (closer is better, as long as we're safe from orbs) if (boss) { - float bossDist = sqrt(pow(potentialPos.m_positionX - boss->GetPositionX(), 2) + - pow(potentialPos.m_positionY - boss->GetPositionY(), 2)); + float bossDist = sqrt(pow(potentialPos.GetPositionX() - boss->GetPositionX(), 2) + + pow(potentialPos.GetPositionY() - boss->GetPositionY(), 2)); // Add points for being closer to boss (inverse relationship) // but only if we're safely away from orbs if (minOrbDist > SAFE_DISTANCE) @@ -257,7 +258,8 @@ bool IckAndKrickAction::ExplosiveBarrage(bool explosiveBarrage, Unit* boss) { botAI->Reset(); // Use MoveTo instead of FleePosition since we already calculated the exact position - return MoveTo(bot->GetMapId(), bestPos.m_positionX, bestPos.m_positionY, bot->GetPositionZ(), false, false, + return MoveTo(bot->GetMapId(), bestPos.GetPositionX(), bestPos.GetPositionY(), bot->GetPositionZ(), false, + false, false, true, MovementPriority::MOVEMENT_COMBAT); } else diff --git a/src/Ai/Raid/GruulsLair/Util/RaidGruulsLairHelpers.cpp b/src/Ai/Raid/GruulsLair/Util/RaidGruulsLairHelpers.cpp index 27c703aecc9..7ed82f19e6c 100644 --- a/src/Ai/Raid/GruulsLair/Util/RaidGruulsLairHelpers.cpp +++ b/src/Ai/Raid/GruulsLair/Util/RaidGruulsLairHelpers.cpp @@ -164,21 +164,21 @@ namespace GruulsLairHelpers { float angle = 2 * M_PI * i / NUM_POSITIONS; Position candidatePos; - candidatePos.m_positionX = bot->GetPositionX() + SEARCH_RADIUS * cos(angle); - candidatePos.m_positionY = bot->GetPositionY() + SEARCH_RADIUS * sin(angle); - candidatePos.m_positionZ = bot->GetPositionZ(); + candidatePos.Relocate(bot->GetPositionX() + SEARCH_RADIUS * cos(angle), + bot->GetPositionY() + SEARCH_RADIUS * sin(angle), + bot->GetPositionZ()); - float destX = candidatePos.m_positionX, destY = candidatePos.m_positionY, destZ = candidatePos.m_positionZ; + float destX = candidatePos.GetPositionX(); + float destY = candidatePos.GetPositionY(); + float destZ = candidatePos.GetPositionZ(); if (!bot->GetMap()->CheckCollisionAndGetValidCoords(bot, bot->GetPositionX(), bot->GetPositionY(), bot->GetPositionZ(), destX, destY, destZ, true)) continue; - if (destX != candidatePos.m_positionX || destY != candidatePos.m_positionY) + if (destX != candidatePos.GetPositionX() || destY != candidatePos.GetPositionY()) continue; - candidatePos.m_positionX = destX; - candidatePos.m_positionY = destY; - candidatePos.m_positionZ = destZ; + candidatePos.Relocate(destX, destY, destZ); if (IsPositionSafe(botAI, bot, candidatePos)) { diff --git a/src/Ai/Raid/Icecrown/Action/RaidIccActions.cpp b/src/Ai/Raid/Icecrown/Action/RaidIccActions.cpp index d6a91d04775..c3e3513e2a3 100644 --- a/src/Ai/Raid/Icecrown/Action/RaidIccActions.cpp +++ b/src/Ai/Raid/Icecrown/Action/RaidIccActions.cpp @@ -1551,8 +1551,10 @@ Position IccFestergutSporeAction::CalculateSpreadPosition() float angle = (bot->GetGUID().GetCounter() % 16) * (M_PI / 8); Position spreadRangedPos = ICC_FESTERGUT_RANGED_SPORE; - spreadRangedPos.m_positionX += cos(angle) * SPREAD_RADIUS; - spreadRangedPos.m_positionY += sin(angle) * SPREAD_RADIUS; + spreadRangedPos.Relocate(spreadRangedPos.GetPositionX() + cos(angle) * SPREAD_RADIUS, + spreadRangedPos.GetPositionY() + sin(angle) * SPREAD_RADIUS, + spreadRangedPos.GetPositionZ(), + spreadRangedPos.GetOrientation()); return spreadRangedPos; } diff --git a/src/Ai/World/Rpg/Action/NewRpgBaseAction.cpp b/src/Ai/World/Rpg/Action/NewRpgBaseAction.cpp index 0204a21331c..bd27bece5dd 100644 --- a/src/Ai/World/Rpg/Action/NewRpgBaseAction.cpp +++ b/src/Ai/World/Rpg/Action/NewRpgBaseAction.cpp @@ -66,7 +66,7 @@ bool NewRpgBaseAction::MoveFarTo(WorldPosition dest) "playerbots", "[New RPG] Teleport {} from ({},{},{},{}) to ({},{},{},{}) as it stuck when moving far - Zone: {} ({})", bot->GetName(), bot->GetPositionX(), bot->GetPositionY(), bot->GetPositionZ(), bot->GetMapId(), - dest.GetPositionX(), dest.GetPositionY(), dest.GetPositionZ(), dest.getMapId(), bot->GetZoneId(), + dest.GetPositionX(), dest.GetPositionY(), dest.GetPositionZ(), dest.GetMapId(), bot->GetZoneId(), zone_name); bot->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_TELEPORTED | AURA_INTERRUPT_FLAG_CHANGE_MAP); return bot->TeleportTo(dest); @@ -75,7 +75,7 @@ bool NewRpgBaseAction::MoveFarTo(WorldPosition dest) float dis = bot->GetExactDist(dest); if (dis < pathFinderDis) { - return MoveTo(dest.getMapId(), dest.GetPositionX(), dest.GetPositionY(), dest.GetPositionZ(), false, false, + return MoveTo(dest.GetMapId(), dest.GetPositionX(), dest.GetPositionY(), dest.GetPositionZ(), false, false, false, true); } diff --git a/src/Bot/PlayerbotAI.cpp b/src/Bot/PlayerbotAI.cpp index 96019402d3b..c8fc4cb303f 100644 --- a/src/Bot/PlayerbotAI.cpp +++ b/src/Bot/PlayerbotAI.cpp @@ -5192,8 +5192,9 @@ std::string const PlayerbotAI::HandleRemoteCommand(std::string const command) { LastMovement& data = *GetAiObjectContext()->GetValue("last movement"); std::ostringstream out; - out << data.lastMoveShort.getX() << " " << data.lastMoveShort.getY() << " " << data.lastMoveShort.getZ() << " " - << data.lastMoveShort.getMapId() << " " << data.lastMoveShort.getO(); + out << data.lastMoveShort.GetPositionX() << " " << data.lastMoveShort.GetPositionY() << " " + << data.lastMoveShort.GetPositionZ() << " " << data.lastMoveShort.GetMapId() << " " + << data.lastMoveShort.GetOrientation(); return out.str(); } else if (command == "target") diff --git a/src/Bot/RandomPlayerbotMgr.cpp b/src/Bot/RandomPlayerbotMgr.cpp index fad757fa931..6cdf1fcaebe 100644 --- a/src/Bot/RandomPlayerbotMgr.cpp +++ b/src/Bot/RandomPlayerbotMgr.cpp @@ -1667,7 +1667,7 @@ void RandomPlayerbotMgr::RandomTeleport(Player* bot, std::vector& { std::vector::iterator i = find(sPlayerbotAIConfig.randomBotMaps.begin(), - sPlayerbotAIConfig.randomBotMaps.end(), l.getMapId()); + sPlayerbotAIConfig.randomBotMaps.end(), l.GetMapId()); return i == sPlayerbotAIConfig.randomBotMaps.end(); }), tlocs.end()); @@ -3073,7 +3073,7 @@ void RandomPlayerbotMgr::OnPlayerLogin(Player* player) FactionTemplateEntry const* factionEntry = sFactionTemplateStore.LookupEntry(cInfo->faction); ReputationRank reaction = Unit::GetFactionReactionTo(player->GetFactionTemplateEntry(), factionEntry); - if (reaction > REP_NEUTRAL && dest->nearestPoint(&botPos)->m_mapId == player->GetMapId()) + if (reaction > REP_NEUTRAL && dest->nearestPoint(&botPos)->GetMapId() == player->GetMapId()) { botPos = *dest->nearestPoint(&botPos); break; diff --git a/src/Mgr/Move/FleeManager.cpp b/src/Mgr/Move/FleeManager.cpp index d3d1a8bb025..e82f01daf06 100644 --- a/src/Mgr/Move/FleeManager.cpp +++ b/src/Mgr/Move/FleeManager.cpp @@ -62,9 +62,9 @@ void FleeManager::calculatePossibleDestinations(std::vector& points) } Unit* target = *botAI->GetAiObjectContext()->GetValue("current target"); - float botPosX = startPosition.getX(); - float botPosY = startPosition.getY(); - float botPosZ = startPosition.getZ(); + float botPosX = startPosition.GetPositionX(); + float botPosY = startPosition.GetPositionY(); + float botPosZ = startPosition.GetPositionZ(); FleePoint start(botAI, botPosX, botPosY, botPosZ); calculateDistanceToCreatures(&start); diff --git a/src/Mgr/Travel/TravelMgr.cpp b/src/Mgr/Travel/TravelMgr.cpp index 02454edc537..1a390d50411 100644 --- a/src/Mgr/Travel/TravelMgr.cpp +++ b/src/Mgr/Travel/TravelMgr.cpp @@ -71,13 +71,13 @@ WorldPosition::WorldPosition(std::vector list, WorldPositionCons set(*list[urand(0, size - 1)]); else if (conType == WP_CENTROID) { - set(std::accumulate(list.begin(), list.end(), WorldLocation(list[0]->getMapId(), 0, 0, 0, 0), + set(std::accumulate(list.begin(), list.end(), WorldLocation(list[0]->GetMapId(), 0, 0, 0, 0), [size](WorldLocation i, WorldPosition* j) { - i.m_positionX += j->getX() / size; - i.m_positionY += j->getY() / size; - i.m_positionZ += j->getZ() / size; - i.NormalizeOrientation(i.m_orientation += j->getO() / size); + i.m_positionX += j->GetPositionX() / size; + i.m_positionY += j->GetPositionY() / size; + i.m_positionZ += j->GetPositionZ() / size; + i.NormalizeOrientation(i.m_orientation += j->GetOrientation() / size); return i; })); } @@ -100,13 +100,13 @@ WorldPosition::WorldPosition(std::vector list, WorldPositionConst set(list[urand(0, size - 1)]); else if (conType == WP_CENTROID) { - set(std::accumulate(list.begin(), list.end(), WorldLocation(list[0].getMapId(), 0, 0, 0, 0), + set(std::accumulate(list.begin(), list.end(), WorldLocation(list[0].GetMapId(), 0, 0, 0, 0), [size](WorldLocation i, WorldPosition& j) { - i.m_positionX += j.getX() / size; - i.m_positionY += j.getY() / size; - i.m_positionZ += j.getZ() / size; - i.NormalizeOrientation(i.m_orientation += j.getO() / size); + i.m_positionX += j.GetPositionX() / size; + i.m_positionY += j.GetPositionY() / size; + i.m_positionZ += j.GetPositionZ() / size; + i.NormalizeOrientation(i.m_orientation += j.GetOrientation() / size); return i; })); } @@ -190,16 +190,6 @@ WorldPosition& WorldPosition::operator-=(WorldPosition const& p1) return *this; } -uint32 WorldPosition::getMapId() { return GetMapId(); } - -float WorldPosition::getX() { return GetPositionX(); } - -float WorldPosition::getY() { return GetPositionY(); } - -float WorldPosition::getZ() { return GetPositionZ(); } - -float WorldPosition::getO() { return GetOrientation(); } - bool WorldPosition::isOverworld() { return GetMapId() == 0 || GetMapId() == 1 || GetMapId() == 530 || GetMapId() == 571; @@ -243,7 +233,7 @@ float WorldPosition::size() float WorldPosition::distance(WorldPosition* center) { - if (GetMapId() == center->getMapId()) + if (GetMapId() == center->GetMapId()) return relPoint(center).size(); // this -> mapTransfer | mapTransfer -> center @@ -252,7 +242,7 @@ float WorldPosition::distance(WorldPosition* center) float WorldPosition::fDist(WorldPosition* center) { - if (GetMapId() == center->getMapId()) + if (GetMapId() == center->GetMapId()) return sqrt(sqDistance2d(center)); // this -> mapTransfer | mapTransfer -> center @@ -328,7 +318,7 @@ WorldPosition WorldPosition::firstOutRange(std::vector list, floa // Returns true if (on the x-y plane) the position is inside the three points. bool WorldPosition::isInside(WorldPosition* p1, WorldPosition* p2, WorldPosition* p3) { - if (getMapId() != p1->getMapId() != p2->getMapId() != p3->getMapId()) + if (GetMapId() != p1->GetMapId() != p2->GetMapId() != p3->GetMapId()) return false; float d1, d2, d3; @@ -348,7 +338,7 @@ MapEntry const* WorldPosition::getMapEntry() { return sMapStore.LookupEntry(GetM uint32 WorldPosition::getInstanceId() { - if (Map* map = sMapMgr->FindBaseMap(getMapId())) + if (Map* map = sMapMgr->FindBaseMap(GetMapId())) return map->GetInstanceId(); return 0; @@ -361,7 +351,7 @@ Map* WorldPosition::getMap() float WorldPosition::getHeight() // remove const - whipowill { - return getMap()->GetHeight(getX(), getY(), getZ()); + return getMap()->GetHeight(GetPositionX(), GetPositionY(), GetPositionZ()); } G3D::Vector3 WorldPosition::getVector3() { return G3D::Vector3(GetPositionX(), GetPositionY(), GetPositionZ()); } @@ -381,11 +371,11 @@ std::string const WorldPosition::print() std::string const WorldPosition::to_string() { std::stringstream out; - out << m_mapId << '|'; - out << m_positionX << '|'; - out << m_positionY << '|'; - out << m_positionZ << '|'; - out << m_orientation; + out << GetMapId() << '|'; + out << GetPositionX() << '|'; + out << GetPositionY() << '|'; + out << GetPositionZ() << '|'; + out << GetOrientation(); return out.str(); } @@ -429,11 +419,14 @@ void WorldPosition::printWKT(std::vector points, std::ostringstre WorldPosition WorldPosition::getDisplayLocation() { - WorldPosition pos = TravelNodeMap::instance().getMapOffset(getMapId()); + WorldPosition pos = TravelNodeMap::instance().getMapOffset(GetMapId()); return offset(const_cast(&pos)); } -uint16 WorldPosition::getAreaId() { return sMapMgr->GetAreaId(PHASEMASK_NORMAL, getMapId(), getX(), getY(), getZ()); } +uint16 WorldPosition::getAreaId() +{ + return sMapMgr->GetAreaId(PHASEMASK_NORMAL, GetMapId(), GetPositionX(), GetPositionY(), GetPositionZ()); +} AreaTableEntry const* WorldPosition::getArea() { @@ -448,7 +441,7 @@ std::string const WorldPosition::getAreaName(bool fullName, bool zoneName) { if (!isOverworld()) { - MapEntry const* map = sMapStore.LookupEntry(getMapId()); + MapEntry const* map = sMapStore.LookupEntry(GetMapId()); if (map) return map->name[0]; } @@ -545,7 +538,7 @@ std::vector WorldPosition::fromGridCoord(GridCoord gridCoord) if (d == 2 || d == 3) g.inc_y(1); - retVec.push_back(WorldPosition(getMapId(), g)); + retVec.push_back(WorldPosition(GetMapId(), g)); } return retVec; @@ -566,7 +559,7 @@ std::vector WorldPosition::fromCellCoord(CellCoord cellcoord) if (d == 2 || d == 3) p.inc_y(1); - retVec.push_back(WorldPosition(getMapId(), p)); + retVec.push_back(WorldPosition(GetMapId(), p)); } return retVec; } @@ -618,7 +611,7 @@ std::vector WorldPosition::frommGridCoord(mGridCoord GridCoord) if (d == 2 || d == 3) g.first++; - retVec.push_back(WorldPosition(getMapId(), g)); + retVec.push_back(WorldPosition(GetMapId(), g)); } return retVec; @@ -706,7 +699,7 @@ void WorldPosition::loadMapAndVMaps(WorldPosition secondPos) { for (auto& grid : getmGridCoords(secondPos)) { - loadMapAndVMap(getMapId(), grid.first, grid.second); + loadMapAndVMap(GetMapId(), grid.first, grid.second); } } @@ -714,7 +707,7 @@ std::vector WorldPosition::fromPointsArray(std::vector retVec; for (auto p : path) - retVec.push_back(WorldPosition(getMapId(), p.x, p.y, p.z, getO())); + retVec.push_back(WorldPosition(GetMapId(), p.x, p.y, p.z, GetOrientation())); return retVec; } @@ -729,7 +722,7 @@ std::vector WorldPosition::getPathStepFrom(WorldPosition startPos loadMapAndVMaps(startPos); PathGenerator path(bot); - path.CalculatePath(startPos.getX(), startPos.getY(), startPos.getZ()); + path.CalculatePath(startPos.GetPositionX(), startPos.GetPositionY(), startPos.GetPositionZ()); Movement::PointsArray points = path.GetPath(); PathType type = path.GetPathType(); @@ -785,7 +778,7 @@ std::vector WorldPosition::getPathFromPath(std::vector subPath, fullPath = startPath; @@ -818,10 +811,18 @@ bool WorldPosition::GetReachableRandomPointOnGround(Player* bot, float radius, b { radius *= randomRange ? rand_norm() : 1.f; float angle = rand_norm() * static_cast(2 * M_PI); - m_positionX += radius * cosf(angle); - m_positionY += radius * sinf(angle); - - return getMap()->CanReachPositionAndGetValidCoords(bot, m_positionX, m_positionY, m_positionZ); + setX(GetPositionX() + radius * cosf(angle)); + setY(GetPositionY() + radius * sinf(angle)); + + float x = GetPositionX(); + float y = GetPositionY(); + float z = GetPositionZ(); + bool canReach = getMap()->CanReachPositionAndGetValidCoords(bot, x, y, z); + setX(x); + setY(y); + setZ(z); + + return canReach; } uint32 WorldPosition::getUnitsAggro(GuidVector& units, Player* bot) @@ -844,7 +845,7 @@ uint32 WorldPosition::getUnitsAggro(GuidVector& units, Player* bot) void FindPointCreatureData::operator()(CreatureData const& creatureData) { if (!entry || creatureData.id1 == entry) - if ((!point || creatureData.mapid == point.getMapId()) && + if ((!point || creatureData.mapid == point.GetMapId()) && (!radius || point.sqDistance(WorldPosition(creatureData.mapid, creatureData.posX, creatureData.posY, creatureData.posZ)) < radius * radius)) { @@ -855,7 +856,7 @@ void FindPointCreatureData::operator()(CreatureData const& creatureData) void FindPointGameObjectData::operator()(GameObjectData const& gameobjectData) { if (!entry || gameobjectData.id == entry) - if ((!point || gameobjectData.mapid == point.getMapId()) && + if ((!point || gameobjectData.mapid == point.GetMapId()) && (!radius || point.sqDistance(WorldPosition(gameobjectData.mapid, gameobjectData.posX, gameobjectData.posY, gameobjectData.posZ)) < radius * radius)) { @@ -3223,7 +3224,8 @@ void TravelMgr::LoadQuestTravelTable() if (loc.second.empty()) continue; - if (!TravelNodeMap::instance().getMapOffset(loc.second.front().getMapId()) && loc.second.front().getMapId() != 0) + if (!TravelNodeMap::instance().getMapOffset(loc.second.front().GetMapId()) && + loc.second.front().GetMapId() != 0) continue; std::vector points = loc.second; @@ -3235,7 +3237,7 @@ void TravelMgr::LoadQuestTravelTable() out << "\"center\"" << ","; - out << points.begin()->getMapId() << ","; + out << points.begin()->GetMapId() << ","; out << points.begin()->getAreaName() << ","; out << points.begin()->getAreaName(true, true) << ","; @@ -3245,7 +3247,7 @@ void TravelMgr::LoadQuestTravelTable() out << "\"area\"" << ","; - out << points.begin()->getMapId() << ","; + out << points.begin()->GetMapId() << ","; out << points.begin()->getAreaName() << ","; out << points.begin()->getAreaName(true, true) << ","; @@ -3613,17 +3615,18 @@ void TravelMgr::LoadQuestTravelTable() if (!pos->getMap()) continue; - float nx = pos->getX() + (x*5)-5000.0f; - float ny = pos->getY() + (y*5)-5000.0f; - float nz = pos->getZ() + 100.0f; + float nx = pos->GetPositionX() + (x * 5) - 5000.0f; + float ny = pos->GetPositionY() + (y * 5) - 5000.0f; + float nz = pos->GetPositionZ() + 100.0f; //pos->getMap()->GetHitPosition(nx, ny, nz + 200.0f, nx, ny, nz, -0.5f); if (!pos->getMap()->GetHeightInRange(nx, ny, nz, 5000.0f)) // GetHeight can fail continue; - WorldPosition npos = WorldPosition(pos->getMapId(), nx, ny, nz, 0.0); - uint32 area = path.getArea(npos.getMapId(), npos.getX(), npos.getY(), npos.getZ()); + WorldPosition npos = WorldPosition(pos->GetMapId(), nx, ny, nz, 0.0); + uint32 area = path.getArea(npos.GetMapId(), npos.GetPositionX(), npos.GetPositionY(), + npos.GetPositionZ()); std::ostringstream out; out << std::fixed << area << "," << npos.getDisplayX() << "," << npos.getDisplayY(); @@ -3647,7 +3650,8 @@ void TravelMgr::LoadQuestTravelTable() std::string const name = i.second->getTitle(); name.erase(remove(name.begin(), name.end(), '\"'), name.end()); out << std::fixed << std::setprecision(2) << name.c_str() << "," << i.first << "," << j->getDisplayX() << - "," << j->getDisplayY() << "," << j->getX() << "," << j->getY() << "," << j->getZ(); sPlayerbotAIConfig.log(5, + "," << j->getDisplayY() << "," << j->GetPositionX() << "," << j->GetPositionY() << "," << j->GetPositionZ(); + sPlayerbotAIConfig.log(5, out.str().c_str()); } } @@ -4087,8 +4091,8 @@ void TravelMgr::setNullTravelTarget(Player* player) void TravelMgr::addMapTransfer(WorldPosition start, WorldPosition end, float portalDistance, bool makeShortcuts) { - uint32 sMap = start.getMapId(); - uint32 eMap = end.getMapId(); + uint32 sMap = start.GetMapId(); + uint32 eMap = end.GetMapId(); if (sMap == eMap) return; @@ -4121,7 +4125,7 @@ void TravelMgr::addMapTransfer(WorldPosition start, WorldPosition end, float por } // Add actual transfer. - auto mapTransfers = mapTransfersMap.find(std::make_pair(start.getMapId(), end.getMapId())); + auto mapTransfers = mapTransfersMap.find(std::make_pair(start.GetMapId(), end.GetMapId())); if (mapTransfers == mapTransfersMap.end()) mapTransfersMap.insert({{sMap, eMap}, {mapTransfer(start, end, portalDistance)}}); @@ -4142,8 +4146,8 @@ void TravelMgr::loadMapTransfers() float TravelMgr::mapTransDistance(WorldPosition start, WorldPosition end) { - uint32 sMap = start.getMapId(); - uint32 eMap = end.getMapId(); + uint32 sMap = start.GetMapId(); + uint32 eMap = end.GetMapId(); if (sMap == eMap) return start.distance(end); @@ -4167,8 +4171,8 @@ float TravelMgr::mapTransDistance(WorldPosition start, WorldPosition end) float TravelMgr::fastMapTransDistance(WorldPosition start, WorldPosition end) { - uint32 sMap = start.getMapId(); - uint32 eMap = end.getMapId(); + uint32 sMap = start.GetMapId(); + uint32 eMap = end.GetMapId(); if (sMap == eMap) return start.fDist(end); diff --git a/src/Mgr/Travel/TravelMgr.h b/src/Mgr/Travel/TravelMgr.h index 68542a7d07f..7e2a40b1605 100644 --- a/src/Mgr/Travel/TravelMgr.h +++ b/src/Mgr/Travel/TravelMgr.h @@ -120,12 +120,6 @@ class WorldPosition : public WorldLocation WorldPosition& operator+=(WorldPosition const& p1); WorldPosition& operator-=(WorldPosition const& p1); - uint32 getMapId(); - float getX(); - float getY(); - float getZ(); - float getO(); - G3D::Vector3 getVector3(); std::string const print(); @@ -185,29 +179,29 @@ class WorldPosition : public WorldLocation // Quick square distance in 2d plane. float sqDistance2d(WorldPosition center) { - return (getX() - center.getX()) * (getX() - center.getX()) + - (getY() - center.getY()) * (getY() - center.getY()); + return (GetPositionX() - center.GetPositionX()) * (GetPositionX() - center.GetPositionX()) + + (GetPositionY() - center.GetPositionY()) * (GetPositionY() - center.GetPositionY()); } // Quick square distance calculation without map check. Used for getting the minimum distant points. float sqDistance(WorldPosition center) { - return (getX() - center.getX()) * (getX() - center.getX()) + - (getY() - center.getY()) * (getY() - center.getY()) + - (getZ() - center.getZ()) * (getZ() - center.getZ()); + return (GetPositionX() - center.GetPositionX()) * (GetPositionX() - center.GetPositionX()) + + (GetPositionY() - center.GetPositionY()) * (GetPositionY() - center.GetPositionY()) + + (GetPositionZ() - center.GetPositionZ()) * (GetPositionZ() - center.GetPositionZ()); } float sqDistance2d(WorldPosition* center) { - return (getX() - center->getX()) * (getX() - center->getX()) + - (getY() - center->getY()) * (getY() - center->getY()); + return (GetPositionX() - center->GetPositionX()) * (GetPositionX() - center->GetPositionX()) + + (GetPositionY() - center->GetPositionY()) * (GetPositionY() - center->GetPositionY()); } float sqDistance(WorldPosition* center) { - return (getX() - center->getX()) * (getX() - center->getX()) + - (getY() - center->getY()) * (getY() - center->getY()) + - (getZ() - center->getZ()) * (getZ() - center->getZ()); + return (GetPositionX() - center->GetPositionX()) * (GetPositionX() - center->GetPositionX()) + + (GetPositionY() - center->GetPositionY()) * (GetPositionY() - center->GetPositionY()) + + (GetPositionZ() - center->GetPositionZ()) * (GetPositionZ() - center->GetPositionZ()); } // Returns the closest point of the list. Fast but only works for the same map. @@ -227,7 +221,7 @@ class WorldPosition : public WorldLocation float getAngleTo(WorldPosition endPos) { - float ang = atan2(endPos.getY() - getY(), endPos.getX() - getX()); + float ang = atan2(endPos.GetPositionY() - GetPositionY(), endPos.GetPositionX() - GetPositionX()); return (ang >= 0) ? ang : 2 * static_cast(M_PI) + ang; } @@ -238,7 +232,8 @@ class WorldPosition : public WorldLocation float mSign(WorldPosition* p1, WorldPosition* p2) { - return (getX() - p2->getX()) * (p1->getY() - p2->getY()) - (p1->getX() - p2->getX()) * (getY() - p2->getY()); + return (GetPositionX() - p2->GetPositionX()) * (p1->GetPositionY() - p2->GetPositionY()) - + (p1->GetPositionX() - p2->GetPositionX()) * (GetPositionY() - p2->GetPositionY()); } bool isInside(WorldPosition* p1, WorldPosition* p2, WorldPosition* p3); @@ -251,18 +246,23 @@ class WorldPosition : public WorldLocation std::set getTransports(uint32 entry = 0); - GridCoord getGridCoord() { return Acore::ComputeGridCoord(getX(), getY()); }; + CellCoord getCellCoord() { return Acore::ComputeCellCoord(GetPositionX(), GetPositionY()); } + GridCoord getGridCoord() + { + CellCoord cellCoord = getCellCoord(); + Cell cell(cellCoord); + return GridCoord(cell.GridX(), cell.GridY()); + } std::vector getGridCoord(WorldPosition secondPos); std::vector fromGridCoord(GridCoord GridCoord); - CellCoord getCellCoord() { return Acore::ComputeCellCoord(getX(), getY()); } std::vector fromCellCoord(CellCoord cellCoord); std::vector gridFromCellCoord(CellCoord cellCoord); mGridCoord getmGridCoord() { - return std::make_pair((int32)(CENTER_GRID_ID - getX() / SIZE_OF_GRIDS), - (int32)(CENTER_GRID_ID - getY() / SIZE_OF_GRIDS)); + return std::make_pair((int32)(CENTER_GRID_ID - GetPositionX() / SIZE_OF_GRIDS), + (int32)(CENTER_GRID_ID - GetPositionY() / SIZE_OF_GRIDS)); } std::vector getmGridCoords(WorldPosition secondPos); @@ -270,15 +270,15 @@ class WorldPosition : public WorldLocation void loadMapAndVMap(uint32 mapId, uint8 x, uint8 y); - void loadMapAndVMap() { loadMapAndVMap(getMapId(), getmGridCoord().first, getmGridCoord().second); } + void loadMapAndVMap() { loadMapAndVMap(GetMapId(), getmGridCoord().first, getmGridCoord().second); } void loadMapAndVMaps(WorldPosition secondPos); // Display functions WorldPosition getDisplayLocation(); - float getDisplayX() { return getDisplayLocation().getY() * -1.0; } + float getDisplayX() { return getDisplayLocation().GetPositionY() * -1.0; } - float getDisplayY() { return getDisplayLocation().getX(); } + float getDisplayY() { return getDisplayLocation().GetPositionX(); } uint16 getAreaId(); AreaTableEntry const* getArea(); @@ -334,11 +334,11 @@ class WorldPosition : public WorldLocation inline ByteBuffer& operator<<(ByteBuffer& b, WorldPosition& guidP) { - b << guidP.getMapId(); - b << guidP.getX(); - b << guidP.getY(); - b << guidP.getZ(); - b << guidP.getO(); + b << guidP.GetMapId(); + b << guidP.GetPositionX(); + b << guidP.GetPositionY(); + b << guidP.GetPositionZ(); + b << guidP.GetOrientation(); b << guidP.getVisitors(); return b; } @@ -461,9 +461,9 @@ class mapTransfer { } - bool isFrom(WorldPosition point) { return point.getMapId() == pointFrom.getMapId(); } + bool isFrom(WorldPosition point) { return point.GetMapId() == pointFrom.GetMapId(); } - bool isTo(WorldPosition point) { return point.getMapId() == pointTo.getMapId(); } + bool isTo(WorldPosition point) { return point.GetMapId() == pointTo.GetMapId(); } WorldPosition* getPointFrom() { return &pointFrom; } @@ -543,7 +543,7 @@ class TravelDestination WorldPosition* nearestPoint(WorldPosition* pos); float distanceTo(WorldPosition* pos) { return nearestPoint(pos)->distance(pos); } - bool onMap(WorldPosition* pos) { return nearestPoint(pos)->getMapId() == pos->getMapId(); } + bool onMap(WorldPosition* pos) { return nearestPoint(pos)->GetMapId() == pos->GetMapId(); } virtual bool isIn(WorldPosition* pos, float radius = 0.f) { return onMap(pos) && distanceTo(pos) <= (radius ? radius : radiusMin); diff --git a/src/Mgr/Travel/TravelNode.cpp b/src/Mgr/Travel/TravelNode.cpp index 0cb88f9b11d..bdf9cc9525f 100644 --- a/src/Mgr/Travel/TravelNode.cpp +++ b/src/Mgr/Travel/TravelNode.cpp @@ -81,7 +81,7 @@ void TravelNodePath::calculateCost(bool distanceOnly) } } - if (lastPoint && point.getMapId() == lastPoint.getMapId()) + if (lastPoint && point.GetMapId() == lastPoint.GetMapId()) { if (!distanceOnly && (point.isInWater() || lastPoint.isInWater())) swimDistance += point.distance(lastPoint); @@ -687,7 +687,7 @@ bool TravelPath::makeShortCut(WorldPosition startPos, float maxDist) // if (p.point.getMapId() != startPos.getMapId()) // continue; - if (p.point.getMapId() == startPos.getMapId()) + if (p.point.GetMapId() == startPos.GetMapId()) { float curDist = p.point.sqDistance(startPos); @@ -722,7 +722,7 @@ bool TravelPath::makeShortCut(WorldPosition startPos, float maxDist) newPath.push_back(p); } - if (newPath.empty() || minDist > maxDistSq || newPath.front().point.getMapId() != startPos.getMapId()) + if (newPath.empty() || minDist > maxDistSq || newPath.front().point.GetMapId() != startPos.GetMapId()) { clear(); return false; @@ -800,7 +800,7 @@ bool TravelPath::shouldMoveToNextPoint(WorldPosition startPos, std::vectorpoint.distance(nextP->point); - if (p->point.getMapId() != startPos.getMapId() || + if (p->point.GetMapId() != startPos.GetMapId() || ((moveDist + nextMove > maxDist || startPos.distance(nextP->point) > maxDist) && moveDist > 0)) { return false; @@ -827,7 +827,7 @@ WorldPosition TravelPath::getNextPoint(WorldPosition startPos, float maxDist, Tr // Get the closest point on the path to start from. for (auto p = startP; p != ed; p++) { - if (p->point.getMapId() != startPos.getMapId()) + if (p->point.GetMapId() != startPos.GetMapId()) continue; float curDist = p->point.distance(startPos); @@ -1126,7 +1126,7 @@ std::vector TravelNodeMap::getNodes(WorldPosition pos, float range) for (auto& node : m_nodes) { - if (node->getMapId() == pos.getMapId()) + if (node->getMapId() == pos.GetMapId()) if (range == -1 || node->getDistance(pos) <= range) retVec.push_back(node); } @@ -1787,8 +1787,9 @@ void TravelNodeMap::generateTransportNodes() float dy = -1 * p.second->Y; WorldPosition pos = - WorldPosition(basePos.getMapId(), basePos.getX() + dx, basePos.getY() + dy, - basePos.getZ() + p.second->Z, basePos.getO()); + WorldPosition(basePos.GetMapId(), basePos.GetPositionX() + dx, + basePos.GetPositionY() + dy, basePos.GetPositionZ() + p.second->Z, + basePos.GetOrientation()); if (prevNode) { @@ -1830,8 +1831,9 @@ void TravelNodeMap::generateTransportNodes() float dx = -1 * p.second->X; float dy = -1 * p.second->Y; WorldPosition pos = - WorldPosition(basePos.getMapId(), basePos.getX() + dx, basePos.getY() + dy, - basePos.getZ() + p.second->Z, basePos.getO()); + WorldPosition(basePos.GetMapId(), basePos.GetPositionX() + dx, + basePos.GetPositionY() + dy, basePos.GetPositionZ() + p.second->Z, + basePos.GetOrientation()); ppath.push_back(pos); @@ -2356,10 +2358,10 @@ void TravelNodeMap::saveNodeStore() stmt->SetData(0, i); stmt->SetData(1, saveNodes.find(link.first)->second); stmt->SetData(2, j); - stmt->SetData(3, point.getMapId()); - stmt->SetData(4, point.getX()); - stmt->SetData(5, point.getY()); - stmt->SetData(6, point.getZ()); + stmt->SetData(3, point.GetMapId()); + stmt->SetData(4, point.GetPositionX()); + stmt->SetData(5, point.GetPositionY()); + stmt->SetData(6, point.GetPositionZ()); trans->Append(stmt); points++; @@ -2516,10 +2518,10 @@ void TravelNodeMap::calcMapOffset() } else { - min.back().setX(std::min(min.back().getX(), node->getX())); - min.back().setY(std::min(min.back().getY(), node->getY())); - max.back().setX(std::max(max.back().getX(), node->getX())); - max.back().setY(std::max(max.back().getY(), node->getY())); + min.back().setX(std::min(min.back().GetPositionX(), node->getX())); + min.back().setY(std::min(min.back().GetPositionY(), node->getY())); + max.back().setX(std::max(max.back().GetPositionX(), node->getX())); + max.back().setY(std::max(max.back().GetPositionY(), node->getY())); } } } @@ -2533,14 +2535,15 @@ void TravelNodeMap::calcMapOffset() for (auto& mapId : mapIds) { mapOffsets.push_back(std::make_pair( - mapId, WorldPosition(mapId, curPos.getX() - min[i].getX(), curPos.getY() - max[i].getY(), 0, 0))); + mapId, WorldPosition(mapId, curPos.GetPositionX() - min[i].GetPositionX(), + curPos.GetPositionY() - max[i].GetPositionY(), 0, 0))); - maxY = std::max(maxY, (max[i].getY() - min[i].getY() + 500)); - curPos.setX(curPos.getX() + (max[i].getX() - min[i].getX() + 500)); + maxY = std::max(maxY, (max[i].GetPositionY() - min[i].GetPositionY() + 500)); + curPos.setX(curPos.GetPositionX() + (max[i].GetPositionX() - min[i].GetPositionX() + 500)); - if (curPos.getX() > endPos.getX()) + if (curPos.GetPositionX() > endPos.GetPositionX()) { - curPos.setY(curPos.getY() - maxY); + curPos.setY(curPos.GetPositionY() - maxY); curPos.setX(-13000); } diff --git a/src/Mgr/Travel/TravelNode.h b/src/Mgr/Travel/TravelNode.h index 41419f8a973..4dc2357216d 100644 --- a/src/Mgr/Travel/TravelNode.h +++ b/src/Mgr/Travel/TravelNode.h @@ -251,11 +251,11 @@ class TravelNode } // WorldLocation shortcuts - uint32 getMapId() { return point.getMapId(); } - float getX() { return point.getX(); } - float getY() { return point.getY(); } - float getZ() { return point.getZ(); } - float getO() { return point.getO(); } + uint32 getMapId() { return point.GetMapId(); } + float getX() { return point.GetPositionX(); } + float getY() { return point.GetPositionY(); } + float getZ() { return point.GetPositionZ(); } + float getO() { return point.GetOrientation(); } float getDistance(WorldPosition pos) { return point.distance(pos); } float getDistance(TravelNode* node) { return point.distance(node->getPosition()); } float fDist(TravelNode* node) { return point.fDist(node->getPosition()); } From 9748e36ad67df1ddb4d15518b0229ae37b07c85d Mon Sep 17 00:00:00 2001 From: Crow Date: Fri, 13 Feb 2026 11:25:12 -0600 Subject: [PATCH 05/25] Fix potential failure of Magtheridon cube clickers to engage in combat (#2129) # Pull Request I noticed a problem that has always existed with the Magtheridon strategy but just never came up for me due to chance. Cube clicker logic is based on a timer that resets after every Blast Nova. If the timer is not reset, the cubes will still be clicked, but the clickers will do nothing but wait to click on the cubes instead of resuming combat between Blast Novas. Because tracking of the Blast Nova state happens during the cube clicking sequence, if a cube clicker is assigned the singular role to track Blast Nova state (which is done simply by returning the first DPS bot found), then the timer will not be reset. This whole strategy needs a refactor, but the simple fix for this problem for now is just to remove the role check for tracking the Blast Nova state. I tested the fix, and it works. --- ## Design Philosophy We prioritize **stability, performance, and predictability** over behavioral realism. Complex player-mimicking logic is intentionally limited due to its negative impact on scalability, maintainability, and long-term robustness. Excessive processing overhead can lead to server hiccups, increased CPU usage, and degraded performance for all participants. Because every action and decision tree is executed **per bot and per trigger**, even small increases in logic complexity can scale poorly and negatively affect both players and world (random) bots. Bots are not expected to behave perfectly, and perfect simulation of human decision-making is not a project goal. Increased behavioral realism often introduces disproportionate cost, reduced predictability, and significantly higher maintenance overhead. Every additional branch of logic increases long-term responsibility. All decision paths must be tested, validated, and maintained continuously as the system evolves. If advanced or AI-intensive behavior is introduced, the **default configuration must remain the lightweight decision model**. More complex behavior should only be available as an **explicit opt-in option**, clearly documented as having a measurable performance cost. Principles: - **Stability before intelligence** A stable system is always preferred over a smarter one. - **Performance is a shared resource** Any increase in bot cost affects all players and all bots. - **Simple logic scales better than smart logic** Predictable behavior under load is more valuable than perfect decisions. - **Complexity must justify itself** If a feature cannot clearly explain its cost, it should not exist. - **Defaults must be cheap** Expensive behavior must always be optional and clearly communicated. - **Bots should look reasonable, not perfect** The goal is believable behavior, not human simulation. Before submitting, confirm that this change aligns with those principles. --- ## Feature Evaluation Please answer the following: - Describe the **minimum logic** required to achieve the intended behavior? - Describe the **cheapest implementation** that produces an acceptable result? - Describe the **runtime cost** when this logic executes across many bots? --- ## How to Test the Changes - Step-by-step instructions to test the change - Any required setup (e.g. multiple players, bots, specific configuration) - Expected behavior and how to verify it ## Complexity & Impact Does this change add new decision branches? - - [X] No - - [ ] Yes (**explain below**) Does this change increase per-bot or per-tick processing? - - [X] No - - [ ] Yes (**describe and justify impact**) Could this logic scale poorly under load? - - [X] No - - [ ] Yes (**explain why**) --- ## Defaults & Configuration Does this change modify default bot behavior? - - [X] No - - [ ] Yes (**explain why**) If this introduces more advanced or AI-heavy logic: - - [ ] Lightweight mode remains the default - - [ ] More complex behavior is optional and thereby configurable --- ## AI Assistance Was AI assistance (e.g. ChatGPT or similar tools) used while working on this change? - - [X] No - - [ ] Yes (**explain below**) If yes, please specify: - AI tool or model used (e.g. ChatGPT, GPT-4, Claude, etc.) - Purpose of usage (e.g. brainstorming, refactoring, documentation, code generation) - Which parts of the change were influenced or generated - Whether the result was manually reviewed and adapted AI assistance is allowed, but all submitted code must be fully understood, reviewed, and owned by the contributor. Any AI-influenced changes must be verified against existing CORE and PB logic. We expect contributors to be honest about what they do and do not understand. --- ## Final Checklist - - [ ] Stability is not compromised - - [ ] Performance impact is understood, tested, and acceptable - - [ ] Added logic complexity is justified and explained - - [ ] Documentation updated if needed --- ## Notes for Reviewers Anything that significantly improves realism at the cost of stability or performance should be carefully discussed before merging. --- src/Ai/Raid/Magtheridon/Action/RaidMagtheridonActions.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Ai/Raid/Magtheridon/Action/RaidMagtheridonActions.cpp b/src/Ai/Raid/Magtheridon/Action/RaidMagtheridonActions.cpp index dab7efab97e..7f1ad5b859f 100644 --- a/src/Ai/Raid/Magtheridon/Action/RaidMagtheridonActions.cpp +++ b/src/Ai/Raid/Magtheridon/Action/RaidMagtheridonActions.cpp @@ -640,7 +640,7 @@ bool MagtheridonManageTimersAndAssignmentsAction::Execute(Event event) magtheridon->FindCurrentSpellBySpellId(SPELL_BLAST_NOVA); bool lastBlastNova = lastBlastNovaState[instanceId]; - if (lastBlastNova && !blastNovaActive && IsMechanicTrackerBot(botAI, bot, MAGTHERIDON_MAP_ID, nullptr)) + if (lastBlastNova && !blastNovaActive) blastNovaTimer[instanceId] = now; lastBlastNovaState[instanceId] = blastNovaActive; From 25800f54e8c0b40eee1933636d6aaf1d904da57d Mon Sep 17 00:00:00 2001 From: NoxMax <50133316+NoxMax@users.noreply.github.com> Date: Fri, 13 Feb 2026 10:31:55 -0700 Subject: [PATCH 06/25] Fix/Feat: PVP with master and PVP probablity system (thread-safe remake) (#2008) This is a remake of #1914 that had to be reverted. Original PR had a thread-safe issue where a crash happens if multiple threads access the cache at the same time. Unfortunately this problem was not caught in earlier testing. I don't know if because I was testing on a month old branch, if my settings had only ~2000, or if I needed test runs longer than an hour to find out. Regardless, this has all been addressed. Test have been run on the latest commits from today (2026/1/11), with all 7500 of my bots active, with a test run that lasted 15 hours. All stable and bots are following the probability system without issue. ~~The new edit uses mutex locking, preventing simultaneous access of the cache by multiple threads.~~ The new edit uses deterministic hashing, thereby not having issues with cache thread safety to begin with. Thank you @hermensbas for catching and reverting the original problem PR. Apologies for not catching the issue myself. --- Original PR description: There are two related PVP components in this PR. First is the simple yet fundamental change to bot behaviour when they are in party. Right now bots with a master will go into PVP when there's a nearby PVP target, even if master is not in PVP. This absolutely should not happen. Bots should not consider PVP at all if master is not in PVP. The fix is only 3 lines in EnemyPlayerValue The second component is introducing PVP probabilities, to make decisions more realistic. Right now even a level 1 bot will 100% go into PVP if it sees a level 80 PVP target. They can't help themselves. So the change here addresses that insanity. Several thresholds (subject to community review) are introduced: 1. Bots will not fight a target 5 or more levels higher than them 2. Bots have a 25% chance starting a fight with a target +/- 4 levels from them. 3. Bots have a 50% chance starting a fight with a target +/- 3 levels from them. 4. Bots have a 75% chance starting a fight with a target +/- 2 levels from them. 5. Bots have a 100% chance starting a fight with a target +/- 1 level from them. 6. Bots have a 25% chance starting a fight with a target 5 or more levels below them (ganking. thought it would be funny, and technically realistic of player behaviour) Exception of course exist for BG/Arena/Duel, and in capitals where bots will always PVP. Also bots will always defend themselves if attacked. Few notes: 1. The if/ else if logic can be further simplified, but only if we use thresholds that are different by one. So current logic allows for flexibility of using values like 10/7/5/3 instead of 5/4/3/2. 2. The caching system is per-bot basis. So for some target X, if some bot decides to attack it, another bot will make its own decision. At first I used a simplified global system (thinking there might be performance concerns) where if one bot decides to attack a target then they all do, but when I switched to the more realistic per-bot basis, I didn't see an effect on performance. 3. Variables are obviously not configurable right now. I'm starting to see Bash's POV that maybe we have too many configs :grimacing: Still, they can be easily exposed in the future, and if someone is reading this then, remember to change constexpr to const. --------- Co-authored-by: bashermens <31279994+hermensbas@users.noreply.github.com> --- src/Ai/Base/Value/EnemyPlayerValue.cpp | 11 ++ src/Ai/Base/Value/PossibleTargetsValue.cpp | 117 ++++++++++++++++++++- 2 files changed, 123 insertions(+), 5 deletions(-) diff --git a/src/Ai/Base/Value/EnemyPlayerValue.cpp b/src/Ai/Base/Value/EnemyPlayerValue.cpp index 7de0cd670a8..c2f6e056a2f 100644 --- a/src/Ai/Base/Value/EnemyPlayerValue.cpp +++ b/src/Ai/Base/Value/EnemyPlayerValue.cpp @@ -11,6 +11,10 @@ bool NearestEnemyPlayersValue::AcceptUnit(Unit* unit) { + // Apply parent's filtering first (includes level difference checks) + if (!PossibleTargetsValue::AcceptUnit(unit)) + return false; + bool inCannon = botAI->IsInVehicle(false, true); Player* enemy = dynamic_cast(unit); if (enemy && botAI->IsOpposing(enemy) && enemy->IsPvP() && @@ -19,7 +23,14 @@ bool NearestEnemyPlayersValue::AcceptUnit(Unit* unit) ((inCannon || !enemy->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE))) && /*!enemy->HasStealthAura() && !enemy->HasInvisibilityAura()*/ enemy->CanSeeOrDetect(bot) && !(enemy->HasSpiritOfRedemptionAura())) + { + // If with master, only attack if master is PvP flagged + Player* master = botAI->GetMaster(); + if (master && !master->IsPvP() && !master->IsFFAPvP()) + return false; + return true; + } return false; } diff --git a/src/Ai/Base/Value/PossibleTargetsValue.cpp b/src/Ai/Base/Value/PossibleTargetsValue.cpp index 654abd44c43..7db1dd39bae 100644 --- a/src/Ai/Base/Value/PossibleTargetsValue.cpp +++ b/src/Ai/Base/Value/PossibleTargetsValue.cpp @@ -16,6 +16,20 @@ #include "SpellAuraEffects.h" #include "SpellMgr.h" #include "Unit.h" +#include "AreaDefines.h" + +// Level difference thresholds for attack probability +constexpr int32 EXTREME_LEVEL_DIFF = 5; // Don't attack if enemy is this much higher +constexpr int32 HIGH_LEVEL_DIFF = 4; // 25% chance at +/- this difference +constexpr int32 MID_LEVEL_DIFF = 3; // 50% chance at +/- this difference +constexpr int32 LOW_LEVEL_DIFF = 2; // 75% chance at +/- this difference + +// Time window for deterministic attack decisions +constexpr uint32 ATTACK_DECISION_TIME_WINDOW = 2 * MINUTE; + +// 64 bit FNV-1a hash constants +constexpr uint64_t FNV_OFFSET_BASIS = 14695981039346656037ULL; +constexpr uint64_t FNV_PRIME = 1099511628211ULL; void PossibleTargetsValue::FindUnits(std::list& targets) { @@ -24,7 +38,103 @@ void PossibleTargetsValue::FindUnits(std::list& targets) Cell::VisitObjects(bot, searcher, range); } -bool PossibleTargetsValue::AcceptUnit(Unit* unit) { return AttackersValue::IsPossibleTarget(unit, bot, range); } +bool PossibleTargetsValue::AcceptUnit(Unit* unit) +{ + if (!AttackersValue::IsPossibleTarget(unit, bot, range)) + return false; + + // Level-based PvP restrictions + if (unit->IsPlayer()) + { + // Self-defense - always allow fighting back + if (bot->IsInCombat() && bot->GetVictim() == unit) + return true; // Already fighting + + Unit* botAttacker = bot->getAttackerForHelper(); + if (botAttacker) + { + if (botAttacker == unit) + return true; // Enemy attacking + + if (botAttacker->IsPet()) + { + Unit* petOwner = botAttacker->GetOwner(); + if (petOwner && petOwner == unit) + return true; // Enemy's pet attacking + } + } + + // Skip restrictions in BG/Arena + if (bot->InBattleground() || bot->InArena()) + return true; + + // Skip restrictions if in duel with this player + if (bot->duel && bot->duel->Opponent == unit) + return true; + + // Capital cities - no restrictions + uint32 zoneId = bot->GetZoneId(); + bool inCapitalCity = (zoneId == AREA_STORMWIND_CITY || + zoneId == AREA_IRONFORGE || + zoneId == AREA_DARNASSUS || + zoneId == AREA_THE_EXODAR || + zoneId == AREA_ORGRIMMAR || + zoneId == AREA_THUNDER_BLUFF || + zoneId == AREA_UNDERCITY || + zoneId == AREA_SILVERMOON_CITY); + + if (inCapitalCity) + return true; + + // Level difference check + int32 levelDifference = unit->GetLevel() - bot->GetLevel(); + int32 absLevelDifference = std::abs(levelDifference); + + // Extreme difference - do not attack + if (levelDifference >= EXTREME_LEVEL_DIFF) + return false; + + // Calculate attack chance based on level difference + uint32 attackChance = 100; // Default 100%: Bot and target's levels are very close + + // There's a chance a bot might gank on an extremly low target + if ((absLevelDifference < EXTREME_LEVEL_DIFF && absLevelDifference >= HIGH_LEVEL_DIFF) || + levelDifference <= -EXTREME_LEVEL_DIFF) + attackChance = 25; + + else if (absLevelDifference < HIGH_LEVEL_DIFF && absLevelDifference >= MID_LEVEL_DIFF) + attackChance = 50; + + else if (absLevelDifference < MID_LEVEL_DIFF && absLevelDifference >= LOW_LEVEL_DIFF) + attackChance = 75; + + // If probability check needed, use deterministic hash-based decision + if (attackChance < 100) + { + // Decisions remain stable for ATTACK_DECISION_TIME_WINDOW. + time_t timeWindow = time(nullptr) / ATTACK_DECISION_TIME_WINDOW; + + // FNV-1a hash used to deterministically convert botGUID, targetGUID, and timeWindow + // into a consistent percentage chance without needing to cache previous decisions. + // See: http://www.isthe.com/chongo/tech/comp/fnv/ + uint64_t hash = FNV_OFFSET_BASIS; + + // Diffuse bot GUID, target GUID, and time window into the hash + hash ^= bot->GetGUID().GetRawValue(); + hash *= FNV_PRIME; + hash ^= unit->GetGUID().GetRawValue(); + hash *= FNV_PRIME; + hash ^= static_cast(timeWindow); + hash *= FNV_PRIME; + + // Convert hash to 0-99 range and compare against attack chance percentage. + // Ex: attackChance=75: hash 0-74 = attack (75%), hash 75-99 = don't attack (25%) + return (hash % 100) < attackChance; + } + } + + return true; +} void PossibleTriggersValue::FindUnits(std::list& targets) { @@ -36,9 +146,8 @@ void PossibleTriggersValue::FindUnits(std::list& targets) bool PossibleTriggersValue::AcceptUnit(Unit* unit) { if (!unit->HasUnitFlag(UNIT_FLAG_NOT_SELECTABLE)) - { return false; - } + Unit::AuraEffectList const& aurasPeriodicTriggerSpell = unit->GetAuraEffectsByType(SPELL_AURA_PERIODIC_TRIGGER_SPELL); Unit::AuraEffectList const& aurasPeriodicTriggerWithValueSpell = @@ -58,9 +167,7 @@ bool PossibleTriggersValue::AcceptUnit(Unit* unit) for (int j = 0; j < MAX_SPELL_EFFECTS; j++) { if (triggerSpellInfo->Effects[j].Effect == SPELL_EFFECT_SCHOOL_DAMAGE) - { return true; - } } } } From 80aeeda0e84b708c8bdb433e1965a3704187a508 Mon Sep 17 00:00:00 2001 From: bashermens <31279994+hermensbas@users.noreply.github.com> Date: Sat, 14 Feb 2026 20:31:45 +0100 Subject: [PATCH 07/25] Flying, waterwalking, swimming movement optimizations and transition fixes. (#2134) # Pull Request **Fixes and optimizations for flying, water walking, swimming**: * optimized triggers * ensuring movement flag updates only happen between actual transitions states * fly bug fix; fly with bots following with stay command midair, fly down and dismount yourself, follow command and now the bots fall instead of lingering around in the air) * updated z-axes correction for water walking and bots (for real players this is handled client-side) * added lift off movement for more stabile transition from ground(level) to flying **Tested**: * Test all transitions; water walk, swimming, swimming, walking, mounting while water walking etc. * Flying with bots and fly master routes * Movement flag updates only occur during transitions **Known issues**: transition between water walking, swimming and back again, in most cases the bots will stay under the waterline instead of jumping on the z axes on water level. (will fix that another time) --- ## Design Philosophy We prioritize **stability, performance, and predictability** over behavioral realism. Complex player-mimicking logic is intentionally limited due to its negative impact on scalability, maintainability, and long-term robustness. Excessive processing overhead can lead to server hiccups, increased CPU usage, and degraded performance for all participants. Because every action and decision tree is executed **per bot and per trigger**, even small increases in logic complexity can scale poorly and negatively affect both players and world (random) bots. Bots are not expected to behave perfectly, and perfect simulation of human decision-making is not a project goal. Increased behavioral realism often introduces disproportionate cost, reduced predictability, and significantly higher maintenance overhead. Every additional branch of logic increases long-term responsibility. All decision paths must be tested, validated, and maintained continuously as the system evolves. If advanced or AI-intensive behavior is introduced, the **default configuration must remain the lightweight decision model**. More complex behavior should only be available as an **explicit opt-in option**, clearly documented as having a measurable performance cost. Principles: - **Stability before intelligence** A stable system is always preferred over a smarter one. - **Performance is a shared resource** Any increase in bot cost affects all players and all bots. - **Simple logic scales better than smart logic** Predictable behavior under load is more valuable than perfect decisions. - **Complexity must justify itself** If a feature cannot clearly explain its cost, it should not exist. - **Defaults must be cheap** Expensive behavior must always be optional and clearly communicated. - **Bots should look reasonable, not perfect** The goal is believable behavior, not human simulation. Before submitting, confirm that this change aligns with those principles. --- ## Feature Evaluation Please answer the following: - Describe the **minimum logic** required to achieve the intended behavior? - Describe the **cheapest implementation** that produces an acceptable result? - Describe the **runtime cost** when this logic executes across many bots? --- ## How to Test the Changes - Step-by-step instructions to test the change - Any required setup (e.g. multiple players, bots, specific configuration) - Expected behavior and how to verify it Apply water walking effect on your bots, shaman or dk, and test all possible transitions and follow actions of the bots. water walking, swim, walk on land, swimming and walk without water walking effect/aura, fly mount from water, from ground, etc. ## Complexity & Impact Does this change add new decision branches? - - [x] No - - [ ] Yes (**explain below**) Does this change increase per-bot or per-tick processing? - - [x] No - - [ ] Yes (**describe and justify impact**) Could this logic scale poorly under load? - - [x] No - - [ ] Yes (**explain why**) --- ## Defaults & Configuration Does this change modify default bot behavior? - - [x] No - - [ ] Yes (**explain why**) If this introduces more advanced or AI-heavy logic: - - [x] Lightweight mode remains the default - - [x] More complex behavior is optional and thereby configurable --- ## AI Assistance Was AI assistance (e.g. ChatGPT or similar tools) used while working on this change? - - [x] No - - [ ] Yes (**explain below**) If yes, please specify: - AI tool or model used (e.g. ChatGPT, GPT-4, Claude, etc.) - Purpose of usage (e.g. brainstorming, refactoring, documentation, code generation) - Which parts of the change were influenced or generated - Whether the result was manually reviewed and adapted AI assistance is allowed, but all submitted code must be fully understood, reviewed, and owned by the contributor. Any AI-influenced changes must be verified against existing CORE and PB logic. We expect contributors to be honest about what they do and do not understand. --- ## Final Checklist - - [x] Stability is not compromised - - [x] Performance impact is understood, tested, and acceptable - - [x] Added logic complexity is justified and explained - - [x] Documentation updated if needed --- ## Notes for Reviewers Anything that significantly improves realism at the cost of stability or performance should be carefully discussed before merging. --- src/Ai/Base/Actions/MovementActions.cpp | 78 +++++++++++++------------ 1 file changed, 40 insertions(+), 38 deletions(-) diff --git a/src/Ai/Base/Actions/MovementActions.cpp b/src/Ai/Base/Actions/MovementActions.cpp index d4090c0ef2b..4f04d179952 100644 --- a/src/Ai/Base/Actions/MovementActions.cpp +++ b/src/Ai/Base/Actions/MovementActions.cpp @@ -953,68 +953,70 @@ bool MovementAction::Follow(Unit* target, float distance) { return Follow(target void MovementAction::UpdateMovementState() { - const bool isCurrentlyRestricted = // see if the bot is currently slowed, rooted, or otherwise unable to move - bot->HasUnitState(UNIT_STATE_LOST_CONTROL) || - bot->IsRooted() || - bot->isFrozen() || - bot->IsPolymorphed(); + const bool isCurrentlyRestricted = // see if the bot is currently slowed, rooted, or otherwise unable to move + bot->HasUnitState(UNIT_STATE_LOST_CONTROL) || bot->IsRooted() || bot->isFrozen() || bot->IsPolymorphed(); // no update movement flags while movement is current restricted. if (!isCurrentlyRestricted && bot->IsAlive()) { // state flags - const auto master = botAI ? botAI->GetMaster() : nullptr; // real player or not - const bool masterIsFlying = master ? master->HasUnitMovementFlag(MOVEMENTFLAG_FLYING) : true; - const bool masterIsSwimming = master ? master->HasUnitMovementFlag(MOVEMENTFLAG_SWIMMING) : true; - const auto liquidState = bot->GetLiquidData().Status; // default LIQUID_MAP_NO_WATER + const auto master = botAI ? botAI->GetMaster() : nullptr; + const auto liquidState = bot->GetLiquidData().Status; const float gZ = bot->GetMapWaterOrGroundLevel(bot->GetPositionX(), bot->GetPositionY(), bot->GetPositionZ()); - const bool wantsToFly = bot->HasIncreaseMountedFlightSpeedAura() || bot->HasFlyAura(); + const bool onGroundZ = bot->GetPositionZ() < gZ + 1.f; + const bool canSwim = liquidState == LIQUID_MAP_IN_WATER || liquidState == LIQUID_MAP_UNDER_WATER; + const bool canFly = bot->HasIncreaseMountedFlightSpeedAura() || bot->HasFlyAura(); + const bool canWaterWalk = bot->HasWaterWalkAura(); + const bool isMasterFlying = master ? master->HasUnitMovementFlag(MOVEMENTFLAG_FLYING) : true; + const bool isMasterSwimming = master ? master->HasUnitMovementFlag(MOVEMENTFLAG_SWIMMING) : true; const bool isFlying = bot->HasUnitMovementFlag(MOVEMENTFLAG_FLYING); - const bool isWaterArea = liquidState != LIQUID_MAP_NO_WATER; - const bool isUnderWater = liquidState == LIQUID_MAP_UNDER_WATER; - const bool isInWater = liquidState == LIQUID_MAP_IN_WATER; - const bool isWaterWalking = bot->HasUnitMovementFlag(MOVEMENTFLAG_WATERWALKING); const bool isSwimming = bot->HasUnitMovementFlag(MOVEMENTFLAG_SWIMMING); - const bool wantsToWaterWalk = bot->HasWaterWalkAura(); - const bool wantsToSwim = isInWater || isUnderWater; - const bool onGroundZ = (bot->GetPositionZ() < gZ + 1.f) && !isWaterArea; + const bool isWaterWalking = bot->HasUnitMovementFlag(MOVEMENTFLAG_WATERWALKING); bool movementFlagsUpdated = false; - // handle water state - if (isWaterArea && !isFlying) + // handle water (fragile logic do not alter without testing every detail, animation and transition) + if (liquidState != LIQUID_MAP_NO_WATER && !isFlying) { - // water walking - if (wantsToWaterWalk && !isWaterWalking && !masterIsSwimming) + if (canWaterWalk && !isMasterSwimming && !isWaterWalking) { - bot->RemoveUnitMovementFlag(MOVEMENTFLAG_SWIMMING); + bot->SetSwim(false); bot->AddUnitMovementFlag(MOVEMENTFLAG_WATERWALKING); movementFlagsUpdated = true; } - // swimming - else if (wantsToSwim && !isSwimming && masterIsSwimming) + else if ((!canWaterWalk || isMasterSwimming) && isWaterWalking) { bot->RemoveUnitMovementFlag(MOVEMENTFLAG_WATERWALKING); - bot->AddUnitMovementFlag(MOVEMENTFLAG_SWIMMING); + if (canSwim) + bot->SetSwim(true); + movementFlagsUpdated = true; + } + else if (!canSwim && isSwimming) + { + bot->SetSwim(false); movementFlagsUpdated = true; } } - else if (isSwimming || isWaterWalking) + + // reset when not around water while swimming or water walking + if (liquidState == LIQUID_MAP_NO_WATER && (isSwimming || isWaterWalking)) { - // reset water flags - bot->RemoveUnitMovementFlag(MOVEMENTFLAG_SWIMMING); + bot->SetSwim(false); bot->RemoveUnitMovementFlag(MOVEMENTFLAG_WATERWALKING); movementFlagsUpdated = true; } - // handle flying state - if (wantsToFly && !isFlying && masterIsFlying) + // handle flying + if ((canFly && !isFlying) && isMasterFlying) { bot->AddUnitMovementFlag(MOVEMENTFLAG_CAN_FLY); bot->AddUnitMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY); bot->AddUnitMovementFlag(MOVEMENTFLAG_FLYING); - movementFlagsUpdated = true; + + // required for transition and state monitoring. + if (MotionMaster* mm = bot->GetMotionMaster()) + mm->MoveTakeoff(0, {bot->GetPositionX(), bot->GetPositionY(), bot->GetPositionZ() + 1.F}, 0.F, true); } - else if ((!wantsToFly || onGroundZ) && isFlying) + else if ((!canFly && !isWaterWalking && isFlying) || (!isMasterFlying && isFlying && onGroundZ)) { bot->RemoveUnitMovementFlag(MOVEMENTFLAG_CAN_FLY); bot->RemoveUnitMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY); @@ -1022,15 +1024,16 @@ void MovementAction::UpdateMovementState() movementFlagsUpdated = true; } - // detect if movement restrictions have been lifted, CC just ended. + // detect if movement/CC restrictions have been ended, refresh movement state for animations. if (wasMovementRestricted) - movementFlagsUpdated = true; // refresh movement state to ensure animations play correctly + movementFlagsUpdated = true; + // movement flags should only be updated between state changes, if not it will break certain effects. if (movementFlagsUpdated) bot->SendMovementFlagUpdate(); } - // Save current state for the next check + // Save current state for the next check wasMovementRestricted = isCurrentlyRestricted; // Temporary speed increase in group @@ -1813,12 +1816,11 @@ void MovementAction::DoMovePoint(Unit* unit, float x, float y, float z, bool gen if (!mm) return; - // enable water walking - if (unit->HasUnitMovementFlag(MOVEMENTFLAG_WATERWALKING)) + // bot water collision correction + if (unit->HasUnitMovementFlag(MOVEMENTFLAG_WATERWALKING) && unit->HasWaterWalkAura()) { float gZ = unit->GetMapWaterOrGroundLevel(unit->GetPositionX(), unit->GetPositionY(), unit->GetPositionZ()); unit->UpdatePosition(unit->GetPositionX(), unit->GetPositionY(), gZ, false); - // z = gZ; no overwrite Z axe otherwise you cant steer the bots into swimming when water walking. } mm->Clear(); From 441f9f75525d1fe5b8f9a3110821a4a89cad87a2 Mon Sep 17 00:00:00 2001 From: Keleborn <22352763+Celandriel@users.noreply.github.com> Date: Sat, 14 Feb 2026 11:55:10 -0800 Subject: [PATCH 08/25] Warnings PR 1: Event warnings and headers (#2106) # Pull Request This is the first in a series of PRs intended to eliminate warnings in the module. The design intent is to eliminate the calling event when not needed in the body of the function. Based off of SmashingQuasars work. --- ## How to Test the Changes - Step-by-step instructions to test the change - Any required setup (e.g. multiple players, bots, specific configuration) - Expected behavior and how to verify it ## Complexity & Impact - Does this change add new decision branches? - [x] No - [ ] Yes (**explain below**) - Does this change increase per-bot or per-tick processing? - [x] No - [ ] Yes (**describe and justify impact**) - Could this logic scale poorly under load? - [x] No - [ ] Yes (**explain why**) --- ## Defaults & Configuration - Does this change modify default bot behavior? - [x] No - [ ] Yes (**explain why**) If this introduces more advanced or AI-heavy logic: - [ ] Lightweight mode remains the default - [ ] More complex behavior is optional and thereby configurable --- ## AI Assistance - Was AI assistance (e.g. ChatGPT or similar tools) used while working on this change? - [x] No - [ ] Yes (**explain below**) --- ## Final Checklist - [x] Stability is not compromised - [x] Performance impact is understood, tested, and acceptable - [x] Added logic complexity is justified and explained - [x] Documentation updated if needed --- ## Notes for Reviewers Anything that significantly improves realism at the cost of stability or performance should be carefully discussed before merging. --------- Co-authored-by: bashermens <31279994+hermensbas@users.noreply.github.com> --- .../AcceptBattlegroundInvitationAction.cpp | 6 +- src/Ai/Base/Actions/AddLootAction.cpp | 2 +- src/Ai/Base/Actions/AreaTriggerAction.cpp | 2 +- .../AutoMaintenanceOnLevelupAction.cpp | 7 +- .../Base/Actions/BattleGroundJoinAction.cpp | 9 +- src/Ai/Base/Actions/BattleGroundTactics.cpp | 4 +- src/Ai/Base/Actions/BossAuraActions.cpp | 8 +- src/Ai/Base/Actions/CancelChannelAction.cpp | 4 +- src/Ai/Base/Actions/CastCustomSpellAction.cpp | 2 +- src/Ai/Base/Actions/ChangeTalentsAction.cpp | 6 +- src/Ai/Base/Actions/ChatShortcutActions.cpp | 18 +-- src/Ai/Base/Actions/CheckMailAction.cpp | 7 +- src/Ai/Base/Actions/CheckValuesAction.cpp | 7 +- src/Ai/Base/Actions/ChooseRpgTargetAction.cpp | 4 +- src/Ai/Base/Actions/ChooseTargetActions.cpp | 4 +- .../Base/Actions/ChooseTravelTargetAction.cpp | 2 +- src/Ai/Base/Actions/DebugAction.cpp | 6 +- src/Ai/Base/Actions/DelayAction.cpp | 12 +- src/Ai/Base/Actions/DestroyItemAction.cpp | 2 +- src/Ai/Base/Actions/EmoteAction.cpp | 3 +- src/Ai/Base/Actions/EquipAction.cpp | 2 +- src/Ai/Base/Actions/FishingAction.cpp | 10 +- src/Ai/Base/Actions/FollowActions.cpp | 7 +- src/Ai/Base/Actions/GenericActions.cpp | 6 +- src/Ai/Base/Actions/GenericSpellActions.cpp | 12 +- src/Ai/Base/Actions/GiveItemAction.cpp | 2 +- src/Ai/Base/Actions/GreetAction.cpp | 2 +- src/Ai/Base/Actions/GuildBankAction.cpp | 3 +- src/Ai/Base/Actions/GuildCreateActions.cpp | 10 +- .../Base/Actions/GuildManagementActions.cpp | 3 +- src/Ai/Base/Actions/HelpAction.cpp | 4 +- src/Ai/Base/Actions/HireAction.cpp | 11 +- src/Ai/Base/Actions/ImbueAction.cpp | 8 +- src/Ai/Base/Actions/InventoryAction.cpp | 2 - src/Ai/Base/Actions/InviteToGroupAction.cpp | 21 ++- src/Ai/Base/Actions/LeaveGroupAction.cpp | 2 +- src/Ai/Base/Actions/LfgActions.cpp | 20 +-- src/Ai/Base/Actions/LootRollAction.cpp | 2 +- src/Ai/Base/Actions/MoveToRpgTargetAction.cpp | 8 +- .../Base/Actions/MoveToTravelTargetAction.cpp | 3 +- src/Ai/Base/Actions/MovementActions.cpp | 64 +++----- src/Ai/Base/Actions/OpenItemAction.cpp | 2 +- .../Actions/PassLeadershipToMasterAction.cpp | 3 +- src/Ai/Base/Actions/PetsAction.h | 2 - src/Ai/Base/Actions/PositionAction.cpp | 4 +- src/Ai/Base/Actions/QueryQuestAction.cpp | 2 +- src/Ai/Base/Actions/QuestAction.cpp | 6 +- src/Ai/Base/Actions/RandomBotUpdateAction.cpp | 2 +- src/Ai/Base/Actions/ReachTargetActions.cpp | 2 +- src/Ai/Base/Actions/ReleaseSpiritAction.cpp | 6 +- src/Ai/Base/Actions/RememberTaxiAction.cpp | 2 +- src/Ai/Base/Actions/RepairAllAction.cpp | 2 +- src/Ai/Base/Actions/ResetInstancesAction.cpp | 5 +- .../Actions/RevealGatheringItemAction.cpp | 4 +- .../Base/Actions/ReviveFromCorpseAction.cpp | 5 +- src/Ai/Base/Actions/RpgAction.cpp | 3 +- src/Ai/Base/Actions/RpgSubActions.cpp | 34 ++-- src/Ai/Base/Actions/RtiAction.cpp | 2 +- src/Ai/Base/Actions/SayAction.cpp | 5 +- src/Ai/Base/Actions/SecurityCheckAction.cpp | 2 +- src/Ai/Base/Actions/SeeSpellAction.cpp | 1 - src/Ai/Base/Actions/SetCraftAction.cpp | 9 +- src/Ai/Base/Actions/SetHomeAction.cpp | 2 +- src/Ai/Base/Actions/StatsAction.cpp | 4 +- src/Ai/Base/Actions/StayActions.cpp | 6 +- src/Ai/Base/Actions/SuggestWhatToDoAction.cpp | 14 +- src/Ai/Base/Actions/TameAction.cpp | 2 - src/Ai/Base/Actions/TeleportAction.cpp | 9 +- src/Ai/Base/Actions/TellLosAction.cpp | 6 +- src/Ai/Base/Actions/TellMasterAction.cpp | 4 +- src/Ai/Base/Actions/TellReputationAction.cpp | 4 +- src/Ai/Base/Actions/TellTargetAction.cpp | 7 +- src/Ai/Base/Actions/TradeAction.cpp | 4 +- src/Ai/Base/Actions/TradeStatusAction.cpp | 11 +- src/Ai/Base/Actions/TrainerAction.cpp | 6 +- src/Ai/Base/Actions/TravelAction.cpp | 10 +- src/Ai/Base/Actions/UnlockItemAction.cpp | 7 +- .../Base/Actions/UnlockTradedItemAction.cpp | 6 +- src/Ai/Base/Actions/UseItemAction.cpp | 4 +- src/Ai/Base/Actions/UseMeetingStoneAction.cpp | 4 +- src/Ai/Base/Actions/VehicleActions.cpp | 2 +- .../Strategy/ChatCommandHandlerStrategy.cpp | 2 - src/Ai/Base/Strategy/CombatStrategy.cpp | 1 - src/Ai/Base/Strategy/DuelStrategy.cpp | 2 - src/Ai/Base/Strategy/FollowMasterStrategy.cpp | 2 - src/Ai/Base/Strategy/GuardStrategy.cpp | 2 - src/Ai/Base/Strategy/NonCombatStrategy.cpp | 2 - src/Ai/Base/Strategy/RTSCStrategy.cpp | 2 - src/Ai/Base/Strategy/RacialsStrategy.cpp | 2 - src/Ai/Base/Strategy/UsePotionsStrategy.cpp | 2 - src/Ai/Base/Trigger/GenericTriggers.cpp | 2 - src/Ai/Base/Trigger/RangeTriggers.cpp | 1 - src/Ai/Base/Value/Arrow.cpp | 3 +- src/Ai/Base/Value/CcTargetValue.cpp | 4 +- src/Ai/Base/Value/CurrentCcTargetValue.cpp | 3 +- src/Ai/Base/Value/DpsTargetValue.cpp | 9 +- src/Ai/Base/Value/ItemCountValue.cpp | 4 +- src/Ai/Base/Value/LastMovementValue.cpp | 1 - src/Ai/Base/Value/LeastHpTargetValue.cpp | 2 +- src/Ai/Base/Value/LogLevelValue.h | 1 + src/Ai/Base/Value/NearestCorpsesValue.cpp | 1 - src/Ai/Base/Value/PartyMemberToDispel.cpp | 3 +- src/Ai/Base/Value/PartyMemberValue.cpp | 5 +- .../Base/Value/PartyMemberWithoutItemValue.h | 4 +- src/Ai/Base/Value/PossibleRpgTargetsValue.cpp | 19 ++- src/Ai/Base/Value/SnareTargetValue.cpp | 3 +- src/Ai/Base/Value/SpellIdValue.cpp | 1 - src/Ai/Base/Value/StatsValues.cpp | 8 +- src/Ai/Base/Value/TankTargetValue.cpp | 5 +- .../Strategy/GenericDKNonCombatStrategy.cpp | 2 - src/Ai/Class/Druid/Action/DruidActions.cpp | 4 +- .../Druid/Action/DruidShapeshiftActions.cpp | 4 +- src/Ai/Class/Hunter/Action/HunterActions.cpp | 4 +- .../Hunter/Strategy/GenericHunterStrategy.cpp | 3 - .../Class/Paladin/Action/PaladinActions.cpp | 17 +- .../Strategy/GenericPaladinStrategy.cpp | 1 - src/Ai/Class/Priest/Action/PriestActions.cpp | 2 +- src/Ai/Class/Rogue/Action/RogueActions.cpp | 10 +- src/Ai/Class/Shaman/Action/ShamanActions.cpp | 5 +- .../Shaman/Strategy/TotemsShamanStrategy.h | 1 - src/Ai/Class/Shaman/Trigger/ShamanTriggers.h | 2 - .../Class/Warlock/Action/WarlockActions.cpp | 14 +- .../Strategy/GenericWarlockStrategy.cpp | 2 - .../Warlock/Strategy/TankWarlockStrategy.cpp | 1 - .../Class/Warrior/Action/WarriorActions.cpp | 4 +- .../Warrior/Strategy/ArmsWarriorStrategy.cpp | 2 - .../Warrior/Strategy/FuryWarriorStrategy.cpp | 2 - .../Warrior/Strategy/TankWarriorStrategy.cpp | 2 - .../AzjolNerub/Action/AzjolNerubActions.cpp | 7 +- .../Action/CullingOfStratholmeActions.cpp | 5 +- .../Action/DrakTharonKeepActions.cpp | 28 +--- .../Action/ForgeOfSoulsActions.cpp | 10 +- .../Dungeon/Gundrak/Action/GundrakActions.cpp | 7 +- .../Action/HallsOfLightningActions.cpp | 19 ++- .../Action/HallsOfStoneActions.cpp | 5 +- src/Ai/Dungeon/Nexus/Action/NexusActions.cpp | 38 ++--- .../Dungeon/Oculus/Action/OculusActions.cpp | 18 +-- src/Ai/Dungeon/Oculus/Action/OculusActions.h | 2 - .../Oculus/Multiplier/OculusMultipliers.cpp | 23 +-- .../OldKingdom/Action/OldKingdomActions.cpp | 7 +- .../PitOfSaron/Action/PitOfSaronActions.cpp | 6 +- .../Action/TrialOfTheChampionActions.cpp | 17 +- .../Strategy/TrialOfTheChampionStrategy.cpp | 1 - .../UtgardeKeep/Action/UtgardeKeepActions.cpp | 11 +- .../Action/UtgardePinnacleActions.cpp | 5 +- .../VioletHold/Action/VioletHoldActions.cpp | 9 +- src/Ai/Raid/Aq20/Action/RaidAq20Actions.cpp | 3 +- src/Ai/Raid/Aq20/Trigger/RaidAq20Triggers.cpp | 1 - .../BlackwingLair/Action/RaidBwlActions.cpp | 9 +- .../EyeOfEternity/Action/RaidEoEActions.cpp | 10 +- .../Action/RaidGruulsLairActions.cpp | 26 +-- .../Raid/Icecrown/Action/RaidIccActions.cpp | 108 ++++++------- .../Multiplier/RaidIccMultipliers.cpp | 1 - .../Raid/Icecrown/Trigger/RaidIccTriggers.cpp | 5 - .../Karazhan/Action/RaidKarazhanActions.cpp | 75 +++++---- .../Karazhan/Util/RaidKarazhanHelpers.cpp | 4 - .../Action/RaidMagtheridonActions.cpp | 20 +-- .../Raid/MoltenCore/Action/RaidMcActions.cpp | 11 +- .../ObsidianSanctum/Action/RaidOsActions.cpp | 12 +- .../Raid/Onyxia/Action/RaidOnyxiaActions.cpp | 11 +- .../Raid/Ulduar/Action/RaidUlduarActions.cpp | 149 +++++++----------- .../Ulduar/Trigger/RaidUlduarTriggers.cpp | 146 ++--------------- .../VaultOfArchavon/Action/RaidVoAActions.cpp | 8 +- src/Ai/World/Rpg/Action/NewRpgAction.cpp | 21 +-- src/Ai/World/Rpg/Strategy/NewRpgStrategy.cpp | 5 +- src/Bot/Cmd/PlayerbotCommandServer.cpp | 5 +- src/Bot/Engine/Action/Action.h | 1 - src/Bot/Engine/Strategy/CustomStrategy.cpp | 2 - src/Bot/Engine/Trigger/Trigger.cpp | 3 +- src/Bot/Engine/Trigger/Trigger.h | 1 - src/Bot/Factory/AiFactory.h | 1 - src/Bot/Factory/PlayerbotFactory.cpp | 32 ++-- src/Bot/Factory/RandomPlayerbotFactory.cpp | 7 +- src/Bot/PlayerbotAI.cpp | 2 - src/Bot/PlayerbotAI.h | 2 - src/Bot/PlayerbotMgr.cpp | 22 ++- src/Bot/RandomPlayerbotMgr.cpp | 23 ++- src/Db/PlayerbotRepository.cpp | 5 +- src/Mgr/Item/RandomItemMgr.cpp | 5 +- src/Mgr/Item/StatsCollector.cpp | 5 - src/Mgr/Talent/Talentspec.cpp | 4 +- src/Mgr/Talent/Talentspec.h | 4 +- src/Mgr/Travel/TravelMgr.cpp | 3 +- src/Script/Playerbots.cpp | 36 ----- .../WorldThr/PlayerbotWorldThreadProcessor.h | 1 - 185 files changed, 653 insertions(+), 1064 deletions(-) diff --git a/src/Ai/Base/Actions/AcceptBattlegroundInvitationAction.cpp b/src/Ai/Base/Actions/AcceptBattlegroundInvitationAction.cpp index 96d61d4ba3a..91be09df921 100644 --- a/src/Ai/Base/Actions/AcceptBattlegroundInvitationAction.cpp +++ b/src/Ai/Base/Actions/AcceptBattlegroundInvitationAction.cpp @@ -6,9 +6,9 @@ #include "AcceptBattlegroundInvitationAction.h" #include "Event.h" -#include "Playerbots.h" +#include "PlayerbotAI.h" -bool AcceptBgInvitationAction::Execute(Event event) +bool AcceptBgInvitationAction::Execute(Event /*event*/) { uint8 type = 0; // arenatype if arena uint8 unk2 = 0; // unk, can be 0x0 (may be if was invited?) and 0x1 @@ -18,9 +18,9 @@ bool AcceptBgInvitationAction::Execute(Event event) WorldPacket packet(CMSG_BATTLEFIELD_PORT, 20); packet << type << unk2 << (uint32)bgTypeId_ << unk << action; - // packet << bgTypeId_ << action; bot->GetSession()->HandleBattleFieldPortOpcode(packet); botAI->ResetStrategies(); + return true; } diff --git a/src/Ai/Base/Actions/AddLootAction.cpp b/src/Ai/Base/Actions/AddLootAction.cpp index 9e16ee2d3ad..40cda0e6e13 100644 --- a/src/Ai/Base/Actions/AddLootAction.cpp +++ b/src/Ai/Base/Actions/AddLootAction.cpp @@ -22,7 +22,7 @@ bool AddLootAction::Execute(Event event) return AI_VALUE(LootObjectStack*, "available loot")->Add(guid); } -bool AddAllLootAction::Execute(Event event) +bool AddAllLootAction::Execute(Event /*event*/) { bool added = false; diff --git a/src/Ai/Base/Actions/AreaTriggerAction.cpp b/src/Ai/Base/Actions/AreaTriggerAction.cpp index c6100854008..a3339ea5c89 100644 --- a/src/Ai/Base/Actions/AreaTriggerAction.cpp +++ b/src/Ai/Base/Actions/AreaTriggerAction.cpp @@ -58,7 +58,7 @@ bool ReachAreaTriggerAction::Execute(Event event) return true; } -bool AreaTriggerAction::Execute(Event event) +bool AreaTriggerAction::Execute(Event /*event*/) { LastMovement& movement = context->GetValue("last area trigger")->Get(); diff --git a/src/Ai/Base/Actions/AutoMaintenanceOnLevelupAction.cpp b/src/Ai/Base/Actions/AutoMaintenanceOnLevelupAction.cpp index de8b5c6fdc1..72433c15fdc 100644 --- a/src/Ai/Base/Actions/AutoMaintenanceOnLevelupAction.cpp +++ b/src/Ai/Base/Actions/AutoMaintenanceOnLevelupAction.cpp @@ -1,19 +1,20 @@ #include "AutoMaintenanceOnLevelupAction.h" -#include "GuildMgr.h" +#include "SpellMgr.h" + #include "PlayerbotAIConfig.h" #include "PlayerbotFactory.h" -#include "Playerbots.h" #include "RandomPlayerbotMgr.h" #include "SharedDefines.h" #include "BroadcastHelper.h" -bool AutoMaintenanceOnLevelupAction::Execute(Event event) +bool AutoMaintenanceOnLevelupAction::Execute(Event /*event*/) { AutoPickTalents(); AutoLearnSpell(); AutoUpgradeEquip(); AutoTeleportForLevel(); + return true; } diff --git a/src/Ai/Base/Actions/BattleGroundJoinAction.cpp b/src/Ai/Base/Actions/BattleGroundJoinAction.cpp index 418b0f1fa72..24b23cb9d43 100644 --- a/src/Ai/Base/Actions/BattleGroundJoinAction.cpp +++ b/src/Ai/Base/Actions/BattleGroundJoinAction.cpp @@ -13,9 +13,8 @@ #include "PlayerbotAI.h" #include "Playerbots.h" #include "PositionValue.h" -#include "UpdateTime.h" -bool BGJoinAction::Execute(Event event) +bool BGJoinAction::Execute(Event /*event*/) { uint32 queueType = AI_VALUE(uint32, "bg type"); if (!queueType) // force join to fill bg @@ -653,7 +652,7 @@ bool FreeBGJoinAction::shouldJoinBg(BattlegroundQueueTypeId queueTypeId, Battleg return false; } -bool BGLeaveAction::Execute(Event event) +bool BGLeaveAction::Execute(Event /*event*/) { if (!(bot->InBattlegroundQueue() || bot->InBattleground())) return false; @@ -1064,7 +1063,7 @@ bool BGStatusAction::Execute(Event event) return true; } -bool BGStatusCheckAction::Execute(Event event) +bool BGStatusCheckAction::Execute(Event /*event*/) { if (bot->IsBeingTeleported()) return false; @@ -1080,7 +1079,7 @@ bool BGStatusCheckAction::Execute(Event event) bool BGStatusCheckAction::isUseful() { return bot->InBattlegroundQueue(); } -bool BGStrategyCheckAction::Execute(Event event) +bool BGStrategyCheckAction::Execute(Event /*event*/) { bool inside_bg = bot->InBattleground() && bot->GetBattleground(); ; diff --git a/src/Ai/Base/Actions/BattleGroundTactics.cpp b/src/Ai/Base/Actions/BattleGroundTactics.cpp index 2b198022e03..78c156280f6 100644 --- a/src/Ai/Base/Actions/BattleGroundTactics.cpp +++ b/src/Ai/Base/Actions/BattleGroundTactics.cpp @@ -1557,7 +1557,7 @@ bool BGTactics::eyJumpDown() // // actual bg tactics below // -bool BGTactics::Execute(Event event) +bool BGTactics::Execute(Event /*event*/) { Battleground* bg = bot->GetBattleground(); if (!bg) @@ -4249,7 +4249,7 @@ bool BGTactics::IsLockedInsideKeep() return false; } -bool ArenaTactics::Execute(Event event) +bool ArenaTactics::Execute(Event /*event*/) { if (!bot->InBattleground()) { diff --git a/src/Ai/Base/Actions/BossAuraActions.cpp b/src/Ai/Base/Actions/BossAuraActions.cpp index d711559ee50..90284db1042 100644 --- a/src/Ai/Base/Actions/BossAuraActions.cpp +++ b/src/Ai/Base/Actions/BossAuraActions.cpp @@ -18,7 +18,7 @@ bool BossFireResistanceAction::isUseful() return bossFireResistanceTrigger.IsActive(); } -bool BossFireResistanceAction::Execute(Event event) +bool BossFireResistanceAction::Execute(Event /*event*/) { PaladinFireResistanceStrategy paladinFireResistanceStrategy(botAI); botAI->ChangeStrategy(ADD_STRATEGY_CHAR + paladinFireResistanceStrategy.getName(), BotState::BOT_STATE_COMBAT); @@ -32,7 +32,7 @@ bool BossFrostResistanceAction::isUseful() return bossFrostResistanceTrigger.IsActive(); } -bool BossFrostResistanceAction::Execute(Event event) +bool BossFrostResistanceAction::Execute(Event /*event*/) { PaladinFrostResistanceStrategy paladinFrostResistanceStrategy(botAI); botAI->ChangeStrategy(ADD_STRATEGY_CHAR + paladinFrostResistanceStrategy.getName(), BotState::BOT_STATE_COMBAT); @@ -46,7 +46,7 @@ bool BossNatureResistanceAction::isUseful() return bossNatureResistanceTrigger.IsActive(); } -bool BossNatureResistanceAction::Execute(Event event) +bool BossNatureResistanceAction::Execute(Event /*event*/) { HunterNatureResistanceStrategy hunterNatureResistanceStrategy(botAI); botAI->ChangeStrategy(ADD_STRATEGY_CHAR + hunterNatureResistanceStrategy.getName(), BotState::BOT_STATE_COMBAT); @@ -60,7 +60,7 @@ bool BossShadowResistanceAction::isUseful() return bossShadowResistanceTrigger.IsActive(); } -bool BossShadowResistanceAction::Execute(Event event) +bool BossShadowResistanceAction::Execute(Event /*event*/) { PaladinShadowResistanceStrategy paladinShadowResistanceStrategy(botAI); botAI->ChangeStrategy(ADD_STRATEGY_CHAR + paladinShadowResistanceStrategy.getName(), BotState::BOT_STATE_COMBAT); diff --git a/src/Ai/Base/Actions/CancelChannelAction.cpp b/src/Ai/Base/Actions/CancelChannelAction.cpp index 9f359f392b7..103aec4d8f6 100644 --- a/src/Ai/Base/Actions/CancelChannelAction.cpp +++ b/src/Ai/Base/Actions/CancelChannelAction.cpp @@ -7,12 +7,14 @@ #include "Player.h" #include "PlayerbotAI.h" -bool CancelChannelAction::Execute(Event event) +bool CancelChannelAction::Execute(Event /*event*/) { if (bot->GetCurrentSpell(CURRENT_CHANNELED_SPELL)) { bot->InterruptSpell(CURRENT_CHANNELED_SPELL); + return true; } + return false; } diff --git a/src/Ai/Base/Actions/CastCustomSpellAction.cpp b/src/Ai/Base/Actions/CastCustomSpellAction.cpp index 2ec7210d29c..15c35ee430f 100644 --- a/src/Ai/Base/Actions/CastCustomSpellAction.cpp +++ b/src/Ai/Base/Actions/CastCustomSpellAction.cpp @@ -334,7 +334,7 @@ bool CastRandomSpellAction::castSpell(uint32 spellId, WorldObject* wo) return botAI->CastSpell(spellId, wo->GetPositionX(), wo->GetPositionY(), wo->GetPositionZ()); } -bool DisEnchantRandomItemAction::Execute(Event event) +bool DisEnchantRandomItemAction::Execute(Event /*event*/) { std::vector items = AI_VALUE2(std::vector, "inventory items", "usage " + std::to_string(ITEM_USAGE_DISENCHANT)); diff --git a/src/Ai/Base/Actions/ChangeTalentsAction.cpp b/src/Ai/Base/Actions/ChangeTalentsAction.cpp index df09dadaca3..f04db2207bf 100644 --- a/src/Ai/Base/Actions/ChangeTalentsAction.cpp +++ b/src/Ai/Base/Actions/ChangeTalentsAction.cpp @@ -10,9 +10,9 @@ #include "Event.h" #include "PlayerbotAIConfig.h" #include "PlayerbotFactory.h" -#include "Playerbots.h" #include "AiObjectContext.h" #include "Log.h" +#include "RandomPlayerbotMgr.h" bool ChangeTalentsAction::Execute(Event event) { @@ -368,11 +368,11 @@ std::string ChangeTalentsAction::SpecApply(std::string param) // return nullptr; // } -bool AutoSetTalentsAction::Execute(Event event) +bool AutoSetTalentsAction::Execute(Event /*event*/) { std::ostringstream out; - if (!sPlayerbotAIConfig.autoPickTalents || !sRandomPlayerbotMgr.IsRandomBot(bot)) + if (!PlayerbotAIConfig::instance().autoPickTalents || !RandomPlayerbotMgr::instance().IsRandomBot(bot)) return false; if (bot->GetFreeTalentPoints() <= 0) diff --git a/src/Ai/Base/Actions/ChatShortcutActions.cpp b/src/Ai/Base/Actions/ChatShortcutActions.cpp index 85b141d4d14..30563e8e686 100644 --- a/src/Ai/Base/Actions/ChatShortcutActions.cpp +++ b/src/Ai/Base/Actions/ChatShortcutActions.cpp @@ -42,7 +42,7 @@ void PositionsResetAction::SetStayPosition(float x, float y, float z) posMap["stay"] = pos; } -bool FollowChatShortcutAction::Execute(Event event) +bool FollowChatShortcutAction::Execute(Event /*event*/) { Player* master = GetMaster(); if (!master) @@ -116,7 +116,7 @@ bool FollowChatShortcutAction::Execute(Event event) return true; } -bool StayChatShortcutAction::Execute(Event event) +bool StayChatShortcutAction::Execute(Event /*event*/) { Player* master = GetMaster(); if (!master) @@ -133,7 +133,7 @@ bool StayChatShortcutAction::Execute(Event event) return true; } -bool MoveFromGroupChatShortcutAction::Execute(Event event) +bool MoveFromGroupChatShortcutAction::Execute(Event /*event*/) { Player* master = GetMaster(); if (!master) @@ -148,7 +148,7 @@ bool MoveFromGroupChatShortcutAction::Execute(Event event) return true; } -bool FleeChatShortcutAction::Execute(Event event) +bool FleeChatShortcutAction::Execute(Event /*event*/) { Player* master = GetMaster(); if (!master) @@ -171,7 +171,7 @@ bool FleeChatShortcutAction::Execute(Event event) return true; } -bool GoawayChatShortcutAction::Execute(Event event) +bool GoawayChatShortcutAction::Execute(Event /*event*/) { Player* master = GetMaster(); if (!master) @@ -188,7 +188,7 @@ bool GoawayChatShortcutAction::Execute(Event event) return true; } -bool GrindChatShortcutAction::Execute(Event event) +bool GrindChatShortcutAction::Execute(Event /*event*/) { Player* master = GetMaster(); if (!master) @@ -204,7 +204,7 @@ bool GrindChatShortcutAction::Execute(Event event) return true; } -bool TankAttackChatShortcutAction::Execute(Event event) +bool TankAttackChatShortcutAction::Execute(Event /*event*/) { Player* master = GetMaster(); if (!master) @@ -224,7 +224,7 @@ bool TankAttackChatShortcutAction::Execute(Event event) return true; } -bool MaxDpsChatShortcutAction::Execute(Event event) +bool MaxDpsChatShortcutAction::Execute(Event /*event*/) { Player* master = GetMaster(); if (!master) @@ -241,7 +241,7 @@ bool MaxDpsChatShortcutAction::Execute(Event event) return true; } -bool BwlChatShortcutAction::Execute(Event event) +bool BwlChatShortcutAction::Execute(Event /*event*/) { Player* master = GetMaster(); if (!master) diff --git a/src/Ai/Base/Actions/CheckMailAction.cpp b/src/Ai/Base/Actions/CheckMailAction.cpp index f9c70ff11ff..4a39909cdf9 100644 --- a/src/Ai/Base/Actions/CheckMailAction.cpp +++ b/src/Ai/Base/Actions/CheckMailAction.cpp @@ -7,9 +7,10 @@ #include "Event.h" #include "GuildTaskMgr.h" -#include "Playerbots.h" +#include "PlayerbotAIConfig.h" +#include "PlayerbotAI.h" -bool CheckMailAction::Execute(Event event) +bool CheckMailAction::Execute(Event /*event*/) { WorldPacket p; bot->GetSession()->HandleQueryNextMailTime(p); @@ -28,7 +29,7 @@ bool CheckMailAction::Execute(Event event) continue; uint32 account = owner->GetSession()->GetAccountId(); - if (sPlayerbotAIConfig.IsInRandomAccountList(account)) + if (PlayerbotAIConfig::instance().IsInRandomAccountList(account)) continue; ProcessMail(mail, owner, trans); diff --git a/src/Ai/Base/Actions/CheckValuesAction.cpp b/src/Ai/Base/Actions/CheckValuesAction.cpp index 7c64b7c5139..dce66bd47b7 100644 --- a/src/Ai/Base/Actions/CheckValuesAction.cpp +++ b/src/Ai/Base/Actions/CheckValuesAction.cpp @@ -6,12 +6,15 @@ #include "CheckValuesAction.h" #include "Event.h" -#include "Playerbots.h" #include "ServerFacade.h" +#include "PlayerbotAI.h" +#include "TravelNode.h" +#include "AiObjectContext.h" + CheckValuesAction::CheckValuesAction(PlayerbotAI* botAI) : Action(botAI, "check values") {} -bool CheckValuesAction::Execute(Event event) +bool CheckValuesAction::Execute(Event /*event*/) { if (botAI->HasStrategy("debug move", BOT_STATE_NON_COMBAT)) { diff --git a/src/Ai/Base/Actions/ChooseRpgTargetAction.cpp b/src/Ai/Base/Actions/ChooseRpgTargetAction.cpp index ce3d63562ed..e14d0cf3a47 100644 --- a/src/Ai/Base/Actions/ChooseRpgTargetAction.cpp +++ b/src/Ai/Base/Actions/ChooseRpgTargetAction.cpp @@ -6,7 +6,6 @@ #include #include "ChooseRpgTargetAction.h" -#include "BattlegroundMgr.h" #include "BudgetValues.h" #include "ChatHelper.h" #include "Event.h" @@ -14,7 +13,6 @@ #include "GuildCreateActions.h" #include "Playerbots.h" #include "RpgSubActions.h" -#include "Util.h" #include "ServerFacade.h" #include "PossibleRpgTargetsValue.h" @@ -112,7 +110,7 @@ float ChooseRpgTargetAction::getMaxRelevance(GuidPosition guidP) return floor((maxRelevance - 1.0) * 1000.0f); } -bool ChooseRpgTargetAction::Execute(Event event) +bool ChooseRpgTargetAction::Execute(Event /*event*/) { //TravelTarget* travelTarget = AI_VALUE(TravelTarget*, "travel target"); //not used, line marked for removal. Player* master = botAI->GetMaster(); diff --git a/src/Ai/Base/Actions/ChooseTargetActions.cpp b/src/Ai/Base/Actions/ChooseTargetActions.cpp index 3446c9b5211..f7538c03ca9 100644 --- a/src/Ai/Base/Actions/ChooseTargetActions.cpp +++ b/src/Ai/Base/Actions/ChooseTargetActions.cpp @@ -30,7 +30,7 @@ bool AttackEnemyFlagCarrierAction::isUseful() PlayerHasFlag::IsCapturingFlag(bot); } -bool DropTargetAction::Execute(Event event) +bool DropTargetAction::Execute(Event /*event*/) { Unit* target = context->GetValue("current target")->Get(); if (target && target->isDead()) @@ -137,7 +137,7 @@ bool DpsAssistAction::isUseful() return true; } -bool AttackRtiTargetAction::Execute(Event event) +bool AttackRtiTargetAction::Execute(Event /*event*/) { Unit* rtiTarget = AI_VALUE(Unit*, "rti target"); diff --git a/src/Ai/Base/Actions/ChooseTravelTargetAction.cpp b/src/Ai/Base/Actions/ChooseTravelTargetAction.cpp index 0f75a307983..695f0d31114 100644 --- a/src/Ai/Base/Actions/ChooseTravelTargetAction.cpp +++ b/src/Ai/Base/Actions/ChooseTravelTargetAction.cpp @@ -9,7 +9,7 @@ #include "LootObjectStack.h" #include "Playerbots.h" -bool ChooseTravelTargetAction::Execute(Event event) +bool ChooseTravelTargetAction::Execute(Event /*event*/) { // Player* requester = event.getOwner() ? event.getOwner() : GetMaster(); //not used, line marked for removal. diff --git a/src/Ai/Base/Actions/DebugAction.cpp b/src/Ai/Base/Actions/DebugAction.cpp index d7fe0f8b75c..378cdab79f8 100644 --- a/src/Ai/Base/Actions/DebugAction.cpp +++ b/src/Ai/Base/Actions/DebugAction.cpp @@ -7,7 +7,11 @@ #include "ChooseTravelTargetAction.h" #include "MapMgr.h" -#include "Playerbots.h" +#include "TravelMgr.h" +#include "Player.h" +#include "PlayerbotAI.h" +#include "SpellMgr.h" +#include "Spell.h" bool DebugAction::Execute(Event event) { diff --git a/src/Ai/Base/Actions/DelayAction.cpp b/src/Ai/Base/Actions/DelayAction.cpp index b47b6898d15..3daf9ea25da 100644 --- a/src/Ai/Base/Actions/DelayAction.cpp +++ b/src/Ai/Base/Actions/DelayAction.cpp @@ -6,15 +6,19 @@ #include "DelayAction.h" #include "Event.h" -#include "Playerbots.h" +#include "PlayerbotAI.h" +#include "PlayerbotAIConfig.h" -bool DelayAction::Execute(Event event) +bool DelayAction::Execute(Event /*event*/) { - uint32 delay = sPlayerbotAIConfig.passiveDelay + sPlayerbotAIConfig.globalCoolDown; + const uint32 delay = PlayerbotAIConfig::instance().passiveDelay + PlayerbotAIConfig::instance().globalCoolDown; botAI->SetNextCheckDelay(delay); return true; } -bool DelayAction::isUseful() { return !botAI->AllowActivity(ALL_ACTIVITY); } +bool DelayAction::isUseful() +{ + return !botAI->AllowActivity(ALL_ACTIVITY); +} diff --git a/src/Ai/Base/Actions/DestroyItemAction.cpp b/src/Ai/Base/Actions/DestroyItemAction.cpp index 0fce4ad7015..ffcf0fdcf60 100644 --- a/src/Ai/Base/Actions/DestroyItemAction.cpp +++ b/src/Ai/Base/Actions/DestroyItemAction.cpp @@ -39,7 +39,7 @@ void DestroyItemAction::DestroyItem(FindItemVisitor* visitor) bool SmartDestroyItemAction::isUseful() { return !botAI->HasActivePlayerMaster(); } -bool SmartDestroyItemAction::Execute(Event event) +bool SmartDestroyItemAction::Execute(Event /*event*/) { uint8 bagSpace = AI_VALUE(uint8, "bag space"); diff --git a/src/Ai/Base/Actions/EmoteAction.cpp b/src/Ai/Base/Actions/EmoteAction.cpp index 197cc436b13..dd6957cc881 100644 --- a/src/Ai/Base/Actions/EmoteAction.cpp +++ b/src/Ai/Base/Actions/EmoteAction.cpp @@ -6,7 +6,6 @@ #include "EmoteAction.h" #include "Event.h" -#include "PlayerbotTextMgr.h" #include "Playerbots.h" #include "ServerFacade.h" @@ -787,7 +786,7 @@ bool EmoteAction::isUseful() return time(nullptr) >= lastEmote; } -bool TalkAction::Execute(Event event) +bool TalkAction::Execute(Event /*event*/) { Unit* target = botAI->GetUnit(AI_VALUE(ObjectGuid, "talk target")); if (!target) diff --git a/src/Ai/Base/Actions/EquipAction.cpp b/src/Ai/Base/Actions/EquipAction.cpp index a8b262692b0..5c91c13c8a5 100644 --- a/src/Ai/Base/Actions/EquipAction.cpp +++ b/src/Ai/Base/Actions/EquipAction.cpp @@ -406,7 +406,7 @@ bool EquipUpgradesTriggeredAction::Execute(Event event) return true; } -bool EquipUpgradeAction::Execute(Event event) +bool EquipUpgradeAction::Execute(Event /*event*/) { ItemIds items = SelectInventoryItemsToEquip(); EquipItems(items); diff --git a/src/Ai/Base/Actions/FishingAction.cpp b/src/Ai/Base/Actions/FishingAction.cpp index 0fc09c3bce2..a6057cabf83 100644 --- a/src/Ai/Base/Actions/FishingAction.cpp +++ b/src/Ai/Base/Actions/FishingAction.cpp @@ -246,7 +246,7 @@ WorldPosition FindFishingHole(PlayerbotAI* botAI) return WorldPosition(); } -bool MoveNearWaterAction::Execute(Event event) +bool MoveNearWaterAction::Execute(Event /*event*/) { WorldPosition landSpot = AI_VALUE(WorldPosition, "fishing spot"); if (landSpot.IsValid()) @@ -336,7 +336,7 @@ bool MoveNearWaterAction::isPossible() return false; } -bool EquipFishingPoleAction::Execute(Event event) +bool EquipFishingPoleAction::Execute(Event /*event*/) { if (!_pole) return false; @@ -463,7 +463,7 @@ bool UseBobberAction::isUseful() return AI_VALUE(bool, "can use fishing bobber"); } -bool UseBobberAction::Execute(Event event) +bool UseBobberAction::Execute(Event /*event*/) { GuidVector gos = AI_VALUE(GuidVector, "nearest game objects no los"); for (auto const& guid : gos) @@ -485,7 +485,7 @@ bool UseBobberAction::Execute(Event event) return false; } -bool EndMasterFishingAction::Execute(Event event) +bool EndMasterFishingAction::Execute(Event /*event*/) { botAI->ChangeStrategy("-master fishing", BOT_STATE_NON_COMBAT); return true; @@ -503,7 +503,7 @@ bool EndMasterFishingAction::isUseful() return !nearWater.IsValid(); } -bool RemoveBobberStrategyAction::Execute(Event event) +bool RemoveBobberStrategyAction::Execute(Event /*event*/) { botAI->ChangeStrategy("-use bobber", BOT_STATE_NON_COMBAT); return true; diff --git a/src/Ai/Base/Actions/FollowActions.cpp b/src/Ai/Base/Actions/FollowActions.cpp index b9623233a9f..c27de01ffcc 100644 --- a/src/Ai/Base/Actions/FollowActions.cpp +++ b/src/Ai/Base/Actions/FollowActions.cpp @@ -5,17 +5,14 @@ #include "FollowActions.h" -#include - #include "Event.h" #include "Formations.h" #include "LastMovementValue.h" #include "PlayerbotAI.h" #include "Playerbots.h" #include "ServerFacade.h" -#include "SharedDefines.h" -bool FollowAction::Execute(Event event) +bool FollowAction::Execute(Event /*event*/) { Formation* formation = AI_VALUE(Formation*, "formation"); std::string const target = formation->GetTargetName(); @@ -116,7 +113,7 @@ bool FollowAction::CanDeadFollow(Unit* target) return true; } -bool FleeToGroupLeaderAction::Execute(Event event) +bool FleeToGroupLeaderAction::Execute(Event /*event*/) { Unit* fTarget = AI_VALUE(Unit*, "group leader"); bool canFollow = Follow(fTarget); diff --git a/src/Ai/Base/Actions/GenericActions.cpp b/src/Ai/Base/Actions/GenericActions.cpp index 453834c0975..35fa51b316d 100644 --- a/src/Ai/Base/Actions/GenericActions.cpp +++ b/src/Ai/Base/Actions/GenericActions.cpp @@ -11,8 +11,6 @@ #include "CreatureAI.h" #include "Playerbots.h" #include "CharmInfo.h" -#include "SharedDefines.h" -#include "ObjectGuid.h" #include "SpellMgr.h" #include "SpellInfo.h" #include @@ -54,7 +52,7 @@ bool MeleeAction::isUseful() return true; } -bool TogglePetSpellAutoCastAction::Execute(Event event) +bool TogglePetSpellAutoCastAction::Execute(Event /*event*/) { Pet* pet = bot->GetPet(); if (!pet) @@ -119,7 +117,7 @@ bool TogglePetSpellAutoCastAction::Execute(Event event) return toggled; } -bool PetAttackAction::Execute(Event event) +bool PetAttackAction::Execute(Event /*event*/) { Guardian* pet = bot->GetGuardianPet(); if (!pet) diff --git a/src/Ai/Base/Actions/GenericSpellActions.cpp b/src/Ai/Base/Actions/GenericSpellActions.cpp index 02d1decc690..148bc6d3c2c 100644 --- a/src/Ai/Base/Actions/GenericSpellActions.cpp +++ b/src/Ai/Base/Actions/GenericSpellActions.cpp @@ -17,19 +17,17 @@ #include "WorldPacket.h" #include "Group.h" #include "Chat.h" -#include "Language.h" #include "GenericBuffUtils.h" #include "PlayerbotAI.h" using ai::buff::MakeAuraQualifierForBuff; -using ai::buff::UpgradeToGroupIfAppropriate; CastSpellAction::CastSpellAction(PlayerbotAI* botAI, std::string const spell) : Action(botAI, spell), range(botAI->GetRange("spell")), spell(spell) { } -bool CastSpellAction::Execute(Event event) +bool CastSpellAction::Execute(Event /*event*/) { if (spell == "conjure food" || spell == "conjure water") { @@ -232,7 +230,7 @@ Value* BuffOnPartyAction::GetTargetValue() return context->GetValue("party member without aura", MakeAuraQualifierForBuff(spell)); } -bool BuffOnPartyAction::Execute(Event event) +bool BuffOnPartyAction::Execute(Event /*event*/) { std::string castName = spell; // default = mono @@ -289,7 +287,7 @@ Value* CastSnareSpellAction::GetTargetValue() { return context->GetValue< Value* CastCrowdControlSpellAction::GetTargetValue() { return context->GetValue("cc target", getName()); } -bool CastCrowdControlSpellAction::Execute(Event event) { return botAI->CastSpell(getName(), GetTarget()); } +bool CastCrowdControlSpellAction::Execute(Event /*event*/) { return botAI->CastSpell(getName(), GetTarget()); } bool CastCrowdControlSpellAction::isPossible() { return botAI->CanCastSpell(getName(), GetTarget()); } @@ -307,13 +305,13 @@ bool CastVehicleSpellAction::isPossible() bool CastVehicleSpellAction::isUseful() { return botAI->IsInVehicle(false, true); } -bool CastVehicleSpellAction::Execute(Event event) +bool CastVehicleSpellAction::Execute(Event /*event*/) { uint32 spellId = AI_VALUE2(uint32, "vehicle spell id", spell); return botAI->CastVehicleSpell(spellId, GetTarget()); } -bool UseTrinketAction::Execute(Event event) +bool UseTrinketAction::Execute(Event /*event*/) { Item* trinket1 = bot->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_TRINKET1); diff --git a/src/Ai/Base/Actions/GiveItemAction.cpp b/src/Ai/Base/Actions/GiveItemAction.cpp index 350b465b83a..6019d1e38e2 100644 --- a/src/Ai/Base/Actions/GiveItemAction.cpp +++ b/src/Ai/Base/Actions/GiveItemAction.cpp @@ -11,7 +11,7 @@ std::vector split(std::string const s, char delim); -bool GiveItemAction::Execute(Event event) +bool GiveItemAction::Execute(Event /*event*/) { Unit* target = GetTarget(); if (!target) diff --git a/src/Ai/Base/Actions/GreetAction.cpp b/src/Ai/Base/Actions/GreetAction.cpp index a9fda122eca..bf6d1e455c0 100644 --- a/src/Ai/Base/Actions/GreetAction.cpp +++ b/src/Ai/Base/Actions/GreetAction.cpp @@ -10,7 +10,7 @@ GreetAction::GreetAction(PlayerbotAI* botAI) : Action(botAI, "greet") {} -bool GreetAction::Execute(Event event) +bool GreetAction::Execute(Event /*event*/) { ObjectGuid guid = AI_VALUE(ObjectGuid, "new player nearby"); if (!guid || !guid.IsPlayer()) diff --git a/src/Ai/Base/Actions/GuildBankAction.cpp b/src/Ai/Base/Actions/GuildBankAction.cpp index 2d9c74ff69d..9693556d783 100644 --- a/src/Ai/Base/Actions/GuildBankAction.cpp +++ b/src/Ai/Base/Actions/GuildBankAction.cpp @@ -6,7 +6,8 @@ #include "GuildBankAction.h" #include "GuildMgr.h" -#include "Playerbots.h" +#include "PlayerbotAI.h" +#include "AiObjectContext.h" bool GuildBankAction::Execute(Event event) { diff --git a/src/Ai/Base/Actions/GuildCreateActions.cpp b/src/Ai/Base/Actions/GuildCreateActions.cpp index c9f9e689eba..0e7098f1ef7 100644 --- a/src/Ai/Base/Actions/GuildCreateActions.cpp +++ b/src/Ai/Base/Actions/GuildCreateActions.cpp @@ -12,9 +12,9 @@ #include "Playerbots.h" #include "RandomPlayerbotFactory.h" #include "ServerFacade.h" -#include "SharedDefines.h" // GOLD +#include "SharedDefines.h" -bool BuyPetitionAction::Execute(Event event) +bool BuyPetitionAction::Execute(Event /*event*/) { GuidVector vendors = botAI->GetAiObjectContext()->GetValue("nearest npcs")->Get(); bool vendored = false, result = false; @@ -152,7 +152,7 @@ bool PetitionOfferAction::Execute(Event event) bool PetitionOfferAction::isUseful() { return !bot->GetGuildId(); } -bool PetitionOfferNearbyAction::Execute(Event event) +bool PetitionOfferNearbyAction::Execute(Event /*event*/) { uint32 found = 0; @@ -209,7 +209,7 @@ bool PetitionOfferNearbyAction::isUseful() AI_VALUE(uint8, "petition signs") < sWorld->getIntConfig(CONFIG_MIN_PETITION_SIGNS); } -bool PetitionTurnInAction::Execute(Event event) +bool PetitionTurnInAction::Execute(Event /*event*/) { GuidVector vendors = botAI->GetAiObjectContext()->GetValue("nearest npcs")->Get(); bool vendored = false, result = false; @@ -297,7 +297,7 @@ bool PetitionTurnInAction::isUseful() !context->GetValue("travel target")->Get()->isTraveling(); } -bool BuyTabardAction::Execute(Event event) +bool BuyTabardAction::Execute(Event /*event*/) { bool canBuy = botAI->DoSpecificAction("buy", Event("buy tabard", "Hitem:5976:")); if (canBuy && AI_VALUE2(uint32, "item count", chat->FormatQItem(5976))) diff --git a/src/Ai/Base/Actions/GuildManagementActions.cpp b/src/Ai/Base/Actions/GuildManagementActions.cpp index be94b6ae623..0b5a7cf48a6 100644 --- a/src/Ai/Base/Actions/GuildManagementActions.cpp +++ b/src/Ai/Base/Actions/GuildManagementActions.cpp @@ -128,7 +128,7 @@ bool GuildRemoveAction::PlayerIsValid(Player* member) return member->GetGuildId() == bot->GetGuildId() && GetRankId(bot) < GetRankId(member); }; -bool GuildManageNearbyAction::Execute(Event event) +bool GuildManageNearbyAction::Execute(Event /*event*/) { uint32 found = 0; @@ -149,7 +149,6 @@ bool GuildManageNearbyAction::Execute(Event event) // Promote or demote nearby members based on chance. if (player->GetGuildId() && player->GetGuildId() == bot->GetGuildId()) { - Guild::Member* member = guild->GetMember(player->GetGUID()); uint32 dCount = AI_VALUE(uint32, "death count"); if (!urand(0, 30) && dCount < 2 && guild->GetRankRights(botMember->GetRankId()) & GR_RIGHT_PROMOTE) diff --git a/src/Ai/Base/Actions/HelpAction.cpp b/src/Ai/Base/Actions/HelpAction.cpp index 3dbe1d6e4b7..c3d14a0ffc3 100644 --- a/src/Ai/Base/Actions/HelpAction.cpp +++ b/src/Ai/Base/Actions/HelpAction.cpp @@ -7,13 +7,13 @@ #include "ChatActionContext.h" #include "Event.h" -#include "Playerbots.h" +#include "AiObjectContext.h" HelpAction::HelpAction(PlayerbotAI* botAI) : Action(botAI, "help") { chatContext = new ChatActionContext(); } HelpAction::~HelpAction() { delete chatContext; } -bool HelpAction::Execute(Event event) +bool HelpAction::Execute(Event /*event*/) { TellChatCommands(); TellStrategies(); diff --git a/src/Ai/Base/Actions/HireAction.cpp b/src/Ai/Base/Actions/HireAction.cpp index eba607d2e5d..374438f742e 100644 --- a/src/Ai/Base/Actions/HireAction.cpp +++ b/src/Ai/Base/Actions/HireAction.cpp @@ -6,15 +6,16 @@ #include "HireAction.h" #include "Event.h" -#include "Playerbots.h" +#include "RandomPlayerbotMgr.h" +#include "PlayerbotAI.h" -bool HireAction::Execute(Event event) +bool HireAction::Execute(Event /*event*/) { Player* master = GetMaster(); if (!master) return false; - if (!sRandomPlayerbotMgr.IsRandomBot(bot)) + if (!RandomPlayerbotMgr::instance().IsRandomBot(bot)) return false; uint32 account = master->GetSession()->GetAccountId(); @@ -39,7 +40,7 @@ bool HireAction::Execute(Event event) return false; } - uint32 discount = sRandomPlayerbotMgr.GetTradeDiscount(bot, master); + uint32 discount = RandomPlayerbotMgr::instance().GetTradeDiscount(bot, master); uint32 m = 1 + (bot->GetLevel() / 10); uint32 moneyReq = m * 5000 * bot->GetLevel(); if (discount < moneyReq) @@ -54,7 +55,7 @@ bool HireAction::Execute(Event event) botAI->TellMaster("I will join you at your next relogin"); bot->SetMoney(moneyReq); - sRandomPlayerbotMgr.Remove(bot); + RandomPlayerbotMgr::instance().Remove(bot); CharacterDatabase.Execute("UPDATE characters SET account = {} WHERE guid = {}", account, bot->GetGUID().GetCounter()); diff --git a/src/Ai/Base/Actions/ImbueAction.cpp b/src/Ai/Base/Actions/ImbueAction.cpp index 8c151ef8a6f..a6d56d2e505 100644 --- a/src/Ai/Base/Actions/ImbueAction.cpp +++ b/src/Ai/Base/Actions/ImbueAction.cpp @@ -10,7 +10,7 @@ ImbueWithPoisonAction::ImbueWithPoisonAction(PlayerbotAI* botAI) : Action(botAI, "apply poison") {} -bool ImbueWithPoisonAction::Execute(Event event) +bool ImbueWithPoisonAction::Execute(Event /*event*/) { if (bot->IsInCombat()) return false; @@ -103,7 +103,7 @@ bool ImbueWithPoisonAction::Execute(Event event) // Search and apply stone to weapons ImbueWithStoneAction::ImbueWithStoneAction(PlayerbotAI* botAI) : Action(botAI, "apply stone") {} -bool ImbueWithStoneAction::Execute(Event event) +bool ImbueWithStoneAction::Execute(Event /*event*/) { if (bot->IsInCombat()) return false; @@ -148,7 +148,7 @@ bool ImbueWithStoneAction::Execute(Event event) // Search and apply oil to weapons ImbueWithOilAction::ImbueWithOilAction(PlayerbotAI* botAI) : Action(botAI, "apply oil") {} -bool ImbueWithOilAction::Execute(Event event) +bool ImbueWithOilAction::Execute(Event /*event*/) { if (bot->IsInCombat()) return false; @@ -201,7 +201,7 @@ static const uint32 uPrioritizedHealingItemIds[19] = { TryEmergencyAction::TryEmergencyAction(PlayerbotAI* botAI) : Action(botAI, "try emergency") {} -bool TryEmergencyAction::Execute(Event event) +bool TryEmergencyAction::Execute(Event /*event*/) { // Do not use consumable if bot can heal self if ((botAI->IsHeal(bot)) && (bot->GetPowerPct(POWER_MANA) > 20)) diff --git a/src/Ai/Base/Actions/InventoryAction.cpp b/src/Ai/Base/Actions/InventoryAction.cpp index f7b606a91a0..83fc00f1244 100644 --- a/src/Ai/Base/Actions/InventoryAction.cpp +++ b/src/Ai/Base/Actions/InventoryAction.cpp @@ -351,9 +351,7 @@ uint32 InventoryAction::GetItemCount(FindItemVisitor* visitor, IterateItemsMask std::vector& items = visitor->GetResult(); for (Item* item : items) - { count += item->GetCount(); - } return count; } diff --git a/src/Ai/Base/Actions/InviteToGroupAction.cpp b/src/Ai/Base/Actions/InviteToGroupAction.cpp index 14f943f76c7..136f13958a1 100644 --- a/src/Ai/Base/Actions/InviteToGroupAction.cpp +++ b/src/Ai/Base/Actions/InviteToGroupAction.cpp @@ -8,7 +8,6 @@ #include "BroadcastHelper.h" #include "Event.h" #include "GuildMgr.h" -#include "Log.h" #include "PlayerbotOperations.h" #include "Playerbots.h" #include "PlayerbotWorldThreadProcessor.h" @@ -44,7 +43,7 @@ bool InviteToGroupAction::Invite(Player* inviter, Player* player) return true; } -bool InviteNearbyToGroupAction::Execute(Event event) +bool InviteNearbyToGroupAction::Execute(Event /*event*/) { GuidVector nearGuids = botAI->GetAiObjectContext()->GetValue("nearest friendly players")->Get(); for (auto& i : nearGuids) @@ -62,7 +61,7 @@ bool InviteNearbyToGroupAction::Execute(Event event) if (player->GetGroup()) continue; - if (!sPlayerbotAIConfig.randomBotInvitePlayer && GET_PLAYERBOT_AI(player)->IsRealPlayer()) + if (!PlayerbotAIConfig::instance().randomBotInvitePlayer && GET_PLAYERBOT_AI(player)->IsRealPlayer()) continue; Group* group = bot->GetGroup(); @@ -88,7 +87,7 @@ bool InviteNearbyToGroupAction::Execute(Event event) if (abs(int32(player->GetLevel() - bot->GetLevel())) > 2) continue; - if (ServerFacade::instance().GetDistance2d(bot, player) > sPlayerbotAIConfig.sightDistance) + if (ServerFacade::instance().GetDistance2d(bot, player) > PlayerbotAIConfig::instance().sightDistance) continue; // When inviting the 5th member of the group convert to raid for future invites. @@ -99,7 +98,7 @@ bool InviteNearbyToGroupAction::Execute(Event event) PlayerbotWorldThreadProcessor::instance().QueueOperation(std::move(convertOp)); } - if (sPlayerbotAIConfig.inviteChat && sRandomPlayerbotMgr.IsRandomBot(bot)) + if (PlayerbotAIConfig::instance().inviteChat && RandomPlayerbotMgr::instance().IsRandomBot(bot)) { std::map placeholders; placeholders["%player"] = player->GetName(); @@ -120,7 +119,7 @@ bool InviteNearbyToGroupAction::Execute(Event event) bool InviteNearbyToGroupAction::isUseful() { - if (!sPlayerbotAIConfig.randomBotGroupNearby) + if (!PlayerbotAIConfig::instance().randomBotGroupNearby) return false; if (bot->InBattleground()) @@ -166,7 +165,7 @@ std::vector InviteGuildToGroupAction::getGuildMembers() return worker.GetResult(); } -bool InviteGuildToGroupAction::Execute(Event event) +bool InviteGuildToGroupAction::Execute(Event /*event*/) { Guild* guild = sGuildMgr->GetGuildById(bot->GetGuildId()); @@ -186,7 +185,7 @@ bool InviteGuildToGroupAction::Execute(Event event) if (player->isDND()) continue; - if (!sPlayerbotAIConfig.randomBotInvitePlayer && GET_PLAYERBOT_AI(player)->IsRealPlayer()) + if (!PlayerbotAIConfig::instance().randomBotInvitePlayer && GET_PLAYERBOT_AI(player)->IsRealPlayer()) continue; if (player->IsBeingTeleported()) @@ -221,7 +220,7 @@ bool InviteGuildToGroupAction::Execute(Event event) player->GetLevel() + 5) // Do not invite members that too low level or risk dragging them to deadly places. continue; - if (!playerAi && ServerFacade::instance().GetDistance2d(bot, player) > sPlayerbotAIConfig.sightDistance) + if (!playerAi && ServerFacade::instance().GetDistance2d(bot, player) > PlayerbotAIConfig::instance().sightDistance) continue; Group* group = bot->GetGroup(); @@ -233,8 +232,8 @@ bool InviteGuildToGroupAction::Execute(Event event) PlayerbotWorldThreadProcessor::instance().QueueOperation(std::move(convertOp)); } - if (sPlayerbotAIConfig.inviteChat && - (sRandomPlayerbotMgr.IsRandomBot(bot) || !botAI->HasActivePlayerMaster())) + if (PlayerbotAIConfig::instance().inviteChat && + (RandomPlayerbotMgr::instance().IsRandomBot(bot) || !botAI->HasActivePlayerMaster())) { BroadcastHelper::BroadcastGuildGroupOrRaidInvite(botAI, bot, player, group); } diff --git a/src/Ai/Base/Actions/LeaveGroupAction.cpp b/src/Ai/Base/Actions/LeaveGroupAction.cpp index 03a24bd199b..337d115444c 100644 --- a/src/Ai/Base/Actions/LeaveGroupAction.cpp +++ b/src/Ai/Base/Actions/LeaveGroupAction.cpp @@ -92,7 +92,7 @@ bool LeaveGroupAction::Leave() return true; } -bool LeaveFarAwayAction::Execute(Event event) +bool LeaveFarAwayAction::Execute(Event /*event*/) { // allow bot to leave party when they want return Leave(); diff --git a/src/Ai/Base/Actions/LfgActions.cpp b/src/Ai/Base/Actions/LfgActions.cpp index a34c3efc63c..93e6ff4e330 100644 --- a/src/Ai/Base/Actions/LfgActions.cpp +++ b/src/Ai/Base/Actions/LfgActions.cpp @@ -8,11 +8,11 @@ #include "AiFactory.h" #include "ItemVisitors.h" #include "LFGMgr.h" -#include "LFGPackets.h" #include "Opcodes.h" #include "Playerbots.h" #include "World.h" #include "WorldPacket.h" +#include "RandomPlayerbotMgr.h" using namespace lfg; @@ -20,7 +20,7 @@ bool LfgJoinAction::Execute(Event event) { return JoinLFG(); } uint32 LfgJoinAction::GetRoles() { - if (!sRandomPlayerbotMgr.IsRandomBot(bot)) + if (!RandomPlayerbotMgr::instance().IsRandomBot(bot)) { if (botAI->IsTank(bot)) return PLAYER_ROLE_TANK; @@ -101,7 +101,7 @@ bool LfgJoinAction::JoinLFG() LfgDungeonSet list; std::vector selected; - std::vector dungeons = sRandomPlayerbotMgr.LfgDungeons[bot->GetTeamId()]; + std::vector dungeons = RandomPlayerbotMgr::instance().LfgDungeons[bot->GetTeamId()]; if (!dungeons.size()) return false; @@ -170,7 +170,7 @@ bool LfgJoinAction::JoinLFG() return true; } -bool LfgRoleCheckAction::Execute(Event event) +bool LfgRoleCheckAction::Execute(Event /*event*/) { if (Group* group = bot->GetGroup()) { @@ -216,9 +216,9 @@ bool LfgAcceptAction::Execute(Event event) *packet << id << true; bot->GetSession()->QueuePacket(packet); - if (sRandomPlayerbotMgr.IsRandomBot(bot) && !bot->GetGroup()) + if (RandomPlayerbotMgr::instance().IsRandomBot(bot) && !bot->GetGroup()) { - sRandomPlayerbotMgr.Refresh(bot); + RandomPlayerbotMgr::instance().Refresh(bot); botAI->ResetStrategies(); } @@ -251,9 +251,9 @@ bool LfgAcceptAction::Execute(Event event) *packet << id << true; bot->GetSession()->QueuePacket(packet); - if (sRandomPlayerbotMgr.IsRandomBot(bot) && !bot->GetGroup()) + if (RandomPlayerbotMgr::instance().IsRandomBot(bot) && !bot->GetGroup()) { - sRandomPlayerbotMgr.Refresh(bot); + RandomPlayerbotMgr::instance().Refresh(bot); botAI->ResetStrategies(); } @@ -265,7 +265,7 @@ bool LfgAcceptAction::Execute(Event event) return false; } -bool LfgLeaveAction::Execute(Event event) +bool LfgLeaveAction::Execute(Event /*event*/) { // Don't leave if lfg strategy enabled // if (botAI->HasStrategy("lfg", BOT_STATE_NON_COMBAT)) @@ -337,7 +337,7 @@ bool LfgJoinAction::isUseful() if (bot->isDead()) return false; - if (!sRandomPlayerbotMgr.IsRandomBot(bot)) + if (!RandomPlayerbotMgr::instance().IsRandomBot(bot)) return false; Map* map = bot->GetMap(); diff --git a/src/Ai/Base/Actions/LootRollAction.cpp b/src/Ai/Base/Actions/LootRollAction.cpp index 9a21c8139fd..7bbdc95c1b6 100644 --- a/src/Ai/Base/Actions/LootRollAction.cpp +++ b/src/Ai/Base/Actions/LootRollAction.cpp @@ -13,7 +13,7 @@ #include "PlayerbotAIConfig.h" #include "Playerbots.h" -bool LootRollAction::Execute(Event event) +bool LootRollAction::Execute(Event /*event*/) { Group* group = bot->GetGroup(); if (!group) diff --git a/src/Ai/Base/Actions/MoveToRpgTargetAction.cpp b/src/Ai/Base/Actions/MoveToRpgTargetAction.cpp index 4e898f30efd..ad197e4fe66 100644 --- a/src/Ai/Base/Actions/MoveToRpgTargetAction.cpp +++ b/src/Ai/Base/Actions/MoveToRpgTargetAction.cpp @@ -11,20 +11,16 @@ #include "LastMovementValue.h" #include "Playerbots.h" -bool MoveToRpgTargetAction::Execute(Event event) +bool MoveToRpgTargetAction::Execute(Event /*event*/) { GuidPosition guidP = AI_VALUE(GuidPosition, "rpg target"); Unit* unit = botAI->GetUnit(guidP); if (unit && !unit->IsInWorld()) - { return false; - } + GameObject* go = botAI->GetGameObject(guidP); if (go && !go->IsInWorld()) - { return false; - } - Player* player = guidP.GetPlayer(); WorldObject* wo = nullptr; if (unit) diff --git a/src/Ai/Base/Actions/MoveToTravelTargetAction.cpp b/src/Ai/Base/Actions/MoveToTravelTargetAction.cpp index 958dfe73911..f238135d9f3 100644 --- a/src/Ai/Base/Actions/MoveToTravelTargetAction.cpp +++ b/src/Ai/Base/Actions/MoveToTravelTargetAction.cpp @@ -7,10 +7,9 @@ #include "ChooseRpgTargetAction.h" #include "LootObjectStack.h" -#include "PathGenerator.h" #include "Playerbots.h" -bool MoveToTravelTargetAction::Execute(Event event) +bool MoveToTravelTargetAction::Execute(Event /*event*/) { TravelTarget* target = AI_VALUE(TravelTarget*, "travel target"); diff --git a/src/Ai/Base/Actions/MovementActions.cpp b/src/Ai/Base/Actions/MovementActions.cpp index 4f04d179952..2b0359254e5 100644 --- a/src/Ai/Base/Actions/MovementActions.cpp +++ b/src/Ai/Base/Actions/MovementActions.cpp @@ -15,7 +15,6 @@ #include "FleeManager.h" #include "G3D/Vector3.h" #include "GameObject.h" -#include "Geometry.h" #include "LastMovementValue.h" #include "LootObjectStack.h" #include "Map.h" @@ -36,9 +35,7 @@ #include "SpellAuraEffects.h" #include "SpellInfo.h" #include "Stances.h" -#include "TargetedMovementGenerator.h" #include "Timer.h" -#include "Transport.h" #include "Unit.h" #include "Vehicle.h" #include "WaypointMovementGenerator.h" @@ -67,18 +64,14 @@ bool MovementAction::JumpTo(uint32 mapId, float x, float y, float z, MovementPri { UpdateMovementState(); if (!IsMovingAllowed(mapId, x, y, z)) - { return false; - } + if (IsDuplicateMove(mapId, x, y, z)) - { return false; - } + if (IsWaitingForLastMove(priority)) - { return false; - } - float botZ = bot->GetPositionZ(); + float speed = bot->GetSpeed(MOVE_RUN); MotionMaster& mm = *bot->GetMotionMaster(); mm.Clear(); @@ -1846,7 +1839,7 @@ void MovementAction::DoMovePoint(Unit* unit, float x, float y, float z, bool gen } } -bool FleeAction::Execute(Event event) +bool FleeAction::Execute(Event /*event*/) { return MoveAway(AI_VALUE(Unit*, "current target"), sPlayerbotAIConfig.fleeDistance, true); } @@ -1854,9 +1847,8 @@ bool FleeAction::Execute(Event event) bool FleeAction::isUseful() { if (bot->GetCurrentSpell(CURRENT_CHANNELED_SPELL) != nullptr) - { return false; - } + Unit* target = AI_VALUE(Unit*, "current target"); if (target && target->IsInWorld() && !bot->IsWithinMeleeRange(target)) return false; @@ -1864,12 +1856,10 @@ bool FleeAction::isUseful() return true; } -bool FleeWithPetAction::Execute(Event event) +bool FleeWithPetAction::Execute(Event /*event*/) { if (Pet* pet = bot->GetPet()) - { botAI->PetFollow(); - } return Flee(AI_VALUE(Unit*, "current target")); } @@ -1877,15 +1867,14 @@ bool FleeWithPetAction::Execute(Event event) bool AvoidAoeAction::isUseful() { if (getMSTime() - moveInterval < lastMoveTimer) - { return false; - } + GuidVector traps = AI_VALUE(GuidVector, "nearest trap with damage"); GuidVector triggers = AI_VALUE(GuidVector, "possible triggers"); return AI_VALUE(Aura*, "area debuff") || !traps.empty() || !triggers.empty(); } -bool AvoidAoeAction::Execute(Event event) +bool AvoidAoeAction::Execute(Event /*event*/) { // Case #1: Aura with dynamic object (e.g. rain of fire) if (AvoidAuraWithDynamicObj()) @@ -2309,17 +2298,15 @@ bool MovementAction::CheckLastFlee(float curAngle, std::list& infoList bool CombatFormationMoveAction::isUseful() { if (getMSTime() - moveInterval < lastMoveTimer) - { return false; - } + if (bot->GetCurrentSpell(CURRENT_CHANNELED_SPELL) != nullptr) - { return false; - } + return true; } -bool CombatFormationMoveAction::Execute(Event event) +bool CombatFormationMoveAction::Execute(Event /*event*/) { float dis = AI_VALUE(float, "disperse distance"); if (dis <= 0.0f || (!bot->IsInCombat() && botAI->HasStrategy("stay", BotState::BOT_STATE_NON_COMBAT)) || @@ -2450,7 +2437,7 @@ Player* CombatFormationMoveAction::NearestGroupMember(float dis) return result; } -bool TankFaceAction::Execute(Event event) +bool TankFaceAction::Execute(Event /*event*/) { Unit* target = AI_VALUE(Unit*, "current target"); if (!target) @@ -2534,7 +2521,7 @@ bool RearFlankAction::isUseful() return inFront || inRear; } -bool RearFlankAction::Execute(Event event) +bool RearFlankAction::Execute(Event /*event*/) { Unit* target = AI_VALUE(Unit*, "current target"); if (!target) @@ -2645,9 +2632,9 @@ bool DisperseSetAction::Execute(Event event) return true; } -bool RunAwayAction::Execute(Event event) { return Flee(AI_VALUE(Unit*, "group leader")); } +bool RunAwayAction::Execute(Event /*event*/) { return Flee(AI_VALUE(Unit*, "group leader")); } -bool MoveToLootAction::Execute(Event event) +bool MoveToLootAction::Execute(Event /*event*/) { LootObject loot = AI_VALUE(LootObject, "loot target"); if (!loot.IsLootPossible(bot)) @@ -2656,7 +2643,7 @@ bool MoveToLootAction::Execute(Event event) return MoveNear(loot.GetWorldObject(bot), sPlayerbotAIConfig.contactDistance); } -bool MoveOutOfEnemyContactAction::Execute(Event event) +bool MoveOutOfEnemyContactAction::Execute(Event /*event*/) { Unit* target = AI_VALUE(Unit*, "current target"); if (!target) @@ -2667,7 +2654,7 @@ bool MoveOutOfEnemyContactAction::Execute(Event event) bool MoveOutOfEnemyContactAction::isUseful() { return AI_VALUE2(bool, "inside target", "current target"); } -bool SetFacingTargetAction::Execute(Event event) +bool SetFacingTargetAction::Execute(Event /*event*/) { Unit* target = AI_VALUE(Unit*, "current target"); if (!target) @@ -2693,7 +2680,7 @@ bool SetFacingTargetAction::isPossible() return true; } -bool SetBehindTargetAction::Execute(Event event) +bool SetBehindTargetAction::Execute(Event /*event*/) { Unit* target = AI_VALUE(Unit*, "current target"); if (!target) @@ -2753,7 +2740,7 @@ bool SetBehindTargetAction::Execute(Event event) false, true, MovementPriority::MOVEMENT_COMBAT); } -bool MoveOutOfCollisionAction::Execute(Event event) +bool MoveOutOfCollisionAction::Execute(Event /*event*/) { float angle = M_PI * 2000 / frand(1.f, 1000.f); float distance = sPlayerbotAIConfig.followDistance; @@ -2771,7 +2758,7 @@ bool MoveOutOfCollisionAction::isUseful() botAI->GetAiObjectContext()->GetValue("nearest friendly players")->Get().size() < 15; } -bool MoveRandomAction::Execute(Event event) +bool MoveRandomAction::Execute(Event /*event*/) { float distance = sPlayerbotAIConfig.tooCloseDistance + urand(10, 30); @@ -2803,9 +2790,9 @@ bool MoveRandomAction::Execute(Event event) bool MoveRandomAction::isUseful() { return !AI_VALUE(GuidPosition, "rpg target"); } -bool MoveInsideAction::Execute(Event event) { return MoveInside(bot->GetMapId(), x, y, bot->GetPositionZ(), distance); } +bool MoveInsideAction::Execute(Event /*event*/) { return MoveInside(bot->GetMapId(), x, y, bot->GetPositionZ(), distance); } -bool RotateAroundTheCenterPointAction::Execute(Event event) +bool RotateAroundTheCenterPointAction::Execute(Event /*event*/) { uint32 next_point = GetCurrWaypoint(); if (MoveTo(bot->GetMapId(), waypoints[next_point].first, waypoints[next_point].second, bot->GetPositionZ(), false, @@ -2825,10 +2812,9 @@ bool MoveFromGroupAction::Execute(Event event) return MoveFromGroup(distance); } -bool MoveAwayFromCreatureAction::Execute(Event event) +bool MoveAwayFromCreatureAction::Execute(Event /*event*/) { GuidVector targets = AI_VALUE(GuidVector, "nearest npcs"); - Creature* nearestCreature = bot->FindNearestCreature(creatureId, range, alive); // Find all creatures with the specified Id std::vector creatures; @@ -2906,16 +2892,14 @@ bool MoveAwayFromCreatureAction::Execute(Event event) bool MoveAwayFromCreatureAction::isPossible() { return bot->CanFreeMove(); } -bool MoveAwayFromPlayerWithDebuffAction::Execute(Event event) +bool MoveAwayFromPlayerWithDebuffAction::Execute(Event /*event*/) { Player* closestPlayer = nullptr; float minDistance = 0.0f; Group* group = bot->GetGroup(); if (!group) - { return false; - } std::vector debuffedPlayers; diff --git a/src/Ai/Base/Actions/OpenItemAction.cpp b/src/Ai/Base/Actions/OpenItemAction.cpp index d1ebcbaaaf1..0ea7560ed4f 100644 --- a/src/Ai/Base/Actions/OpenItemAction.cpp +++ b/src/Ai/Base/Actions/OpenItemAction.cpp @@ -7,7 +7,7 @@ #include "LootObjectStack.h" #include "AiObjectContext.h" -bool OpenItemAction::Execute(Event event) +bool OpenItemAction::Execute(Event /*event*/) { bool foundOpenable = false; diff --git a/src/Ai/Base/Actions/PassLeadershipToMasterAction.cpp b/src/Ai/Base/Actions/PassLeadershipToMasterAction.cpp index 4ecfdc3bc1a..e2e9f0fe6bb 100644 --- a/src/Ai/Base/Actions/PassLeadershipToMasterAction.cpp +++ b/src/Ai/Base/Actions/PassLeadershipToMasterAction.cpp @@ -7,10 +7,9 @@ #include "Event.h" #include "PlayerbotOperations.h" -#include "Playerbots.h" #include "PlayerbotWorldThreadProcessor.h" -bool PassLeadershipToMasterAction::Execute(Event event) +bool PassLeadershipToMasterAction::Execute(Event /*event*/) { if (Player* master = GetMaster()) if (master && master != bot && bot->GetGroup() && bot->GetGroup()->IsMember(master->GetGUID())) diff --git a/src/Ai/Base/Actions/PetsAction.h b/src/Ai/Base/Actions/PetsAction.h index f9334e31941..78f9c0b50a9 100644 --- a/src/Ai/Base/Actions/PetsAction.h +++ b/src/Ai/Base/Actions/PetsAction.h @@ -9,8 +9,6 @@ #include #include "Action.h" -#include "PlayerbotFactory.h" -#include "Unit.h" class PlayerbotAI; diff --git a/src/Ai/Base/Actions/PositionAction.cpp b/src/Ai/Base/Actions/PositionAction.cpp index 7d8f4264ca3..34d339f2c81 100644 --- a/src/Ai/Base/Actions/PositionAction.cpp +++ b/src/Ai/Base/Actions/PositionAction.cpp @@ -102,7 +102,7 @@ bool PositionAction::Execute(Event event) return false; } -bool MoveToPositionAction::Execute(Event event) +bool MoveToPositionAction::Execute(Event /*event*/) { PositionInfo pos = context->GetValue("position")->Get()[qualifier]; if (!pos.isSet()) @@ -123,7 +123,7 @@ bool MoveToPositionAction::isUseful() return pos.isSet() && distance > sPlayerbotAIConfig.followDistance && distance < sPlayerbotAIConfig.reactDistance; } -bool SetReturnPositionAction::Execute(Event event) +bool SetReturnPositionAction::Execute(Event /*event*/) { PositionMap& posMap = context->GetValue("position")->Get(); PositionInfo returnPos = posMap["return"]; diff --git a/src/Ai/Base/Actions/QueryQuestAction.cpp b/src/Ai/Base/Actions/QueryQuestAction.cpp index 5f5d63e08c4..9540a9bf89e 100644 --- a/src/Ai/Base/Actions/QueryQuestAction.cpp +++ b/src/Ai/Base/Actions/QueryQuestAction.cpp @@ -7,7 +7,7 @@ #include "ChatHelper.h" #include "Event.h" -#include "Playerbots.h" +#include "PlayerbotAI.h" void QueryQuestAction::TellObjective(std::string const name, uint32 available, uint32 required) { diff --git a/src/Ai/Base/Actions/QuestAction.cpp b/src/Ai/Base/Actions/QuestAction.cpp index dfe7bb9f1eb..f442f91a734 100644 --- a/src/Ai/Base/Actions/QuestAction.cpp +++ b/src/Ai/Base/Actions/QuestAction.cpp @@ -5,6 +5,7 @@ #include "QuestAction.h" #include +#include #include "Chat.h" #include "ChatHelper.h" @@ -116,7 +117,8 @@ bool QuestAction::CompleteQuest(Player* player, uint32 entry) player->CastedCreatureOrGO(creature, ObjectGuid(), spell_id); } }*/ - /*else*/ if (creature > 0) + /*else*/ + if (creature > 0) { if (CreatureTemplate const* cInfo = sObjectMgr->GetCreatureTemplate(creature)) for (uint16 z = 0; z < creaturecount; ++z) @@ -432,7 +434,7 @@ bool QuestItemPushResultAction::Execute(Event event) return false; } -bool QuestUpdateFailedAction::Execute(Event event) +bool QuestUpdateFailedAction::Execute(Event /*event*/) { //opcode SMSG_QUESTUPDATE_FAILED is never sent...(yet?) return false; diff --git a/src/Ai/Base/Actions/RandomBotUpdateAction.cpp b/src/Ai/Base/Actions/RandomBotUpdateAction.cpp index 76ed46c9013..7d7cba60554 100644 --- a/src/Ai/Base/Actions/RandomBotUpdateAction.cpp +++ b/src/Ai/Base/Actions/RandomBotUpdateAction.cpp @@ -8,7 +8,7 @@ #include "Event.h" #include "Playerbots.h" -bool RandomBotUpdateAction::Execute(Event event) +bool RandomBotUpdateAction::Execute(Event /*event*/) { if (!sRandomPlayerbotMgr.IsRandomBot(bot)) return false; diff --git a/src/Ai/Base/Actions/ReachTargetActions.cpp b/src/Ai/Base/Actions/ReachTargetActions.cpp index a58e9b96ead..03eecda65c0 100644 --- a/src/Ai/Base/Actions/ReachTargetActions.cpp +++ b/src/Ai/Base/Actions/ReachTargetActions.cpp @@ -10,7 +10,7 @@ #include "Playerbots.h" #include "ServerFacade.h" -bool ReachTargetAction::Execute(Event event) { return ReachCombatTo(AI_VALUE(Unit*, GetTargetName()), distance); } +bool ReachTargetAction::Execute(Event /*event*/) { return ReachCombatTo(AI_VALUE(Unit*, GetTargetName()), distance); } bool ReachTargetAction::isUseful() { diff --git a/src/Ai/Base/Actions/ReleaseSpiritAction.cpp b/src/Ai/Base/Actions/ReleaseSpiritAction.cpp index 9e3ec445d23..9a923d4fd38 100644 --- a/src/Ai/Base/Actions/ReleaseSpiritAction.cpp +++ b/src/Ai/Base/Actions/ReleaseSpiritAction.cpp @@ -78,7 +78,7 @@ void ReleaseSpiritAction::LogRelease(const std::string& releaseMsg, bool isAutoR } // AutoReleaseSpiritAction implementation -bool AutoReleaseSpiritAction::Execute(Event event) +bool AutoReleaseSpiritAction::Execute(Event /*event*/) { IncrementDeathCount(); bot->DurabilityRepairAll(false, 1.0f, false); @@ -214,7 +214,7 @@ bool AutoReleaseSpiritAction::ShouldDelayBattlegroundRelease() const return true; } -bool RepopAction::Execute(Event event) +bool RepopAction::Execute(Event /*event*/) { const GraveyardStruct* graveyard = GetGrave( AI_VALUE(uint32, "death count") > 10 || @@ -250,7 +250,7 @@ void RepopAction::PerformGraveyardTeleport(const GraveyardStruct* graveyard) con } // SelfResurrectAction implementation for Warlock's Soulstone Resurrection/Shaman's Reincarnation -bool SelfResurrectAction::Execute(Event event) +bool SelfResurrectAction::Execute(Event /*event*/) { if (!bot->IsAlive() && bot->GetUInt32Value(PLAYER_SELF_RES_SPELL)) { diff --git a/src/Ai/Base/Actions/RememberTaxiAction.cpp b/src/Ai/Base/Actions/RememberTaxiAction.cpp index af5a5403701..16132d7cb80 100644 --- a/src/Ai/Base/Actions/RememberTaxiAction.cpp +++ b/src/Ai/Base/Actions/RememberTaxiAction.cpp @@ -7,7 +7,7 @@ #include "Event.h" #include "LastMovementValue.h" -#include "Playerbots.h" +#include "AiObjectContext.h" bool RememberTaxiAction::Execute(Event event) { diff --git a/src/Ai/Base/Actions/RepairAllAction.cpp b/src/Ai/Base/Actions/RepairAllAction.cpp index a66ba3a1bb4..efb20d88d31 100644 --- a/src/Ai/Base/Actions/RepairAllAction.cpp +++ b/src/Ai/Base/Actions/RepairAllAction.cpp @@ -9,7 +9,7 @@ #include "Event.h" #include "Playerbots.h" -bool RepairAllAction::Execute(Event event) +bool RepairAllAction::Execute(Event /*event*/) { GuidVector npcs = AI_VALUE(GuidVector, "nearest npcs"); for (ObjectGuid const guid : npcs) diff --git a/src/Ai/Base/Actions/ResetInstancesAction.cpp b/src/Ai/Base/Actions/ResetInstancesAction.cpp index cce5eef1e3a..eef29fc9464 100644 --- a/src/Ai/Base/Actions/ResetInstancesAction.cpp +++ b/src/Ai/Base/Actions/ResetInstancesAction.cpp @@ -5,14 +5,13 @@ #include "ResetInstancesAction.h" -#include "Playerbots.h" +#include "PlayerbotAI.h" -bool ResetInstancesAction::Execute(Event event) +bool ResetInstancesAction::Execute(Event /*event*/) { WorldPacket packet(CMSG_RESET_INSTANCES, 0); bot->GetSession()->HandleResetInstancesOpcode(packet); - botAI->TellMaster("Resetting all instances"); return true; } diff --git a/src/Ai/Base/Actions/RevealGatheringItemAction.cpp b/src/Ai/Base/Actions/RevealGatheringItemAction.cpp index 35cd7f8f042..72b0ef2ec95 100644 --- a/src/Ai/Base/Actions/RevealGatheringItemAction.cpp +++ b/src/Ai/Base/Actions/RevealGatheringItemAction.cpp @@ -10,11 +10,11 @@ #include "Event.h" #include "GridNotifiers.h" #include "GridNotifiersImpl.h" -#include "Playerbots.h" +#include "PlayerbotAI.h" #include "ServerFacade.h" #include "NearestGameObjects.h" -bool RevealGatheringItemAction::Execute(Event event) +bool RevealGatheringItemAction::Execute(Event /*event*/) { if (!bot->GetGroup()) return false; diff --git a/src/Ai/Base/Actions/ReviveFromCorpseAction.cpp b/src/Ai/Base/Actions/ReviveFromCorpseAction.cpp index 970d378f475..0051a5a49b3 100644 --- a/src/Ai/Base/Actions/ReviveFromCorpseAction.cpp +++ b/src/Ai/Base/Actions/ReviveFromCorpseAction.cpp @@ -9,7 +9,6 @@ #include "FleeManager.h" #include "GameGraveyard.h" #include "MapMgr.h" -#include "PlayerbotFactory.h" #include "Playerbots.h" #include "RandomPlayerbotMgr.h" #include "ServerFacade.h" @@ -74,7 +73,7 @@ bool ReviveFromCorpseAction::Execute(Event event) return true; } -bool FindCorpseAction::Execute(Event event) +bool FindCorpseAction::Execute(Event /*event*/) { if (bot->InBattleground()) return false; @@ -293,7 +292,7 @@ GraveyardStruct const* SpiritHealerAction::GetGrave(bool startZone) return ClosestGrave; } -bool SpiritHealerAction::Execute(Event event) +bool SpiritHealerAction::Execute(Event /*event*/) { Corpse* corpse = bot->GetCorpse(); if (!corpse) diff --git a/src/Ai/Base/Actions/RpgAction.cpp b/src/Ai/Base/Actions/RpgAction.cpp index 1e461b068ef..73068a0b1b1 100644 --- a/src/Ai/Base/Actions/RpgAction.cpp +++ b/src/Ai/Base/Actions/RpgAction.cpp @@ -7,7 +7,6 @@ #include -#include "BattlegroundMgr.h" #include "ChatHelper.h" #include "EmoteAction.h" #include "Event.h" @@ -16,7 +15,7 @@ #include "ServerFacade.h" #include "RpgSubActions.h" -bool RpgAction::Execute(Event event) +bool RpgAction::Execute(Event /*event*/) { GuidPosition guidP = AI_VALUE(GuidPosition, "rpg target"); if (!guidP && botAI->GetMaster()) diff --git a/src/Ai/Base/Actions/RpgSubActions.cpp b/src/Ai/Base/Actions/RpgSubActions.cpp index 3f0947ac83a..de16ed17de1 100644 --- a/src/Ai/Base/Actions/RpgSubActions.cpp +++ b/src/Ai/Base/Actions/RpgSubActions.cpp @@ -99,7 +99,7 @@ Event RpgSubAction::ActionEvent(Event event) { return event; } bool RpgStayAction::isUseful() { return rpg->InRange() && !botAI->HasRealPlayerMaster(); } -bool RpgStayAction::Execute(Event event) +bool RpgStayAction::Execute(Event /*event*/) { bot->PlayerTalkClass->SendCloseGossip(); @@ -109,7 +109,7 @@ bool RpgStayAction::Execute(Event event) bool RpgWorkAction::isUseful() { return rpg->InRange() && !botAI->HasRealPlayerMaster(); } -bool RpgWorkAction::Execute(Event event) +bool RpgWorkAction::Execute(Event /*event*/) { bot->HandleEmoteCommand(EMOTE_STATE_USE_STANDING); rpg->AfterExecute(); @@ -118,7 +118,7 @@ bool RpgWorkAction::Execute(Event event) bool RpgEmoteAction::isUseful() { return rpg->InRange() && !botAI->HasRealPlayerMaster(); } -bool RpgEmoteAction::Execute(Event event) +bool RpgEmoteAction::Execute(Event /*event*/) { uint32 type = TalkAction::GetRandomEmote(rpg->guidP().GetUnit()); @@ -133,7 +133,7 @@ bool RpgEmoteAction::Execute(Event event) return true; } -bool RpgCancelAction::Execute(Event event) +bool RpgCancelAction::Execute(Event /*event*/) { RESET_AI_VALUE(GuidPosition, "rpg target"); rpg->OnExecute(""); @@ -142,7 +142,7 @@ bool RpgCancelAction::Execute(Event event) bool RpgTaxiAction::isUseful() { return rpg->InRange() && !botAI->HasRealPlayerMaster(); } -bool RpgTaxiAction::Execute(Event event) +bool RpgTaxiAction::Execute(Event /*event*/) { GuidPosition guidP = rpg->guidP(); @@ -203,7 +203,7 @@ bool RpgTaxiAction::Execute(Event event) return true; } -bool RpgDiscoverAction::Execute(Event event) +bool RpgDiscoverAction::Execute(Event /*event*/) { GuidPosition guidP = rpg->guidP(); @@ -222,7 +222,7 @@ bool RpgDiscoverAction::Execute(Event event) std::string const RpgStartQuestAction::ActionName() { return "accept all quests"; } -Event RpgStartQuestAction::ActionEvent(Event event) +Event RpgStartQuestAction::ActionEvent(Event /*event*/) { WorldPacket p(CMSG_QUESTGIVER_ACCEPT_QUEST); p << rpg->guid(); @@ -232,7 +232,7 @@ Event RpgStartQuestAction::ActionEvent(Event event) std::string const RpgEndQuestAction::ActionName() { return "talk to quest giver"; } -Event RpgEndQuestAction::ActionEvent(Event event) +Event RpgEndQuestAction::ActionEvent(Event /*event*/) { WorldPacket p(CMSG_QUESTGIVER_COMPLETE_QUEST); p << rpg->guid(); @@ -242,17 +242,17 @@ Event RpgEndQuestAction::ActionEvent(Event event) std::string const RpgBuyAction::ActionName() { return "buy"; } -Event RpgBuyAction::ActionEvent(Event event) { return Event("rpg action", "vendor"); } +Event RpgBuyAction::ActionEvent(Event /*event*/) { return Event("rpg action", "vendor"); } std::string const RpgSellAction::ActionName() { return "sell"; } -Event RpgSellAction::ActionEvent(Event event) { return Event("rpg action", "vendor"); } +Event RpgSellAction::ActionEvent(Event /*event*/) { return Event("rpg action", "vendor"); } std::string const RpgRepairAction::ActionName() { return "repair"; } std::string const RpgTrainAction::ActionName() { return "trainer"; } -bool RpgHealAction::Execute(Event event) +bool RpgHealAction::Execute(Event /*event*/) { bool retVal = false; @@ -287,21 +287,21 @@ std::string const RpgBuyPetitionAction::ActionName() { return "buy petition"; } std::string const RpgUseAction::ActionName() { return "use"; } -Event RpgUseAction::ActionEvent(Event event) +Event RpgUseAction::ActionEvent(Event /*event*/) { return Event("rpg action", chat->FormatWorldobject(rpg->guidP().GetWorldObject())); } std::string const RpgSpellAction::ActionName() { return "cast random spell"; } -Event RpgSpellAction::ActionEvent(Event event) +Event RpgSpellAction::ActionEvent(Event /*event*/) { return Event("rpg action", chat->FormatWorldobject(rpg->guidP().GetWorldObject())); } std::string const RpgCraftAction::ActionName() { return "craft random item"; } -Event RpgCraftAction::ActionEvent(Event event) +Event RpgCraftAction::ActionEvent(Event /*event*/) { return Event("rpg action", chat->FormatWorldobject(rpg->guidP().GetWorldObject())); } @@ -341,7 +341,7 @@ std::vector RpgTradeUsefulAction::CanGiveItems(GuidPosition guidPosition) return giveItems; } -bool RpgTradeUsefulAction::Execute(Event event) +bool RpgTradeUsefulAction::Execute(Event /*event*/) { GuidPosition guidP = AI_VALUE(GuidPosition, "rpg target"); @@ -416,7 +416,7 @@ bool RpgDuelAction::isUseful() return true; } -bool RpgDuelAction::Execute(Event event) +bool RpgDuelAction::Execute(Event /*event*/) { GuidPosition guidP = AI_VALUE(GuidPosition, "rpg target"); @@ -434,7 +434,7 @@ bool RpgMountAnimAction::isUseful() return AI_VALUE2(bool, "mounted", "self target") && !AI_VALUE2(bool, "moving", "self target"); } -bool RpgMountAnimAction::Execute(Event event) +bool RpgMountAnimAction::Execute(Event /*event*/) { WorldPacket p; bot->GetSession()->HandleMountSpecialAnimOpcode(p); diff --git a/src/Ai/Base/Actions/RtiAction.cpp b/src/Ai/Base/Actions/RtiAction.cpp index b34b3eec3d5..807a59724dc 100644 --- a/src/Ai/Base/Actions/RtiAction.cpp +++ b/src/Ai/Base/Actions/RtiAction.cpp @@ -55,7 +55,7 @@ void RtiAction::AppendRti(std::ostringstream& out, std::string const type) out << " (" << target->GetName() << ")"; } -bool MarkRtiAction::Execute(Event event) +bool MarkRtiAction::Execute(Event /*event*/) { Group* group = bot->GetGroup(); if (!group) diff --git a/src/Ai/Base/Actions/SayAction.cpp b/src/Ai/Base/Actions/SayAction.cpp index 050d7ddbbaa..4505a76ef11 100644 --- a/src/Ai/Base/Actions/SayAction.cpp +++ b/src/Ai/Base/Actions/SayAction.cpp @@ -9,9 +9,7 @@ #include #include -#include "ChannelMgr.h" #include "Event.h" -#include "GuildMgr.h" #include "PlayerbotTextMgr.h" #include "Playerbots.h" @@ -56,7 +54,7 @@ static const std::unordered_set noReplyMsgStarts = {"e ", "accept " SayAction::SayAction(PlayerbotAI* botAI) : Action(botAI, "say"), Qualified() {} -bool SayAction::Execute(Event event) +bool SayAction::Execute(Event /*event*/) { std::string text = ""; std::map placeholders; @@ -92,7 +90,6 @@ bool SayAction::Execute(Event event) } // set delay before next say - time_t lastSaid = AI_VALUE2(time_t, "last said", qualifier); uint32 nextTime = time(nullptr) + urand(1, 30); botAI->GetAiObjectContext()->GetValue("last said", qualifier)->Set(nextTime); diff --git a/src/Ai/Base/Actions/SecurityCheckAction.cpp b/src/Ai/Base/Actions/SecurityCheckAction.cpp index ede59440e34..512d7357f81 100644 --- a/src/Ai/Base/Actions/SecurityCheckAction.cpp +++ b/src/Ai/Base/Actions/SecurityCheckAction.cpp @@ -14,7 +14,7 @@ bool SecurityCheckAction::isUseful() botAI->GetMaster()->GetSession()->GetSecurity() < SEC_GAMEMASTER && !GET_PLAYERBOT_AI(botAI->GetMaster()); } -bool SecurityCheckAction::Execute(Event event) +bool SecurityCheckAction::Execute(Event /*event*/) { if (Group* group = bot->GetGroup()) { diff --git a/src/Ai/Base/Actions/SeeSpellAction.cpp b/src/Ai/Base/Actions/SeeSpellAction.cpp index 03117586e42..f7d7eab2398 100644 --- a/src/Ai/Base/Actions/SeeSpellAction.cpp +++ b/src/Ai/Base/Actions/SeeSpellAction.cpp @@ -7,7 +7,6 @@ #include "Event.h" #include "Formations.h" -#include "PathGenerator.h" #include "Playerbots.h" #include "RTSCValues.h" #include "RtscAction.h" diff --git a/src/Ai/Base/Actions/SetCraftAction.cpp b/src/Ai/Base/Actions/SetCraftAction.cpp index f062ce5c236..f8682c45ebb 100644 --- a/src/Ai/Base/Actions/SetCraftAction.cpp +++ b/src/Ai/Base/Actions/SetCraftAction.cpp @@ -49,9 +49,7 @@ bool SetCraftAction::Execute(Event event) if (skillSpells.empty()) { for (SkillLineAbilityEntry const* skillLine : sSkillLineAbilityStore) - { skillSpells[skillLine->Spell] = skillLine; - } } data.required.clear(); @@ -78,9 +76,7 @@ bool SetCraftAction::Execute(Event event) for (uint32 x = 0; x < MAX_SPELL_REAGENTS; ++x) { if (spellInfo->Reagent[x] <= 0) - { continue; - } uint32 itemid = spellInfo->Reagent[x]; uint32 reagentsRequired = spellInfo->ReagentCount[x]; @@ -132,9 +128,8 @@ void SetCraftAction::TellCraft() if (ItemTemplate const* reagent = sObjectMgr->GetItemTemplate(item)) { if (first) - { first = false; - } + else out << ", "; @@ -142,9 +137,7 @@ void SetCraftAction::TellCraft() uint32 given = data.obtained[item]; if (given) - { out << "|cffffff00(x" << given << " given)|r "; - } } } diff --git a/src/Ai/Base/Actions/SetHomeAction.cpp b/src/Ai/Base/Actions/SetHomeAction.cpp index 44f3c7b49f2..0fa2ef50b4c 100644 --- a/src/Ai/Base/Actions/SetHomeAction.cpp +++ b/src/Ai/Base/Actions/SetHomeAction.cpp @@ -8,7 +8,7 @@ #include "Event.h" #include "Playerbots.h" -bool SetHomeAction::Execute(Event event) +bool SetHomeAction::Execute(Event /*event*/) { Player* master = GetMaster(); diff --git a/src/Ai/Base/Actions/StatsAction.cpp b/src/Ai/Base/Actions/StatsAction.cpp index f6872c84681..aaf8d1bd134 100644 --- a/src/Ai/Base/Actions/StatsAction.cpp +++ b/src/Ai/Base/Actions/StatsAction.cpp @@ -7,9 +7,9 @@ #include "ChatHelper.h" #include "Event.h" -#include "Playerbots.h" +#include "PlayerbotAI.h" -bool StatsAction::Execute(Event event) +bool StatsAction::Execute(Event /*event*/) { std::ostringstream out; diff --git a/src/Ai/Base/Actions/StayActions.cpp b/src/Ai/Base/Actions/StayActions.cpp index dbc7abd0907..ad10e899072 100644 --- a/src/Ai/Base/Actions/StayActions.cpp +++ b/src/Ai/Base/Actions/StayActions.cpp @@ -39,7 +39,7 @@ bool StayActionBase::Stay() return true; } -bool StayAction::Execute(Event event) { return Stay(); } +bool StayAction::Execute(Event /*event*/) { return Stay(); } bool StayAction::isUseful() { @@ -49,9 +49,7 @@ bool StayAction::isUseful() { const float distance = bot->GetDistance(stayPosition.x, stayPosition.y, stayPosition.z); if (sPlayerbotAIConfig.followDistance) - { return false; - } } // move from group takes priority over stay as it's added and removed automatically @@ -64,7 +62,7 @@ bool StayAction::isUseful() return AI_VALUE2(bool, "moving", "self target"); } -bool SitAction::Execute(Event event) +bool SitAction::Execute(Event /*event*/) { if (bot->isMoving()) return false; diff --git a/src/Ai/Base/Actions/SuggestWhatToDoAction.cpp b/src/Ai/Base/Actions/SuggestWhatToDoAction.cpp index 9012443beb2..5bd19114068 100644 --- a/src/Ai/Base/Actions/SuggestWhatToDoAction.cpp +++ b/src/Ai/Base/Actions/SuggestWhatToDoAction.cpp @@ -7,25 +7,19 @@ #include "SuggestWhatToDoAction.h" #include "ServerFacade.h" -#include "ChannelMgr.h" #include "Event.h" #include "ItemVisitors.h" #include "AiFactory.h" #include "ChatHelper.h" #include "Playerbots.h" -#include "PlayerbotTextMgr.h" -#include "Config.h" #include "BroadcastHelper.h" #include "AiFactory.h" -#include "ChannelMgr.h" #include "ChatHelper.h" -#include "Config.h" #include "Event.h" -#include "GuildMgr.h" #include "ItemVisitors.h" -#include "PlayerbotTextMgr.h" #include "Playerbots.h" #include "ServerFacade.h" +#include "Channel.h" enum eTalkType { @@ -62,7 +56,7 @@ bool SuggestWhatToDoAction::isUseful() return (time(0) - lastSaid) > 30; } -bool SuggestWhatToDoAction::Execute(Event event) +bool SuggestWhatToDoAction::Execute(Event /*event*/) { uint32 index = rand() % suggestions.size(); auto fnct_ptr = suggestions[index]; @@ -258,7 +252,7 @@ class FindTradeItemsVisitor : public IterateItemsVisitor SuggestDungeonAction::SuggestDungeonAction(PlayerbotAI* botAI) : SuggestWhatToDoAction(botAI, "suggest dungeon") {} -bool SuggestDungeonAction::Execute(Event event) +bool SuggestDungeonAction::Execute(Event /*event*/) { // TODO: use PlayerbotDungeonRepository::instance() @@ -325,7 +319,7 @@ bool SuggestDungeonAction::Execute(Event event) SuggestTradeAction::SuggestTradeAction(PlayerbotAI* botAI) : SuggestWhatToDoAction(botAI, "suggest trade") {} -bool SuggestTradeAction::Execute(Event event) +bool SuggestTradeAction::Execute(Event /*event*/) { uint32 quality = urand(0, 100); if (quality > 95) diff --git a/src/Ai/Base/Actions/TameAction.cpp b/src/Ai/Base/Actions/TameAction.cpp index 5b3eda1034a..e968a0b01be 100644 --- a/src/Ai/Base/Actions/TameAction.cpp +++ b/src/Ai/Base/Actions/TameAction.cpp @@ -6,12 +6,10 @@ #include "TameAction.h" #include #include -#include #include #include #include #include "DBCStructure.h" -#include "Log.h" #include "ObjectMgr.h" #include "Pet.h" #include "Player.h" diff --git a/src/Ai/Base/Actions/TeleportAction.cpp b/src/Ai/Base/Actions/TeleportAction.cpp index 65aa24e09f7..b981decbf17 100644 --- a/src/Ai/Base/Actions/TeleportAction.cpp +++ b/src/Ai/Base/Actions/TeleportAction.cpp @@ -7,9 +7,12 @@ #include "Event.h" #include "LastMovementValue.h" -#include "Playerbots.h" +#include "AiObjectContext.h" +#include "PlayerbotAI.h" +#include "SpellMgr.h" +#include "Spell.h" -bool TeleportAction::Execute(Event event) +bool TeleportAction::Execute(Event /*event*/) { /* // List of allowed portal entries (you can populate this dynamically) @@ -74,7 +77,7 @@ bool TeleportAction::Execute(Event event) continue; uint32 spellId = goInfo->spellcaster.spellId; - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId); + SpellInfo const* spellInfo = SpellMgr::instance()->GetSpellInfo(spellId); if (!spellInfo || !spellInfo->HasEffect(SPELL_EFFECT_TELEPORT_UNITS)) continue; diff --git a/src/Ai/Base/Actions/TellLosAction.cpp b/src/Ai/Base/Actions/TellLosAction.cpp index 13852bdc0ac..3d18c5826f0 100644 --- a/src/Ai/Base/Actions/TellLosAction.cpp +++ b/src/Ai/Base/Actions/TellLosAction.cpp @@ -4,11 +4,9 @@ */ #include "TellLosAction.h" -#include #include #include "ChatHelper.h" -#include "DBCStores.h" #include "Event.h" #include "ItemTemplate.h" #include "ObjectMgr.h" @@ -77,7 +75,7 @@ void TellLosAction::ListGameObjects(std::string const title, GuidVector gos) } } -bool TellAuraAction::Execute(Event event) +bool TellAuraAction::Execute(Event /*event*/) { botAI->TellMaster("--- Auras ---"); sLog->outMessage("playerbot", LOG_LEVEL_DEBUG, "--- Auras ---"); @@ -130,7 +128,7 @@ bool TellAuraAction::Execute(Event event) return true; } -bool TellEstimatedDpsAction::Execute(Event event) +bool TellEstimatedDpsAction::Execute(Event /*event*/) { float dps = AI_VALUE(float, "estimated group dps"); botAI->TellMaster("Estimated Group DPS: " + std::to_string(dps)); diff --git a/src/Ai/Base/Actions/TellMasterAction.cpp b/src/Ai/Base/Actions/TellMasterAction.cpp index 4b8d96d5617..6156ce08191 100644 --- a/src/Ai/Base/Actions/TellMasterAction.cpp +++ b/src/Ai/Base/Actions/TellMasterAction.cpp @@ -8,13 +8,13 @@ #include "Event.h" #include "Playerbots.h" -bool TellMasterAction::Execute(Event event) +bool TellMasterAction::Execute(Event /*event*/) { botAI->TellMaster(text); return true; } -bool OutOfReactRangeAction::Execute(Event event) +bool OutOfReactRangeAction::Execute(Event /*event*/) { botAI->TellMaster("Wait for me!"); return true; diff --git a/src/Ai/Base/Actions/TellReputationAction.cpp b/src/Ai/Base/Actions/TellReputationAction.cpp index e08a38d8406..0ccff606a22 100644 --- a/src/Ai/Base/Actions/TellReputationAction.cpp +++ b/src/Ai/Base/Actions/TellReputationAction.cpp @@ -6,10 +6,10 @@ #include "TellReputationAction.h" #include "Event.h" -#include "Playerbots.h" +#include "PlayerbotAI.h" #include "ReputationMgr.h" -bool TellReputationAction::Execute(Event event) +bool TellReputationAction::Execute(Event /*event*/) { Player* master = GetMaster(); if (!master) diff --git a/src/Ai/Base/Actions/TellTargetAction.cpp b/src/Ai/Base/Actions/TellTargetAction.cpp index 7ecd8efb5a3..422d5e542a4 100644 --- a/src/Ai/Base/Actions/TellTargetAction.cpp +++ b/src/Ai/Base/Actions/TellTargetAction.cpp @@ -6,10 +6,11 @@ #include "TellTargetAction.h" #include "Event.h" -#include "Playerbots.h" #include "ThreatMgr.h" +#include "AiObjectContext.h" +#include "PlayerbotAI.h" -bool TellTargetAction::Execute(Event event) +bool TellTargetAction::Execute(Event /*event*/) { Unit* target = context->GetValue("current target")->Get(); if (target) @@ -24,7 +25,7 @@ bool TellTargetAction::Execute(Event event) return true; } -bool TellAttackersAction::Execute(Event event) +bool TellAttackersAction::Execute(Event /*event*/) { botAI->TellMaster("--- Attackers ---"); diff --git a/src/Ai/Base/Actions/TradeAction.cpp b/src/Ai/Base/Actions/TradeAction.cpp index b6f6912be23..810710abbf5 100644 --- a/src/Ai/Base/Actions/TradeAction.cpp +++ b/src/Ai/Base/Actions/TradeAction.cpp @@ -8,7 +8,7 @@ #include "Event.h" #include "ItemCountValue.h" #include "ItemVisitors.h" -#include "Playerbots.h" +#include "PlayerbotAI.h" bool TradeAction::Execute(Event event) { @@ -106,9 +106,7 @@ bool TradeAction::TradeItem(Item const* item, int8 slot) for (uint8 i = 0; i < TRADE_SLOT_TRADED_COUNT && tradeSlot == -1; i++) { if (pTrade->GetItem(TradeSlots(i)) == nullptr) - { tradeSlot = i; - } } } diff --git a/src/Ai/Base/Actions/TradeStatusAction.cpp b/src/Ai/Base/Actions/TradeStatusAction.cpp index 3057fff0977..1c6ffc8eede 100644 --- a/src/Ai/Base/Actions/TradeStatusAction.cpp +++ b/src/Ai/Base/Actions/TradeStatusAction.cpp @@ -276,14 +276,11 @@ bool TradeStatusAction::CheckTrade() botAI->PlaySound(TEXT_EMOTE_NO); return false; } - success = true; } } else - { success = true; - } if (success) { @@ -340,9 +337,7 @@ int32 TradeStatusAction::CalculateCost(Player* player, bool sell) if (!craftData.IsEmpty()) { if (player == trader && !sell && craftData.IsRequired(proto->ItemId)) - { continue; - } if (player == bot && sell && craftData.itemId == proto->ItemId && craftData.IsFulfilled()) { @@ -352,13 +347,11 @@ int32 TradeStatusAction::CalculateCost(Player* player, bool sell) } if (sell) - { sum += item->GetCount() * proto->SellPrice * sRandomPlayerbotMgr.GetSellMultiplier(bot); - } + else - { sum += item->GetCount() * proto->BuyPrice * sRandomPlayerbotMgr.GetBuyMultiplier(bot); - } + } return sum; diff --git a/src/Ai/Base/Actions/TrainerAction.cpp b/src/Ai/Base/Actions/TrainerAction.cpp index e377fa3eb28..0f32560994c 100644 --- a/src/Ai/Base/Actions/TrainerAction.cpp +++ b/src/Ai/Base/Actions/TrainerAction.cpp @@ -155,7 +155,7 @@ void TrainerAction::TellFooter(uint32 totalCost) } } -bool MaintenanceAction::Execute(Event event) +bool MaintenanceAction::Execute(Event /*event*/) { if (!sPlayerbotAIConfig.maintenanceCommand) { @@ -255,7 +255,7 @@ bool MaintenanceAction::Execute(Event event) return true; } -bool RemoveGlyphAction::Execute(Event event) +bool RemoveGlyphAction::Execute(Event /*event*/) { for (uint32 slotIndex = 0; slotIndex < MAX_GLYPH_SLOT_INDEX; ++slotIndex) { @@ -265,7 +265,7 @@ bool RemoveGlyphAction::Execute(Event event) return true; } -bool AutoGearAction::Execute(Event event) +bool AutoGearAction::Execute(Event /*event*/) { if (!sPlayerbotAIConfig.autoGearCommand) { diff --git a/src/Ai/Base/Actions/TravelAction.cpp b/src/Ai/Base/Actions/TravelAction.cpp index f0afef01bf5..3516426ce83 100644 --- a/src/Ai/Base/Actions/TravelAction.cpp +++ b/src/Ai/Base/Actions/TravelAction.cpp @@ -10,7 +10,7 @@ #include "GridNotifiersImpl.h" #include "Playerbots.h" -bool TravelAction::Execute(Event event) +bool TravelAction::Execute(Event /*event*/) { TravelTarget* target = AI_VALUE(TravelTarget*, "travel target"); @@ -60,12 +60,14 @@ bool TravelAction::isUseful() (!AI_VALUE(GuidPosition, "rpg target") || !AI_VALUE(ObjectGuid, "pull target")); } -bool MoveToDarkPortalAction::Execute(Event event) +bool MoveToDarkPortalAction::Execute(Event /*event*/) { if (bot->GetGroup()) + { if (bot->GetGroup()->GetLeaderGUID() != bot->GetGUID() && !GET_PLAYERBOT_AI(GET_PLAYERBOT_AI(bot)->GetGroupLeader())) return false; + } if (bot->GetLevel() > 57) { @@ -111,7 +113,7 @@ bool MoveToDarkPortalAction::Execute(Event event) bool MoveToDarkPortalAction::isUseful() { return bot->GetLevel() > 54; } -bool DarkPortalAzerothAction::Execute(Event event) +bool DarkPortalAzerothAction::Execute(Event /*event*/) { if (bot->GetLevel() > 57) { @@ -126,7 +128,7 @@ bool DarkPortalAzerothAction::Execute(Event event) bool DarkPortalAzerothAction::isUseful() { return bot->GetLevel() > 57; } -bool MoveFromDarkPortalAction::Execute(Event event) +bool MoveFromDarkPortalAction::Execute(Event /*event*/) { RESET_AI_VALUE(GuidPosition, "rpg target"); diff --git a/src/Ai/Base/Actions/UnlockItemAction.cpp b/src/Ai/Base/Actions/UnlockItemAction.cpp index 367a4fcbfb6..7a4b3bd1774 100644 --- a/src/Ai/Base/Actions/UnlockItemAction.cpp +++ b/src/Ai/Base/Actions/UnlockItemAction.cpp @@ -1,14 +1,13 @@ #include "UnlockItemAction.h" #include "PlayerbotAI.h" #include "ItemTemplate.h" -#include "WorldPacket.h" #include "Player.h" #include "ObjectMgr.h" #include "SpellInfo.h" -#define PICK_LOCK_SPELL_ID 1804 +inline constexpr uint32_t PICK_LOCK_SPELL_ID = 1804; -bool UnlockItemAction::Execute(Event event) +bool UnlockItemAction::Execute(Event /*event*/) { bool foundLockedItem = false; @@ -32,7 +31,5 @@ void UnlockItemAction::UnlockItem(Item* item) botAI->TellMaster(out.str()); } else - { botAI->TellError("Failed to cast Pick Lock."); - } } diff --git a/src/Ai/Base/Actions/UnlockTradedItemAction.cpp b/src/Ai/Base/Actions/UnlockTradedItemAction.cpp index 047cd2e201b..90cdbfb02bd 100644 --- a/src/Ai/Base/Actions/UnlockTradedItemAction.cpp +++ b/src/Ai/Base/Actions/UnlockTradedItemAction.cpp @@ -1,11 +1,11 @@ #include "UnlockTradedItemAction.h" -#include "Playerbots.h" +#include "PlayerbotAI.h" #include "TradeData.h" #include "SpellInfo.h" -#define PICK_LOCK_SPELL_ID 1804 +inline constexpr uint32_t PICK_LOCK_SPELL_ID = 1804; -bool UnlockTradedItemAction::Execute(Event event) +bool UnlockTradedItemAction::Execute(Event /*event*/) { Player* trader = bot->GetTrader(); if (!trader) diff --git a/src/Ai/Base/Actions/UseItemAction.cpp b/src/Ai/Base/Actions/UseItemAction.cpp index 77c865dba86..3483986f935 100644 --- a/src/Ai/Base/Actions/UseItemAction.cpp +++ b/src/Ai/Base/Actions/UseItemAction.cpp @@ -416,7 +416,7 @@ bool UseHearthStone::Execute(Event event) bool UseHearthStone::isUseful() { return !bot->InBattleground(); } -bool UseRandomRecipe::Execute(Event event) +bool UseRandomRecipe::Execute(Event /*event*/) { std::vector recipes = AI_VALUE2(std::vector, "inventory items", "recipe"); @@ -445,7 +445,7 @@ bool UseRandomRecipe::isUseful() bool UseRandomRecipe::isPossible() { return AI_VALUE2(uint32, "item count", "recipe") > 0; } -bool UseRandomQuestItem::Execute(Event event) +bool UseRandomQuestItem::Execute(Event /*event*/) { Unit* unitTarget = nullptr; ObjectGuid goTarget; diff --git a/src/Ai/Base/Actions/UseMeetingStoneAction.cpp b/src/Ai/Base/Actions/UseMeetingStoneAction.cpp index b334429189d..0862be68f32 100644 --- a/src/Ai/Base/Actions/UseMeetingStoneAction.cpp +++ b/src/Ai/Base/Actions/UseMeetingStoneAction.cpp @@ -55,16 +55,14 @@ bool UseMeetingStoneAction::Execute(Event event) return Teleport(master, bot, false); } -bool SummonAction::Execute(Event event) +bool SummonAction::Execute(Event /*event*/) { Player* master = GetMaster(); if (!master) return false; if (Pet* pet = bot->GetPet()) - { botAI->PetFollow(); - } if (master->GetSession()->GetSecurity() >= SEC_PLAYER) { diff --git a/src/Ai/Base/Actions/VehicleActions.cpp b/src/Ai/Base/Actions/VehicleActions.cpp index ac925fbcb1a..71963690daa 100644 --- a/src/Ai/Base/Actions/VehicleActions.cpp +++ b/src/Ai/Base/Actions/VehicleActions.cpp @@ -95,7 +95,7 @@ bool EnterVehicleAction::EnterVehicle(Unit* vehicleBase, bool moveIfFar) return true; } -bool LeaveVehicleAction::Execute(Event event) +bool LeaveVehicleAction::Execute(Event /*event*/) { Vehicle* myVehicle = bot->GetVehicle(); if (!myVehicle) diff --git a/src/Ai/Base/Strategy/ChatCommandHandlerStrategy.cpp b/src/Ai/Base/Strategy/ChatCommandHandlerStrategy.cpp index 04f7979012d..f67ae49ca73 100644 --- a/src/Ai/Base/Strategy/ChatCommandHandlerStrategy.cpp +++ b/src/Ai/Base/Strategy/ChatCommandHandlerStrategy.cpp @@ -5,8 +5,6 @@ #include "ChatCommandHandlerStrategy.h" -#include "Playerbots.h" - class ChatCommandActionNodeFactoryInternal : public NamedObjectFactory { public: diff --git a/src/Ai/Base/Strategy/CombatStrategy.cpp b/src/Ai/Base/Strategy/CombatStrategy.cpp index 75700e9a6df..62972d4b1d9 100644 --- a/src/Ai/Base/Strategy/CombatStrategy.cpp +++ b/src/Ai/Base/Strategy/CombatStrategy.cpp @@ -5,7 +5,6 @@ #include "CombatStrategy.h" -#include "Playerbots.h" #include "Strategy.h" void CombatStrategy::InitTriggers(std::vector& triggers) diff --git a/src/Ai/Base/Strategy/DuelStrategy.cpp b/src/Ai/Base/Strategy/DuelStrategy.cpp index 4c08397e6b3..c7f7e9d2355 100644 --- a/src/Ai/Base/Strategy/DuelStrategy.cpp +++ b/src/Ai/Base/Strategy/DuelStrategy.cpp @@ -5,8 +5,6 @@ #include "DuelStrategy.h" -#include "Playerbots.h" - void DuelStrategy::InitTriggers(std::vector& triggers) { PassTroughStrategy::InitTriggers(triggers); diff --git a/src/Ai/Base/Strategy/FollowMasterStrategy.cpp b/src/Ai/Base/Strategy/FollowMasterStrategy.cpp index 0308b113f93..6701fdcac2e 100644 --- a/src/Ai/Base/Strategy/FollowMasterStrategy.cpp +++ b/src/Ai/Base/Strategy/FollowMasterStrategy.cpp @@ -5,8 +5,6 @@ #include "FollowMasterStrategy.h" -#include "Playerbots.h" - std::vector FollowMasterStrategy::getDefaultActions() { return { diff --git a/src/Ai/Base/Strategy/GuardStrategy.cpp b/src/Ai/Base/Strategy/GuardStrategy.cpp index 9a396ac57fd..96017365f88 100644 --- a/src/Ai/Base/Strategy/GuardStrategy.cpp +++ b/src/Ai/Base/Strategy/GuardStrategy.cpp @@ -5,8 +5,6 @@ #include "GuardStrategy.h" -#include "Playerbots.h" - std::vector GuardStrategy::getDefaultActions() { return { diff --git a/src/Ai/Base/Strategy/NonCombatStrategy.cpp b/src/Ai/Base/Strategy/NonCombatStrategy.cpp index 6b8f76ac951..136dcc53e74 100644 --- a/src/Ai/Base/Strategy/NonCombatStrategy.cpp +++ b/src/Ai/Base/Strategy/NonCombatStrategy.cpp @@ -5,8 +5,6 @@ #include "NonCombatStrategy.h" -#include "Playerbots.h" - void NonCombatStrategy::InitTriggers(std::vector& triggers) { triggers.push_back(new TriggerNode("random", { NextAction("clean quest log", 1.0f) })); diff --git a/src/Ai/Base/Strategy/RTSCStrategy.cpp b/src/Ai/Base/Strategy/RTSCStrategy.cpp index 2c64092e3ce..525338c156d 100644 --- a/src/Ai/Base/Strategy/RTSCStrategy.cpp +++ b/src/Ai/Base/Strategy/RTSCStrategy.cpp @@ -5,8 +5,6 @@ #include "RTSCStrategy.h" -#include "Playerbots.h" - RTSCStrategy::RTSCStrategy(PlayerbotAI* botAI) : Strategy(botAI) {} void RTSCStrategy::InitTriggers(std::vector& triggers) {} diff --git a/src/Ai/Base/Strategy/RacialsStrategy.cpp b/src/Ai/Base/Strategy/RacialsStrategy.cpp index f4f270b1b05..dc6d5bc4820 100644 --- a/src/Ai/Base/Strategy/RacialsStrategy.cpp +++ b/src/Ai/Base/Strategy/RacialsStrategy.cpp @@ -5,8 +5,6 @@ #include "RacialsStrategy.h" -#include "Playerbots.h" - class RacialsStrategyActionNodeFactory : public NamedObjectFactory { public: diff --git a/src/Ai/Base/Strategy/UsePotionsStrategy.cpp b/src/Ai/Base/Strategy/UsePotionsStrategy.cpp index b0e00492691..55827fbd201 100644 --- a/src/Ai/Base/Strategy/UsePotionsStrategy.cpp +++ b/src/Ai/Base/Strategy/UsePotionsStrategy.cpp @@ -5,8 +5,6 @@ #include "UsePotionsStrategy.h" -#include "Playerbots.h" - class UsePotionsStrategyActionNodeFactory : public NamedObjectFactory { public: diff --git a/src/Ai/Base/Trigger/GenericTriggers.cpp b/src/Ai/Base/Trigger/GenericTriggers.cpp index a933bc232d9..209766be73c 100644 --- a/src/Ai/Base/Trigger/GenericTriggers.cpp +++ b/src/Ai/Base/Trigger/GenericTriggers.cpp @@ -7,9 +7,7 @@ #include -#include "BattlegroundWS.h" #include "CreatureAI.h" -#include "GameTime.h" #include "ItemVisitors.h" #include "LastSpellCastValue.h" #include "ObjectGuid.h" diff --git a/src/Ai/Base/Trigger/RangeTriggers.cpp b/src/Ai/Base/Trigger/RangeTriggers.cpp index 2acc2aec85e..01a4d0f617c 100644 --- a/src/Ai/Base/Trigger/RangeTriggers.cpp +++ b/src/Ai/Base/Trigger/RangeTriggers.cpp @@ -201,7 +201,6 @@ bool PartyMemberToHealOutOfSpellRangeTrigger::IsActive() if (!target) return false; - float combatReach = bot->GetCombatReach() + target->GetCombatReach(); return target && (ServerFacade::instance().GetDistance2d(bot, target) > (distance + sPlayerbotAIConfig.contactDistance) || !bot->IsWithinLOSInMap(target)); } diff --git a/src/Ai/Base/Value/Arrow.cpp b/src/Ai/Base/Value/Arrow.cpp index 5fd710220c5..114b2c058de 100644 --- a/src/Ai/Base/Value/Arrow.cpp +++ b/src/Ai/Base/Value/Arrow.cpp @@ -6,7 +6,8 @@ #include "Arrow.h" #include "Map.h" -#include "Playerbots.h" +#include "PlayerbotAI.h" +#include "Group.h" WorldLocation ArrowFormation::GetLocationInternal() { diff --git a/src/Ai/Base/Value/CcTargetValue.cpp b/src/Ai/Base/Value/CcTargetValue.cpp index 1c305aec3cd..0559656f7a1 100644 --- a/src/Ai/Base/Value/CcTargetValue.cpp +++ b/src/Ai/Base/Value/CcTargetValue.cpp @@ -6,7 +6,9 @@ #include "CcTargetValue.h" #include "Action.h" -#include "Playerbots.h" +#include "AiObjectContext.h" +#include "Group.h" +#include "PlayerbotAI.h" #include "ServerFacade.h" class FindTargetForCcStrategy : public FindTargetStrategy diff --git a/src/Ai/Base/Value/CurrentCcTargetValue.cpp b/src/Ai/Base/Value/CurrentCcTargetValue.cpp index 27b81002648..97f35c1b553 100644 --- a/src/Ai/Base/Value/CurrentCcTargetValue.cpp +++ b/src/Ai/Base/Value/CurrentCcTargetValue.cpp @@ -4,8 +4,7 @@ */ #include "CurrentCcTargetValue.h" - -#include "Playerbots.h" +#include "PlayerbotAI.h" class FindCurrentCcTargetStrategy : public FindTargetStrategy { diff --git a/src/Ai/Base/Value/DpsTargetValue.cpp b/src/Ai/Base/Value/DpsTargetValue.cpp index 1a813c99407..28f308471f4 100644 --- a/src/Ai/Base/Value/DpsTargetValue.cpp +++ b/src/Ai/Base/Value/DpsTargetValue.cpp @@ -29,7 +29,6 @@ class FindMaxThreatGapTargetStrategy : public FindTargetStrategy foundHighPriority = true; return; } - Unit* victim = attacker->GetVictim(); if (!result || CalcThreatGap(attacker, threatMgr) > CalcThreatGap(result, &result->GetThreatMgr())) result = attacker; } @@ -144,7 +143,7 @@ class GeneralFindTargetSmartStrategy : public FindTargetStrategy { } - void CheckAttacker(Unit* attacker, ThreatMgr* threatMgr) override + void CheckAttacker(Unit* attacker, ThreatMgr*) override { if (Group* group = botAI->GetBot()->GetGroup()) { @@ -195,7 +194,6 @@ class GeneralFindTargetSmartStrategy : public FindTargetStrategy } int32_t GetIntervalLevel(Unit* unit) { - float time = unit->GetHealth() / dps_; float dis = unit->GetDistance(botAI->GetBot()); float attackRange = botAI->IsRanged(botAI->GetBot()) ? sPlayerbotAIConfig.spellDistance : sPlayerbotAIConfig.meleeDistance; @@ -218,7 +216,7 @@ class ComboFindTargetSmartStrategy : public FindTargetStrategy { } - void CheckAttacker(Unit* attacker, ThreatMgr* threatMgr) override + void CheckAttacker(Unit* attacker, ThreatMgr*) override { if (Group* group = botAI->GetBot()->GetGroup()) { @@ -276,7 +274,6 @@ class ComboFindTargetSmartStrategy : public FindTargetStrategy } int32_t GetIntervalLevel(Unit* unit) { - float time = unit->GetHealth() / dps_; float dis = unit->GetDistance(botAI->GetBot()); float attackRange = botAI->IsRanged(botAI->GetBot()) ? sPlayerbotAIConfig.spellDistance : sPlayerbotAIConfig.meleeDistance; @@ -322,7 +319,7 @@ class FindMaxHpTargetStrategy : public FindTargetStrategy public: FindMaxHpTargetStrategy(PlayerbotAI* botAI) : FindTargetStrategy(botAI), maxHealth(0) {} - void CheckAttacker(Unit* attacker, ThreatMgr* threatMgr) override + void CheckAttacker(Unit* attacker, ThreatMgr*) override { if (Group* group = botAI->GetBot()->GetGroup()) { diff --git a/src/Ai/Base/Value/ItemCountValue.cpp b/src/Ai/Base/Value/ItemCountValue.cpp index 2c719d8f4d1..9ea7da2e066 100644 --- a/src/Ai/Base/Value/ItemCountValue.cpp +++ b/src/Ai/Base/Value/ItemCountValue.cpp @@ -5,7 +5,7 @@ #include "ItemCountValue.h" -#include "Playerbots.h" +#include "PlayerbotAI.h" std::vector InventoryItemValueBase::Find(std::string const qualifier) { @@ -25,9 +25,7 @@ uint32 ItemCountValue::Calculate() uint32 count = 0; std::vector items = Find(qualifier); for (Item* item : items) - { count += item->GetCount(); - } return count; } diff --git a/src/Ai/Base/Value/LastMovementValue.cpp b/src/Ai/Base/Value/LastMovementValue.cpp index ba54020e397..22c35450d5e 100644 --- a/src/Ai/Base/Value/LastMovementValue.cpp +++ b/src/Ai/Base/Value/LastMovementValue.cpp @@ -5,7 +5,6 @@ #include "LastMovementValue.h" -#include "Playerbots.h" #include "Timer.h" LastMovement::LastMovement() { clear(); } diff --git a/src/Ai/Base/Value/LeastHpTargetValue.cpp b/src/Ai/Base/Value/LeastHpTargetValue.cpp index 8b9f1a55fce..423db1de9c2 100644 --- a/src/Ai/Base/Value/LeastHpTargetValue.cpp +++ b/src/Ai/Base/Value/LeastHpTargetValue.cpp @@ -6,7 +6,7 @@ #include "LeastHpTargetValue.h" #include "AttackersValue.h" -#include "Playerbots.h" +#include "PlayerbotAI.h" class FindLeastHpTargetStrategy : public FindNonCcTargetStrategy { diff --git a/src/Ai/Base/Value/LogLevelValue.h b/src/Ai/Base/Value/LogLevelValue.h index 18fdbddcee3..f8515b13b27 100644 --- a/src/Ai/Base/Value/LogLevelValue.h +++ b/src/Ai/Base/Value/LogLevelValue.h @@ -6,6 +6,7 @@ #ifndef _PLAYERBOT_LOGLEVELVALUE_H #define _PLAYERBOT_LOGLEVELVALUE_H +#include "LogCommon.h" #include "Value.h" class PlayerbotAI; diff --git a/src/Ai/Base/Value/NearestCorpsesValue.cpp b/src/Ai/Base/Value/NearestCorpsesValue.cpp index fec1aed21f2..6091c32419c 100644 --- a/src/Ai/Base/Value/NearestCorpsesValue.cpp +++ b/src/Ai/Base/Value/NearestCorpsesValue.cpp @@ -8,7 +8,6 @@ #include "CellImpl.h" #include "GridNotifiers.h" #include "GridNotifiersImpl.h" -#include "Playerbots.h" class AnyDeadUnitInObjectRangeCheck { diff --git a/src/Ai/Base/Value/PartyMemberToDispel.cpp b/src/Ai/Base/Value/PartyMemberToDispel.cpp index 91b1955b27b..d3bf4e9ab95 100644 --- a/src/Ai/Base/Value/PartyMemberToDispel.cpp +++ b/src/Ai/Base/Value/PartyMemberToDispel.cpp @@ -4,8 +4,7 @@ */ #include "PartyMemberToDispel.h" - -#include "Playerbots.h" +#include "PlayerbotAI.h" class PartyMemberToDispelPredicate : public FindPlayerPredicate, public PlayerbotAIAware { diff --git a/src/Ai/Base/Value/PartyMemberValue.cpp b/src/Ai/Base/Value/PartyMemberValue.cpp index 74774290946..53a93b2b43d 100644 --- a/src/Ai/Base/Value/PartyMemberValue.cpp +++ b/src/Ai/Base/Value/PartyMemberValue.cpp @@ -6,8 +6,11 @@ #include "PartyMemberValue.h" #include "Corpse.h" -#include "Playerbots.h" +#include "Group.h" +#include "PlayerbotAI.h" #include "ServerFacade.h" +#include "Pet.h" +#include "Spell.h" Unit* PartyMemberValue::FindPartyMember(std::vector* party, FindPlayerPredicate& predicate) { diff --git a/src/Ai/Base/Value/PartyMemberWithoutItemValue.h b/src/Ai/Base/Value/PartyMemberWithoutItemValue.h index 2918ea4c572..379835543e9 100644 --- a/src/Ai/Base/Value/PartyMemberWithoutItemValue.h +++ b/src/Ai/Base/Value/PartyMemberWithoutItemValue.h @@ -8,7 +8,6 @@ #include "NamedObjectContext.h" #include "PartyMemberValue.h" -#include "PlayerbotAIConfig.h" class PlayerbotAI; class Unit; @@ -16,8 +15,7 @@ class Unit; class PartyMemberWithoutItemValue : public PartyMemberValue, public Qualified { public: - PartyMemberWithoutItemValue(PlayerbotAI* botAI, std::string const name = "party member without item", - float range = sPlayerbotAIConfig.farDistance) + PartyMemberWithoutItemValue(PlayerbotAI* botAI, std::string const name = "party member without item") : PartyMemberValue(botAI, name) { } diff --git a/src/Ai/Base/Value/PossibleRpgTargetsValue.cpp b/src/Ai/Base/Value/PossibleRpgTargetsValue.cpp index f2b6aef105d..fbcb8fb2d43 100644 --- a/src/Ai/Base/Value/PossibleRpgTargetsValue.cpp +++ b/src/Ai/Base/Value/PossibleRpgTargetsValue.cpp @@ -5,14 +5,15 @@ #include "PossibleRpgTargetsValue.h" -#include "CellImpl.h" -#include "GridNotifiers.h" -#include "GridNotifiersImpl.h" +#include "AiObjectContext.h" #include "ObjectGuid.h" -#include "Playerbots.h" #include "ServerFacade.h" #include "SharedDefines.h" #include "NearestGameObjects.h" +#include "GridNotifiers.h" +#include "GridNotifiersImpl.h" +#include "CellImpl.h" +#include "TravelMgr.h" std::vector PossibleRpgTargetsValue::allowedNpcFlags; @@ -73,9 +74,15 @@ bool PossibleRpgTargetsValue::AcceptUnit(Unit* unit) } TravelTarget* travelTarget = context->GetValue("travel target")->Get(); - if (travelTarget && travelTarget->getDestination() && - travelTarget->getDestination()->getEntry() == unit->GetEntry()) + + if ( + travelTarget != nullptr + && travelTarget->getDestination() + && (uint32_t)travelTarget->getDestination()->getEntry() == unit->GetEntry() + ) + { return true; + } if (urand(1, 100) < 25 && unit->IsFriendlyTo(bot)) return true; diff --git a/src/Ai/Base/Value/SnareTargetValue.cpp b/src/Ai/Base/Value/SnareTargetValue.cpp index 7965198aa4d..f2440fcec9e 100644 --- a/src/Ai/Base/Value/SnareTargetValue.cpp +++ b/src/Ai/Base/Value/SnareTargetValue.cpp @@ -5,7 +5,8 @@ #include "SnareTargetValue.h" -#include "Playerbots.h" +#include "AiObjectContext.h" +#include "PlayerbotAI.h" #include "ServerFacade.h" Unit* SnareTargetValue::Calculate() diff --git a/src/Ai/Base/Value/SpellIdValue.cpp b/src/Ai/Base/Value/SpellIdValue.cpp index 682c0b3ffd2..244634bcdcf 100644 --- a/src/Ai/Base/Value/SpellIdValue.cpp +++ b/src/Ai/Base/Value/SpellIdValue.cpp @@ -8,7 +8,6 @@ #include "ChatHelper.h" #include "Playerbots.h" #include "Vehicle.h" -#include "World.h" SpellIdValue::SpellIdValue(PlayerbotAI* botAI) : CalculatedValue(botAI, "spell id", 20 * 1000) {} diff --git a/src/Ai/Base/Value/StatsValues.cpp b/src/Ai/Base/Value/StatsValues.cpp index 615f39f019a..5205ec05b7d 100644 --- a/src/Ai/Base/Value/StatsValues.cpp +++ b/src/Ai/Base/Value/StatsValues.cpp @@ -4,8 +4,12 @@ */ #include "StatsValues.h" -#include "Playerbots.h" +#include "AiObjectContext.h" +#include "Group.h" +#include "Pet.h" +#include "PlayerbotAIConfig.h" #include "ServerFacade.h" +#include "Player.h" Unit* HealthValue::GetTarget() { @@ -184,7 +188,7 @@ bool IsInCombatValue::Calculate() if (member->IsInCombat() && ServerFacade::instance().IsDistanceLessOrEqualThan(ServerFacade::instance().GetDistance2d(member, bot), - sPlayerbotAIConfig.reactDistance)) + PlayerbotAIConfig::instance().reactDistance)) return true; } } diff --git a/src/Ai/Base/Value/TankTargetValue.cpp b/src/Ai/Base/Value/TankTargetValue.cpp index ef2d1e959c9..90c759a7dae 100644 --- a/src/Ai/Base/Value/TankTargetValue.cpp +++ b/src/Ai/Base/Value/TankTargetValue.cpp @@ -5,9 +5,10 @@ #include "TankTargetValue.h" +#include "AiObjectContext.h" #include "AttackersValue.h" -#include "PlayerbotAIConfig.h" -#include "Playerbots.h" +#include "Group.h" +#include "PlayerbotAI.h" class FindTargetForTankStrategy : public FindNonCcTargetStrategy { diff --git a/src/Ai/Class/Dk/Strategy/GenericDKNonCombatStrategy.cpp b/src/Ai/Class/Dk/Strategy/GenericDKNonCombatStrategy.cpp index edead067550..d358d437054 100644 --- a/src/Ai/Class/Dk/Strategy/GenericDKNonCombatStrategy.cpp +++ b/src/Ai/Class/Dk/Strategy/GenericDKNonCombatStrategy.cpp @@ -5,8 +5,6 @@ #include "GenericDKNonCombatStrategy.h" -#include "Playerbots.h" - class GenericDKNonCombatStrategyActionNodeFactory : public NamedObjectFactory { public: diff --git a/src/Ai/Class/Druid/Action/DruidActions.cpp b/src/Ai/Class/Druid/Action/DruidActions.cpp index 33b7826bf89..d6a950b175f 100644 --- a/src/Ai/Class/Druid/Action/DruidActions.cpp +++ b/src/Ai/Class/Druid/Action/DruidActions.cpp @@ -28,11 +28,11 @@ Value* CastEntanglingRootsCcAction::GetTargetValue() return context->GetValue("cc target", "entangling roots"); } -bool CastEntanglingRootsCcAction::Execute(Event event) { return botAI->CastSpell("entangling roots", GetTarget()); } +bool CastEntanglingRootsCcAction::Execute(Event /*event*/) { return botAI->CastSpell("entangling roots", GetTarget()); } Value* CastHibernateCcAction::GetTargetValue() { return context->GetValue("cc target", "hibernate"); } -bool CastHibernateCcAction::Execute(Event event) { return botAI->CastSpell("hibernate", GetTarget()); } +bool CastHibernateCcAction::Execute(Event /*event*/) { return botAI->CastSpell("hibernate", GetTarget()); } bool CastStarfallAction::isUseful() { if (!CastSpellAction::isUseful()) diff --git a/src/Ai/Class/Druid/Action/DruidShapeshiftActions.cpp b/src/Ai/Class/Druid/Action/DruidShapeshiftActions.cpp index 42e639f93bb..a87f22a3b55 100644 --- a/src/Ai/Class/Druid/Action/DruidShapeshiftActions.cpp +++ b/src/Ai/Class/Druid/Action/DruidShapeshiftActions.cpp @@ -31,7 +31,7 @@ bool CastTravelFormAction::isUseful() !botAI->HasAura("dash", bot); } -bool CastCasterFormAction::Execute(Event event) +bool CastCasterFormAction::Execute(Event /*event*/) { botAI->RemoveShapeshift(); return true; @@ -44,7 +44,7 @@ bool CastCasterFormAction::isUseful() AI_VALUE2(uint8, "mana", "self target") > sPlayerbotAIConfig.mediumHealth; } -bool CastCancelTreeFormAction::Execute(Event event) +bool CastCancelTreeFormAction::Execute(Event /*event*/) { botAI->RemoveAura("tree of life"); return true; diff --git a/src/Ai/Class/Hunter/Action/HunterActions.cpp b/src/Ai/Class/Hunter/Action/HunterActions.cpp index a1588f8537b..18e5d590579 100644 --- a/src/Ai/Class/Hunter/Action/HunterActions.cpp +++ b/src/Ai/Class/Hunter/Action/HunterActions.cpp @@ -59,7 +59,7 @@ bool CastImmolationTrapAction::isUseful() Value* CastFreezingTrap::GetTargetValue() { return context->GetValue("cc target", "freezing trap"); } -bool FeedPetAction::Execute(Event event) +bool FeedPetAction::Execute(Event /*event*/) { if (Pet* pet = bot->GetPet()) if (pet->getPetType() == HUNTER_PET && pet->GetHappinessState() != HAPPY) @@ -99,7 +99,7 @@ bool CastDisengageAction::isUseful() Value* CastScareBeastCcAction::GetTargetValue() { return context->GetValue("cc target", "scare beast"); } -bool CastScareBeastCcAction::Execute(Event event) { return botAI->CastSpell("scare beast", GetTarget()); } +bool CastScareBeastCcAction::Execute(Event /*event*/) { return botAI->CastSpell("scare beast", GetTarget()); } bool CastWingClipAction::isUseful() { return CastSpellAction::isUseful() && !botAI->HasAura(spell, GetTarget()); } diff --git a/src/Ai/Class/Hunter/Strategy/GenericHunterStrategy.cpp b/src/Ai/Class/Hunter/Strategy/GenericHunterStrategy.cpp index 04afc6f766c..16a22eaeb97 100644 --- a/src/Ai/Class/Hunter/Strategy/GenericHunterStrategy.cpp +++ b/src/Ai/Class/Hunter/Strategy/GenericHunterStrategy.cpp @@ -5,9 +5,6 @@ #include "GenericHunterStrategy.h" -#include "Playerbots.h" -#include "Strategy.h" - class GenericHunterStrategyActionNodeFactory : public NamedObjectFactory { public: diff --git a/src/Ai/Class/Paladin/Action/PaladinActions.cpp b/src/Ai/Class/Paladin/Action/PaladinActions.cpp index 190ecb264a8..726f83546fc 100644 --- a/src/Ai/Class/Paladin/Action/PaladinActions.cpp +++ b/src/Ai/Class/Paladin/Action/PaladinActions.cpp @@ -8,13 +8,10 @@ #include "AiFactory.h" #include "Event.h" #include "PlayerbotAI.h" -#include "PlayerbotAIConfig.h" -#include "PlayerbotFactory.h" #include "Playerbots.h" #include "SharedDefines.h" #include "../../../../../src/server/scripts/Spells/spell_generic.cpp" #include "GenericBuffUtils.h" -#include "Config.h" #include "Group.h" #include "ObjectAccessor.h" @@ -167,7 +164,7 @@ Value* CastBlessingOnPartyAction::GetTargetValue() return context->GetValue("party member without aura", MakeAuraQualifierForBuff(spell)); } -bool CastBlessingOfMightAction::Execute(Event event) +bool CastBlessingOfMightAction::Execute(Event /*event*/) { Unit* target = GetTarget(); if (!target) @@ -188,7 +185,7 @@ Value* CastBlessingOfMightOnPartyAction::GetTargetValue() ); } -bool CastBlessingOfMightOnPartyAction::Execute(Event event) +bool CastBlessingOfMightOnPartyAction::Execute(Event /*event*/) { Unit* target = GetTarget(); if (!target) @@ -201,7 +198,7 @@ bool CastBlessingOfMightOnPartyAction::Execute(Event event) return botAI->CastSpell(castName, target); } -bool CastBlessingOfWisdomAction::Execute(Event event) +bool CastBlessingOfWisdomAction::Execute(Event /*event*/) { Unit* target = GetTarget(); if (!target) @@ -222,7 +219,7 @@ Value* CastBlessingOfWisdomOnPartyAction::GetTargetValue() ); } -bool CastBlessingOfWisdomOnPartyAction::Execute(Event event) +bool CastBlessingOfWisdomOnPartyAction::Execute(Event /*event*/) { Unit* target = GetTarget(); if (!target) @@ -258,7 +255,7 @@ Value* CastBlessingOfSanctuaryOnPartyAction::GetTargetValue() ); } -bool CastBlessingOfSanctuaryOnPartyAction::Execute(Event event) +bool CastBlessingOfSanctuaryOnPartyAction::Execute(Event /*event*/) { if (!bot->HasSpell(SPELL_BLESSING_OF_SANCTUARY)) return false; @@ -382,7 +379,7 @@ Value* CastBlessingOfKingsOnPartyAction::GetTargetValue() ); } -bool CastBlessingOfKingsOnPartyAction::Execute(Event event) +bool CastBlessingOfKingsOnPartyAction::Execute(Event /*event*/) { Unit* target = GetTarget(); if (!target) @@ -493,7 +490,7 @@ bool CastDivineSacrificeAction::isUseful() !botAI->HasAura("divine guardian", GetTarget(), false, false, -1, true); } -bool CastCancelDivineSacrificeAction::Execute(Event event) +bool CastCancelDivineSacrificeAction::Execute(Event /*event*/) { botAI->RemoveAura("divine sacrifice"); return true; diff --git a/src/Ai/Class/Paladin/Strategy/GenericPaladinStrategy.cpp b/src/Ai/Class/Paladin/Strategy/GenericPaladinStrategy.cpp index 62d7dfb10be..49143f9aef8 100644 --- a/src/Ai/Class/Paladin/Strategy/GenericPaladinStrategy.cpp +++ b/src/Ai/Class/Paladin/Strategy/GenericPaladinStrategy.cpp @@ -6,7 +6,6 @@ #include "GenericPaladinStrategy.h" #include "GenericPaladinStrategyActionNodeFactory.h" -#include "Playerbots.h" GenericPaladinStrategy::GenericPaladinStrategy(PlayerbotAI* botAI) : CombatStrategy(botAI) { diff --git a/src/Ai/Class/Priest/Action/PriestActions.cpp b/src/Ai/Class/Priest/Action/PriestActions.cpp index bdc33ac3403..1bfd7d2a8dd 100644 --- a/src/Ai/Class/Priest/Action/PriestActions.cpp +++ b/src/Ai/Class/Priest/Action/PriestActions.cpp @@ -8,7 +8,7 @@ #include "Event.h" #include "Playerbots.h" -bool CastRemoveShadowformAction::Execute(Event event) +bool CastRemoveShadowformAction::Execute(Event /*event*/) { botAI->RemoveAura("shadowform"); return true; diff --git a/src/Ai/Class/Rogue/Action/RogueActions.cpp b/src/Ai/Class/Rogue/Action/RogueActions.cpp index fb4975ab338..b554a82537d 100644 --- a/src/Ai/Class/Rogue/Action/RogueActions.cpp +++ b/src/Ai/Class/Rogue/Action/RogueActions.cpp @@ -25,7 +25,7 @@ bool CastStealthAction::isPossible() return !botAI->HasAura(23333, bot) && !botAI->HasAura(23335, bot) && !botAI->HasAura(34976, bot); } -bool UnstealthAction::Execute(Event event) +bool UnstealthAction::Execute(Event /*event*/) { botAI->RemoveAura("stealth"); // botAI->ChangeStrategy("+dps,-stealthed", BOT_STATE_COMBAT); @@ -33,7 +33,7 @@ bool UnstealthAction::Execute(Event event) return true; } -bool CheckStealthAction::Execute(Event event) +bool CheckStealthAction::Execute(Event /*event*/) { if (botAI->HasAura("stealth", bot)) { @@ -69,7 +69,7 @@ bool CastTricksOfTheTradeOnMainTankAction::isUseful() return CastSpellAction::isUseful() && AI_VALUE2(float, "distance", GetTargetName()) < 20.0f; } -bool UseDeadlyPoisonAction::Execute(Event event) +bool UseDeadlyPoisonAction::Execute(Event /*event*/) { std::vector poison_suffixs = {" IX", " VIII", " VII", " VI", " V", " IV", " III", " II", ""}; std::vector items; @@ -109,7 +109,7 @@ bool UseDeadlyPoisonAction::isPossible() return !items.empty(); } -bool UseInstantPoisonAction::Execute(Event event) +bool UseInstantPoisonAction::Execute(Event /*event*/) { std::vector poison_suffixs = {" IX", " VIII", " VII", " VI", " V", " IV", " III", " II", ""}; std::vector items; @@ -148,7 +148,7 @@ bool UseInstantPoisonAction::isPossible() return !items.empty(); } -bool UseInstantPoisonOffHandAction::Execute(Event event) +bool UseInstantPoisonOffHandAction::Execute(Event /*event*/) { std::vector poison_suffixs = {" IX", " VIII", " VII", " VI", " V", " IV", " III", " II", ""}; std::vector items; diff --git a/src/Ai/Class/Shaman/Action/ShamanActions.cpp b/src/Ai/Class/Shaman/Action/ShamanActions.cpp index e8ed1234bf2..3bb0ae86f4d 100644 --- a/src/Ai/Class/Shaman/Action/ShamanActions.cpp +++ b/src/Ai/Class/Shaman/Action/ShamanActions.cpp @@ -6,7 +6,6 @@ #include "ShamanActions.h" #include "TotemsShamanStrategy.h" #include "Playerbots.h" -#include "Totem.h" #include "PlayerbotAI.h" #include "Action.h" @@ -71,7 +70,7 @@ bool CastLavaBurstAction::isUseful() // Logic for making a guardian (spirit wolf) use a spell (spirit walk) // There is no existing code for guardians casting spells in the AC/Playerbots repo. -bool CastSpiritWalkAction::Execute(Event event) +bool CastSpiritWalkAction::Execute(Event /*event*/) { constexpr uint32 SPIRIT_WOLF = 29264; constexpr uint32 SPIRIT_WALK_SPELL = 58875; @@ -93,7 +92,7 @@ bool CastSpiritWalkAction::Execute(Event event) // Set Strategy Assigned Totems (Actions) - First, it checks // the highest-rank spell the bot knows for each totem type, // then adds it to the Call of the Elements bar. -bool SetTotemAction::Execute(Event event) +bool SetTotemAction::Execute(Event /*event*/) { uint32 totemSpell = 0; for (size_t i = 0; i < totemSpellIdsCount; ++i) diff --git a/src/Ai/Class/Shaman/Strategy/TotemsShamanStrategy.h b/src/Ai/Class/Shaman/Strategy/TotemsShamanStrategy.h index 6d36f4a2718..60488740c6a 100644 --- a/src/Ai/Class/Shaman/Strategy/TotemsShamanStrategy.h +++ b/src/Ai/Class/Shaman/Strategy/TotemsShamanStrategy.h @@ -7,7 +7,6 @@ #define _PLAYERBOT_TOTEMSSHAMANSTRATEGY_H #include "GenericShamanStrategy.h" -#include #include #include diff --git a/src/Ai/Class/Shaman/Trigger/ShamanTriggers.h b/src/Ai/Class/Shaman/Trigger/ShamanTriggers.h index abf4ed566cb..65d5081c865 100644 --- a/src/Ai/Class/Shaman/Trigger/ShamanTriggers.h +++ b/src/Ai/Class/Shaman/Trigger/ShamanTriggers.h @@ -10,9 +10,7 @@ #include "GenericTriggers.h" #include "SharedDefines.h" #include "Trigger.h" -#include #include "TotemsShamanStrategy.h" -#include "Player.h" #include "PlayerbotAI.h" #include diff --git a/src/Ai/Class/Warlock/Action/WarlockActions.cpp b/src/Ai/Class/Warlock/Action/WarlockActions.cpp index 4e09eb6523a..93798b702f6 100644 --- a/src/Ai/Class/Warlock/Action/WarlockActions.cpp +++ b/src/Ai/Class/Warlock/Action/WarlockActions.cpp @@ -116,7 +116,7 @@ bool CastSoulshatterAction::isUseful() } // Checks if the bot has enough bag space to create a soul shard, then does so -bool CreateSoulShardAction::Execute(Event event) +bool CreateSoulShardAction::Execute(Event /*event*/) { Player* bot = botAI->GetBot(); if (!bot) @@ -188,7 +188,7 @@ bool CastCreateSoulstoneAction::isUseful() return hasSpace; } -bool DestroySoulShardAction::Execute(Event event) +bool DestroySoulShardAction::Execute(Event /*event*/) { // Look for the first soul shard in any bag and destroy it for (int i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END; ++i) @@ -234,7 +234,7 @@ static bool HasSoulstoneAura(Unit* unit) } // Use the soulstone item on the bot itself with nc strategy "ss self" -bool UseSoulstoneSelfAction::Execute(Event event) +bool UseSoulstoneSelfAction::Execute(Event /*event*/) { std::vector items = AI_VALUE2(std::vector, "inventory items", "soulstone"); if (items.empty()) @@ -266,7 +266,7 @@ void CleanupSoulstoneReservations() } // Use the soulstone item on the bot's master with nc strategy "ss master" -bool UseSoulstoneMasterAction::Execute(Event event) +bool UseSoulstoneMasterAction::Execute(Event /*event*/) { CleanupSoulstoneReservations(); @@ -300,7 +300,7 @@ bool UseSoulstoneMasterAction::Execute(Event event) } // Use the soulstone item on a tank in the group with nc strategy "ss tank" -bool UseSoulstoneTankAction::Execute(Event event) +bool UseSoulstoneTankAction::Execute(Event /*event*/) { CleanupSoulstoneReservations(); @@ -368,7 +368,7 @@ bool UseSoulstoneTankAction::Execute(Event event) } // Use the soulstone item on a healer in the group with nc strategy "ss healer" -bool UseSoulstoneHealerAction::Execute(Event event) +bool UseSoulstoneHealerAction::Execute(Event /*event*/) { CleanupSoulstoneReservations(); @@ -425,7 +425,7 @@ CastCreateFirestoneAction::CastCreateFirestoneAction(PlayerbotAI* botAI) { } -bool CastCreateFirestoneAction::Execute(Event event) +bool CastCreateFirestoneAction::Execute(Event /*event*/) { for (uint32 spellId : firestoneSpellIds) { diff --git a/src/Ai/Class/Warlock/Strategy/GenericWarlockStrategy.cpp b/src/Ai/Class/Warlock/Strategy/GenericWarlockStrategy.cpp index 17597765801..9c85f786125 100644 --- a/src/Ai/Class/Warlock/Strategy/GenericWarlockStrategy.cpp +++ b/src/Ai/Class/Warlock/Strategy/GenericWarlockStrategy.cpp @@ -4,8 +4,6 @@ */ #include "GenericWarlockStrategy.h" -#include "Strategy.h" -#include "Playerbots.h" class GenericWarlockStrategyActionNodeFactory : public NamedObjectFactory { diff --git a/src/Ai/Class/Warlock/Strategy/TankWarlockStrategy.cpp b/src/Ai/Class/Warlock/Strategy/TankWarlockStrategy.cpp index c54fd596849..5c922af90dc 100644 --- a/src/Ai/Class/Warlock/Strategy/TankWarlockStrategy.cpp +++ b/src/Ai/Class/Warlock/Strategy/TankWarlockStrategy.cpp @@ -4,7 +4,6 @@ */ #include "TankWarlockStrategy.h" -#include "Playerbots.h" // Combat strategy for a Warlock Tank, for certain bosses like Twin Emperors // Priority is set to spam Searing Pain and use Shadow Ward on CD diff --git a/src/Ai/Class/Warrior/Action/WarriorActions.cpp b/src/Ai/Class/Warrior/Action/WarriorActions.cpp index 0bde24cd942..9f15cf76731 100644 --- a/src/Ai/Class/Warrior/Action/WarriorActions.cpp +++ b/src/Ai/Class/Warrior/Action/WarriorActions.cpp @@ -93,7 +93,7 @@ Unit* CastVigilanceAction::GetTarget() return nullptr; } -bool CastVigilanceAction::Execute(Event event) +bool CastVigilanceAction::Execute(Event /*event*/) { Unit* target = GetTarget(); if (!target || target == bot) @@ -176,7 +176,7 @@ Unit* CastShatteringThrowAction::GetTarget() return nullptr; // No valid target } -bool CastShatteringThrowAction::Execute(Event event) +bool CastShatteringThrowAction::Execute(Event /*event*/) { Unit* target = GetTarget(); if (!target) diff --git a/src/Ai/Class/Warrior/Strategy/ArmsWarriorStrategy.cpp b/src/Ai/Class/Warrior/Strategy/ArmsWarriorStrategy.cpp index eba5677e7f2..6d6e0b65540 100644 --- a/src/Ai/Class/Warrior/Strategy/ArmsWarriorStrategy.cpp +++ b/src/Ai/Class/Warrior/Strategy/ArmsWarriorStrategy.cpp @@ -5,8 +5,6 @@ #include "ArmsWarriorStrategy.h" -#include "Playerbots.h" - class ArmsWarriorStrategyActionNodeFactory : public NamedObjectFactory { public: diff --git a/src/Ai/Class/Warrior/Strategy/FuryWarriorStrategy.cpp b/src/Ai/Class/Warrior/Strategy/FuryWarriorStrategy.cpp index 6400ee4a8e3..67e5cb461a7 100644 --- a/src/Ai/Class/Warrior/Strategy/FuryWarriorStrategy.cpp +++ b/src/Ai/Class/Warrior/Strategy/FuryWarriorStrategy.cpp @@ -5,8 +5,6 @@ #include "FuryWarriorStrategy.h" -#include "Playerbots.h" - class FuryWarriorStrategyActionNodeFactory : public NamedObjectFactory { public: diff --git a/src/Ai/Class/Warrior/Strategy/TankWarriorStrategy.cpp b/src/Ai/Class/Warrior/Strategy/TankWarriorStrategy.cpp index 05f732c30ca..e6daa2646ce 100644 --- a/src/Ai/Class/Warrior/Strategy/TankWarriorStrategy.cpp +++ b/src/Ai/Class/Warrior/Strategy/TankWarriorStrategy.cpp @@ -5,8 +5,6 @@ #include "TankWarriorStrategy.h" -#include "Playerbots.h" - class TankWarriorStrategyActionNodeFactory : public NamedObjectFactory { public: diff --git a/src/Ai/Dungeon/AzjolNerub/Action/AzjolNerubActions.cpp b/src/Ai/Dungeon/AzjolNerub/Action/AzjolNerubActions.cpp index e31ffd00f57..42026cecf3d 100644 --- a/src/Ai/Dungeon/AzjolNerub/Action/AzjolNerubActions.cpp +++ b/src/Ai/Dungeon/AzjolNerub/Action/AzjolNerubActions.cpp @@ -1,9 +1,8 @@ #include "Playerbots.h" #include "AzjolNerubActions.h" -#include "AzjolNerubStrategy.h" bool AttackWebWrapAction::isUseful() { return !botAI->IsHeal(bot); } -bool AttackWebWrapAction::Execute(Event event) +bool AttackWebWrapAction::Execute(Event /*event*/) { Unit* webWrap = nullptr; @@ -29,7 +28,7 @@ bool AttackWebWrapAction::Execute(Event event) } bool WatchersTargetAction::isUseful() { return !botAI->IsHeal(bot); } -bool WatchersTargetAction::Execute(Event event) +bool WatchersTargetAction::Execute(Event /*event*/) { // Always prioritise web wraps Unit* currTarget = AI_VALUE(Unit*, "current target"); @@ -95,7 +94,7 @@ bool WatchersTargetAction::Execute(Event event) } bool AnubarakDodgePoundAction::isUseful() { return !AI_VALUE2(bool, "behind", "current target"); } -bool AnubarakDodgePoundAction::Execute(Event event) +bool AnubarakDodgePoundAction::Execute(Event /*event*/) { Unit* boss = AI_VALUE2(Unit*, "find target", "anub'arak"); if (!boss) { return false; } diff --git a/src/Ai/Dungeon/CullingOfStratholme/Action/CullingOfStratholmeActions.cpp b/src/Ai/Dungeon/CullingOfStratholme/Action/CullingOfStratholmeActions.cpp index 15121f4a2eb..b2732c3cfee 100644 --- a/src/Ai/Dungeon/CullingOfStratholme/Action/CullingOfStratholmeActions.cpp +++ b/src/Ai/Dungeon/CullingOfStratholme/Action/CullingOfStratholmeActions.cpp @@ -1,8 +1,7 @@ #include "Playerbots.h" #include "CullingOfStratholmeActions.h" -#include "CullingOfStratholmeStrategy.h" -bool ExplodeGhoulSpreadAction::Execute(Event event) +bool ExplodeGhoulSpreadAction::Execute(Event /*event*/) { Unit* boss = AI_VALUE2(Unit*, "find target", "salramm the fleshcrafter"); if (!boss) { return false; } @@ -38,7 +37,7 @@ bool EpochStackAction::isUseful() // else return !(bot->getClass() == CLASS_HUNTER) && AI_VALUE2(float, "distance", "current target") > 5.0f; } -bool EpochStackAction::Execute(Event event) +bool EpochStackAction::Execute(Event /*event*/) { Unit* boss = AI_VALUE2(Unit*, "find target", "chrono-lord epoch"); if (!boss) { return false; } diff --git a/src/Ai/Dungeon/DraktharonKeep/Action/DrakTharonKeepActions.cpp b/src/Ai/Dungeon/DraktharonKeep/Action/DrakTharonKeepActions.cpp index 8cbbe49c2a4..07e23699e78 100644 --- a/src/Ai/Dungeon/DraktharonKeep/Action/DrakTharonKeepActions.cpp +++ b/src/Ai/Dungeon/DraktharonKeep/Action/DrakTharonKeepActions.cpp @@ -1,8 +1,7 @@ #include "Playerbots.h" #include "DrakTharonKeepActions.h" -#include "DrakTharonKeepStrategy.h" -bool CorpseExplodeSpreadAction::Execute(Event event) +bool CorpseExplodeSpreadAction::Execute(Event /*event*/) { Unit* boss = AI_VALUE2(Unit*, "find target", "trollgore"); if (!boss) { return false; } @@ -17,15 +16,13 @@ bool CorpseExplodeSpreadAction::Execute(Event event) { float currentDistance = bot->GetExactDist2d(unit); if (currentDistance < distance + distanceExtra) - { return MoveAway(unit, distance + distanceExtra - currentDistance); - } } } return false; } -bool AvoidArcaneFieldAction::Execute(Event event) +bool AvoidArcaneFieldAction::Execute(Event /*event*/) { Unit* boss = AI_VALUE2(Unit*, "find target", "novos the summoner"); if (!boss) { return false; } @@ -44,7 +41,7 @@ bool NovosDefaultPositionAction::isUseful() float threshold = 15.0f; return bot->GetDistance(NOVOS_PARTY_POSITION) > threshold; } -bool NovosDefaultPositionAction::Execute(Event event) +bool NovosDefaultPositionAction::Execute(Event /*event*/) { float clusterDistance = 4.0f; // Only reposition if we're not killing anything @@ -59,7 +56,7 @@ bool NovosDefaultPositionAction::Execute(Event event) return false; } -bool NovosTargetPriorityAction::Execute(Event event) +bool NovosTargetPriorityAction::Execute(Event /*event*/) { // TODO: This can be improved, some parts are still buggy. // But it works for now and this fight is very easy @@ -89,9 +86,7 @@ bool NovosTargetPriorityAction::Execute(Event event) // Ranged dps, only set if none already assigned. // Don't break, we want to keep searching for a melee instead. if (!stairsDps) - { stairsDps = groupMember; - } } } } @@ -112,13 +107,11 @@ bool NovosTargetPriorityAction::Execute(Event event) if (botAI->IsTank(bot)) { if (creatureId == NPC_HULKING_CORPSE) - { selectedTargets[0] = unit; - } + else if (creatureId == NPC_CRYSTAL_HANDLER) - { selectedTargets[1] = unit; - } + } // Dedicated stairs dps is assigned. // Priority: Risen Shadowcaster -> Fetid Troll Corpse @@ -127,17 +120,13 @@ bool NovosTargetPriorityAction::Execute(Event event) if (creatureId == NPC_RISEN_SHADOWCASTER) { if (!selectedTargets[0] || bot->GetDistance(unit) < bot->GetDistance(selectedTargets[0]) - 5.0f) - { selectedTargets[0] = unit; - } } else if (creatureId == NPC_FETID_TROLL_CORPSE) { if (!selectedTargets[1] || bot->GetDistance(unit) < bot->GetDistance(selectedTargets[1]) - 5.0f) - { selectedTargets[1] = unit; - } } } // All other dps priority: @@ -145,13 +134,10 @@ bool NovosTargetPriorityAction::Execute(Event event) else if (botAI->IsDps(bot)) { if (creatureId == NPC_CRYSTAL_HANDLER) - { selectedTargets[0] = unit; - } + else if (creatureId == NPC_HULKING_CORPSE) - { selectedTargets[1] = unit; - } } } diff --git a/src/Ai/Dungeon/ForgeOfSouls/Action/ForgeOfSoulsActions.cpp b/src/Ai/Dungeon/ForgeOfSouls/Action/ForgeOfSoulsActions.cpp index e72fe98d5f5..d83b69bb4bc 100644 --- a/src/Ai/Dungeon/ForgeOfSouls/Action/ForgeOfSoulsActions.cpp +++ b/src/Ai/Dungeon/ForgeOfSouls/Action/ForgeOfSoulsActions.cpp @@ -1,9 +1,7 @@ #include "Playerbots.h" #include "ForgeOfSoulsActions.h" -#include "ForgeOfSoulsStrategy.h" -#include "SharedDefines.h" -bool MoveFromBronjahmAction::Execute(Event event) +bool MoveFromBronjahmAction::Execute(Event /*event*/) { Unit* boss = AI_VALUE2(Unit*, "find target", "bronjahm"); if (!boss) @@ -17,7 +15,7 @@ bool MoveFromBronjahmAction::Execute(Event event) return false; } -bool AttackCorruptedSoulFragmentAction::Execute(Event event) +bool AttackCorruptedSoulFragmentAction::Execute(Event /*event*/) { Unit* currentTarget = AI_VALUE(Unit*, "current target"); GuidVector targets = AI_VALUE(GuidVector, "possible targets"); @@ -51,7 +49,7 @@ bool AttackCorruptedSoulFragmentAction::Execute(Event event) return false; } -bool BronjahmGroupPositionAction::Execute(Event event) +bool BronjahmGroupPositionAction::Execute(Event /*event*/) { Unit* boss = AI_VALUE2(Unit*, "find target", "bronjahm"); if (!boss) @@ -141,7 +139,7 @@ bool BronjahmGroupPositionAction::Execute(Event event) bool BronjahmGroupPositionAction::isUseful() { return true; } -bool DevourerOfSoulsAction::Execute(Event event) +bool DevourerOfSoulsAction::Execute(Event /*event*/) { Unit* boss = AI_VALUE2(Unit*, "find target", "devourer of souls"); if (!boss) diff --git a/src/Ai/Dungeon/Gundrak/Action/GundrakActions.cpp b/src/Ai/Dungeon/Gundrak/Action/GundrakActions.cpp index 4e9910993df..775e8ef29a1 100644 --- a/src/Ai/Dungeon/Gundrak/Action/GundrakActions.cpp +++ b/src/Ai/Dungeon/Gundrak/Action/GundrakActions.cpp @@ -1,8 +1,7 @@ #include "Playerbots.h" #include "GundrakActions.h" -#include "GundrakStrategy.h" -bool AvoidPoisonNovaAction::Execute(Event event) +bool AvoidPoisonNovaAction::Execute(Event /*event*/) { Unit* boss = AI_VALUE2(Unit*, "find target", "slad'ran"); if (!boss) { return false; } @@ -19,7 +18,7 @@ bool AvoidPoisonNovaAction::Execute(Event event) return false; } -bool AttackSnakeWrapAction::Execute(Event event) +bool AttackSnakeWrapAction::Execute(Event /*event*/) { Unit* boss = AI_VALUE2(Unit*, "find target", "slad'ran"); if (!boss) { return false; } @@ -45,7 +44,7 @@ bool AttackSnakeWrapAction::Execute(Event event) return false; } -bool AvoidWhirlingSlashAction::Execute(Event event) +bool AvoidWhirlingSlashAction::Execute(Event /*event*/) { Unit* boss = AI_VALUE2(Unit*, "find target", "gal'darah"); if (!boss) { return false; } diff --git a/src/Ai/Dungeon/HallsOfLightning/Action/HallsOfLightningActions.cpp b/src/Ai/Dungeon/HallsOfLightning/Action/HallsOfLightningActions.cpp index 047e0aee138..7dcf643334f 100644 --- a/src/Ai/Dungeon/HallsOfLightning/Action/HallsOfLightningActions.cpp +++ b/src/Ai/Dungeon/HallsOfLightning/Action/HallsOfLightningActions.cpp @@ -1,8 +1,7 @@ #include "Playerbots.h" #include "HallsOfLightningActions.h" -#include "HallsOfLightningStrategy.h" -bool BjarngrimTargetAction::Execute(Event event) +bool BjarngrimTargetAction::Execute(Event /*event*/) { Unit* target = nullptr; @@ -35,7 +34,7 @@ bool BjarngrimTargetAction::Execute(Event event) return Attack(target); } -bool AvoidWhirlwindAction::Execute(Event event) +bool AvoidWhirlwindAction::Execute(Event /*event*/) { Unit* boss = AI_VALUE2(Unit*, "find target", "general bjarngrim"); if (!boss) { return false; } @@ -52,7 +51,7 @@ bool AvoidWhirlwindAction::Execute(Event event) return false; } -bool VolkhanTargetAction::Execute(Event event) +bool VolkhanTargetAction::Execute(Event /*event*/) { Unit* boss = AI_VALUE2(Unit*, "find target", "volkhan"); if (!boss || AI_VALUE(Unit*, "current target") == boss) @@ -63,7 +62,7 @@ bool VolkhanTargetAction::Execute(Event event) return Attack(boss); } -bool StaticOverloadSpreadAction::Execute(Event event) +bool StaticOverloadSpreadAction::Execute(Event /*event*/) { float radius = 8.0f; float distanceExtra = 2.0f; @@ -86,7 +85,7 @@ bool StaticOverloadSpreadAction::Execute(Event event) return false; } -bool BallLightningSpreadAction::Execute(Event event) +bool BallLightningSpreadAction::Execute(Event /*event*/) { float radius = 6.0f; float distanceExtra = 1.0f; @@ -108,14 +107,14 @@ bool BallLightningSpreadAction::Execute(Event event) } bool IonarTankPositionAction::isUseful() { return bot->GetExactDist2d(IONAR_TANK_POSITION) > 10.0f; } -bool IonarTankPositionAction::Execute(Event event) +bool IonarTankPositionAction::Execute(Event /*event*/) { return MoveTo(bot->GetMapId(), IONAR_TANK_POSITION.GetPositionX(), IONAR_TANK_POSITION.GetPositionY(), IONAR_TANK_POSITION.GetPositionZ(), false, false, false, true, MovementPriority::MOVEMENT_COMBAT); } bool DispersePositionAction::isUseful() { return bot->GetExactDist2d(DISPERSE_POSITION) > 8.0f; } -bool DispersePositionAction::Execute(Event event) +bool DispersePositionAction::Execute(Event /*event*/) { return MoveTo(bot->GetMapId(), DISPERSE_POSITION.GetPositionX(), DISPERSE_POSITION.GetPositionY(), DISPERSE_POSITION.GetPositionZ(), false, false, false, true, MovementPriority::MOVEMENT_COMBAT); @@ -133,7 +132,7 @@ bool LokenStackAction::isUseful() // else return AI_VALUE2(float, "distance", "current target") > 2.0f; } -bool LokenStackAction::Execute(Event event) +bool LokenStackAction::Execute(Event /*event*/) { Unit* boss = AI_VALUE2(Unit*, "find target", "loken"); if (!boss) { return false; } @@ -152,7 +151,7 @@ bool LokenStackAction::Execute(Event event) return false; } -bool AvoidLightningNovaAction::Execute(Event event) +bool AvoidLightningNovaAction::Execute(Event /*event*/) { Unit* boss = AI_VALUE2(Unit*, "find target", "loken"); if (!boss) { return false; } diff --git a/src/Ai/Dungeon/HallsOfStone/Action/HallsOfStoneActions.cpp b/src/Ai/Dungeon/HallsOfStone/Action/HallsOfStoneActions.cpp index 30562f090dc..51f1072b552 100644 --- a/src/Ai/Dungeon/HallsOfStone/Action/HallsOfStoneActions.cpp +++ b/src/Ai/Dungeon/HallsOfStone/Action/HallsOfStoneActions.cpp @@ -1,8 +1,7 @@ #include "Playerbots.h" #include "HallsOfStoneActions.h" -#include "HallsOfStoneStrategy.h" -bool ShatterSpreadAction::Execute(Event event) +bool ShatterSpreadAction::Execute(Event /*event*/) { Unit* boss = AI_VALUE2(Unit*, "find target", "krystallus"); if (!boss) { return false; } @@ -35,7 +34,7 @@ bool ShatterSpreadAction::Execute(Event event) return false; } -bool AvoidLightningRingAction::Execute(Event event) +bool AvoidLightningRingAction::Execute(Event /*event*/) { Unit* boss = AI_VALUE2(Unit*, "find target", "sjonnir the ironshaper"); if (!boss) { return false; } diff --git a/src/Ai/Dungeon/Nexus/Action/NexusActions.cpp b/src/Ai/Dungeon/Nexus/Action/NexusActions.cpp index f61a95aef4b..12b546b5eaf 100644 --- a/src/Ai/Dungeon/Nexus/Action/NexusActions.cpp +++ b/src/Ai/Dungeon/Nexus/Action/NexusActions.cpp @@ -1,8 +1,7 @@ #include "Playerbots.h" #include "NexusActions.h" -#include "NexusStrategy.h" -bool MoveFromWhirlwindAction::Execute(Event event) +bool MoveFromWhirlwindAction::Execute(Event /*event*/) { Unit* boss = nullptr; uint8 faction = bot->GetTeamId(); @@ -12,23 +11,19 @@ bool MoveFromWhirlwindAction::Execute(Event event) { case DUNGEON_DIFFICULTY_NORMAL: if (faction == TEAM_ALLIANCE) - { boss = AI_VALUE2(Unit*, "find target", "horde commander"); - } + else // TEAM_HORDE - { boss = AI_VALUE2(Unit*, "find target", "alliance commander"); - } + break; case DUNGEON_DIFFICULTY_HEROIC: if (faction == TEAM_ALLIANCE) - { boss = AI_VALUE2(Unit*, "find target", "commander kolurg"); - } + else // TEAM_HORDE - { boss = AI_VALUE2(Unit*, "find target", "commander stoutbeard"); - } + break; default: break; @@ -36,23 +31,19 @@ bool MoveFromWhirlwindAction::Execute(Event event) // Ensure boss is valid before accessing its methods if (!boss) - { return false; - } float bossDistance = bot->GetExactDist2d(boss->GetPosition()); // Check if the bot is already at a safe distance if (bossDistance > targetDist) - { return false; - } // Move away from the boss to avoid Whirlwind return MoveAway(boss, targetDist - bossDistance); } -bool FirebombSpreadAction::Execute(Event event) +bool FirebombSpreadAction::Execute(Event /*event*/) { Unit* boss = AI_VALUE2(Unit*, "find target", "grand magus telestra"); float radius = 5.0f; @@ -66,15 +57,14 @@ bool FirebombSpreadAction::Execute(Event event) if (!unit || bot->GetGUID() == member) { continue; } if (bot->GetExactDist2d(unit) < targetDist) - { return MoveAway(unit, targetDist); - } + } return false; } bool TelestraSplitTargetAction::isUseful() { return !botAI->IsHeal(bot); } -bool TelestraSplitTargetAction::Execute(Event event) +bool TelestraSplitTargetAction::Execute(Event /*event*/) { GuidVector attackers = AI_VALUE(GuidVector, "attackers"); Unit* splitTargets[3] = {nullptr, nullptr, nullptr}; @@ -107,9 +97,8 @@ bool TelestraSplitTargetAction::Execute(Event event) if (target) { if (AI_VALUE(Unit*, "current target") != target) - { return Attack(target); - } + // Don't continue loop here, the target exists so we don't // want to move down the prio list. We just don't need to send attack // command again, just return false and exit the loop that way @@ -121,7 +110,7 @@ bool TelestraSplitTargetAction::Execute(Event event) } bool ChaoticRiftTargetAction::isUseful() { return !botAI->IsHeal(bot); } -bool ChaoticRiftTargetAction::Execute(Event event) +bool ChaoticRiftTargetAction::Execute(Event /*event*/) { Unit* chaoticRift = nullptr; @@ -139,9 +128,8 @@ bool ChaoticRiftTargetAction::Execute(Event event) } } if (!chaoticRift || AI_VALUE(Unit*, "current target") == chaoticRift) - { return false; - } + return Attack(chaoticRift); } @@ -152,7 +140,7 @@ bool DodgeSpikesAction::isUseful() return bot->GetExactDist2d(boss) > 0.5f; } -bool DodgeSpikesAction::Execute(Event event) +bool DodgeSpikesAction::Execute(Event /*event*/) { Unit* boss = AI_VALUE2(Unit*, "find target", "ormorok the tree-shaper"); if (!boss) { return false; } @@ -160,7 +148,7 @@ bool DodgeSpikesAction::Execute(Event event) return Move(bot->GetAngle(boss), bot->GetExactDist2d(boss) - 0.3f); } -bool IntenseColdJumpAction::Execute(Event event) +bool IntenseColdJumpAction::Execute(Event /*event*/) { // This needs improving but maybe it should be done in the playerbot core. // Jump doesn't seem to support zero offset (eg. jump on the spot) so need to add a tiny delta. diff --git a/src/Ai/Dungeon/Oculus/Action/OculusActions.cpp b/src/Ai/Dungeon/Oculus/Action/OculusActions.cpp index bbb94d110a3..3854510036b 100644 --- a/src/Ai/Dungeon/Oculus/Action/OculusActions.cpp +++ b/src/Ai/Dungeon/Oculus/Action/OculusActions.cpp @@ -1,9 +1,9 @@ +#include "OculusTriggers.h" #include "Playerbots.h" #include "OculusActions.h" -#include "OculusStrategy.h" #include "LastSpellCastValue.h" -bool AvoidUnstableSphereAction::Execute(Event event) +bool AvoidUnstableSphereAction::Execute(Event /*event*/) { Unit* boss = AI_VALUE2(Unit*, "find target", "drakos the interrogator"); if (!boss) { return false; } @@ -34,7 +34,7 @@ bool AvoidUnstableSphereAction::Execute(Event event) } bool MountDrakeAction::isPossible() { return bot->GetMapId() == OCULUS_MAP_ID; } -bool MountDrakeAction::Execute(Event event) +bool MountDrakeAction::Execute(Event /*event*/) { std::map drakeAssignments; // Composition can be adjusted - both 3/1/1 and 2/2/1 are good default comps @@ -88,7 +88,7 @@ bool MountDrakeAction::Execute(Event event) } // Correct/update the drake items in inventories incase assignments have changed - for (uint32 itemId : DRAKE_ITEMS) + for (int64_t itemId : DRAKE_ITEMS) { Item* item = bot->GetItemByEntry(itemId); if (!item) { continue; } @@ -109,7 +109,7 @@ bool MountDrakeAction::Execute(Event event) return false; } -bool DismountDrakeAction::Execute(Event event) +bool DismountDrakeAction::Execute(Event /*event*/) { if (bot->GetVehicle()) { @@ -119,7 +119,7 @@ bool DismountDrakeAction::Execute(Event event) return false; } -bool OccFlyDrakeAction::Execute(Event event) +bool OccFlyDrakeAction::Execute(Event /*event*/) { Player* master = botAI->GetMaster(); if (!master) { return false; } @@ -160,7 +160,7 @@ bool OccFlyDrakeAction::Execute(Event event) return false; } -bool OccDrakeAttackAction::Execute(Event event) +bool OccDrakeAttackAction::Execute(Event /*event*/) { vehicleBase = bot->GetVehicleBase(); if (!vehicleBase) { return false; } @@ -319,7 +319,7 @@ bool OccDrakeAttackAction::RubyDrakeAction(Unit* target) return CastDrakeSpellAction(target, SPELL_SEARING_WRATH, 0); } -bool AvoidArcaneExplosionAction::Execute(Event event) +bool AvoidArcaneExplosionAction::Execute(Event /*event*/) { Unit* boss = AI_VALUE2(Unit*, "find target", "mage-lord urom"); if (!boss) { return false; } @@ -339,7 +339,7 @@ bool AvoidArcaneExplosionAction::Execute(Event event) return MoveNear(bot->GetMapId(), closestPos->GetPositionX(), closestPos->GetPositionY(), closestPos->GetPositionZ(), 2.0f, MovementPriority::MOVEMENT_COMBAT); } -bool TimeBombSpreadAction::Execute(Event event) +bool TimeBombSpreadAction::Execute(Event /*event*/) { float radius = 10.0f; float distanceExtra = 2.0f; diff --git a/src/Ai/Dungeon/Oculus/Action/OculusActions.h b/src/Ai/Dungeon/Oculus/Action/OculusActions.h index 6b26b9ddbc6..6616ce884bd 100644 --- a/src/Ai/Dungeon/Oculus/Action/OculusActions.h +++ b/src/Ai/Dungeon/Oculus/Action/OculusActions.h @@ -4,8 +4,6 @@ #include "Action.h" #include "AttackAction.h" #include "PlayerbotAI.h" -#include "Playerbots.h" -#include "OculusTriggers.h" #include "UseItemAction.h" #include "GenericSpellActions.h" diff --git a/src/Ai/Dungeon/Oculus/Multiplier/OculusMultipliers.cpp b/src/Ai/Dungeon/Oculus/Multiplier/OculusMultipliers.cpp index 7be543ee706..f8fcdd3f168 100644 --- a/src/Ai/Dungeon/Oculus/Multiplier/OculusMultipliers.cpp +++ b/src/Ai/Dungeon/Oculus/Multiplier/OculusMultipliers.cpp @@ -6,6 +6,7 @@ #include "OculusTriggers.h" #include "FollowActions.h" #include "ReachTargetActions.h" +#include "Playerbots.h" float MountingDrakeMultiplier::GetValue(Action* action) { @@ -15,14 +16,14 @@ float MountingDrakeMultiplier::GetValue(Action* action) // It seems like this is due to moving/other actions being processed during the 0.5 secs. // If we suppress everything, they seem to mount properly. A bit of a ham-fisted solution but it works Player* master = botAI->GetMaster(); - if (!master) { return 1.0f; } + if (!master) + return 1.0f; if (bot->GetMapId() != OCULUS_MAP_ID || !master->GetVehicleBase() || bot->GetVehicleBase()) { return 1.0f; } if (!dynamic_cast(action)) - { return 0.0f; - } + return 1.0f; } @@ -32,9 +33,8 @@ float OccFlyingMultiplier::GetValue(Action* action) // Suppresses FollowAction as well as some attack-based movements if (dynamic_cast(action) && !dynamic_cast(action)) - { return 0.0f; - } + return 1.0f; } @@ -44,9 +44,7 @@ float UromMultiplier::GetValue(Action* action) { Unit* target = action->GetTarget(); if (target && target->GetEntry() == NPC_MAGE_LORD_UROM) - { return 0.0f; - } } Unit* boss = AI_VALUE2(Unit*, "find target", "mage-lord urom"); @@ -57,26 +55,20 @@ float UromMultiplier::GetValue(Action* action) boss->FindCurrentSpellBySpellId(SPELL_EMPOWERED_ARCANE_EXPLOSION)) { if (dynamic_cast(action) && !dynamic_cast(action)) - { return 0.0f; - } } // Don't bother avoiding Frostbomb for melee if (botAI->IsMelee(bot)) { if (dynamic_cast(action)) - { return 0.0f; - } } if (bot->HasAura(SPELL_TIME_BOMB)) { if (dynamic_cast(action) && !dynamic_cast(action)) - { return 0.0f; - } } return 1.0f; @@ -91,9 +83,7 @@ uint8 UromMultiplier::GetPhaseByCurrentPosition(Unit* unit) for (uint8 i = 0; i < 3; ++i) { if (unit->GetDistance(uromCoords[i][0], uromCoords[i][1], uromCoords[i][2]) < distance) - { return i; - } } return 3; } @@ -104,8 +94,7 @@ float EregosMultiplier::GetValue(Action* action) if (!boss) { return 1.0f; } if (boss->HasAura(SPELL_PLANAR_SHIFT && dynamic_cast(action))) - { return 0.0f; - } + return 1.0f; } diff --git a/src/Ai/Dungeon/OldKingdom/Action/OldKingdomActions.cpp b/src/Ai/Dungeon/OldKingdom/Action/OldKingdomActions.cpp index 916bf292009..8a5250a8d82 100644 --- a/src/Ai/Dungeon/OldKingdom/Action/OldKingdomActions.cpp +++ b/src/Ai/Dungeon/OldKingdom/Action/OldKingdomActions.cpp @@ -1,8 +1,7 @@ #include "Playerbots.h" #include "OldKingdomActions.h" -#include "OldKingdomStrategy.h" -bool AttackNadoxGuardianAction::Execute(Event event) +bool AttackNadoxGuardianAction::Execute(Event /*event*/) { Unit* target = AI_VALUE2(Unit*, "find target", "ahn'kahar guardian"); if (!target || AI_VALUE(Unit*, "current target") == target) @@ -12,7 +11,7 @@ bool AttackNadoxGuardianAction::Execute(Event event) return Attack(target); } -bool AttackJedogaVolunteerAction::Execute(Event event) +bool AttackJedogaVolunteerAction::Execute(Event /*event*/) { Unit* target = nullptr; // Target is not findable from threat table using AI_VALUE2(), @@ -40,7 +39,7 @@ bool AttackJedogaVolunteerAction::Execute(Event event) return Attack(target); } -bool AvoidShadowCrashAction::Execute(Event event) +bool AvoidShadowCrashAction::Execute(Event /*event*/) { // Could check all enemy units in range as it's possible to pull multiple of these mobs. // They should really be killed 1 by 1, multipulls are messy so we just handle singles for now diff --git a/src/Ai/Dungeon/PitOfSaron/Action/PitOfSaronActions.cpp b/src/Ai/Dungeon/PitOfSaron/Action/PitOfSaronActions.cpp index d435a208d90..577575d4288 100644 --- a/src/Ai/Dungeon/PitOfSaron/Action/PitOfSaronActions.cpp +++ b/src/Ai/Dungeon/PitOfSaron/Action/PitOfSaronActions.cpp @@ -1,9 +1,7 @@ #include "Playerbots.h" #include "PitOfSaronActions.h" -#include "PitOfSaronStrategy.h" -#include "SharedDefines.h" -bool IckAndKrickAction::Execute(Event event) +bool IckAndKrickAction::Execute(Event /*event*/) { Unit* boss = AI_VALUE2(Unit*, "find target", "Ick"); if (!boss) @@ -271,7 +269,7 @@ bool IckAndKrickAction::ExplosiveBarrage(bool explosiveBarrage, Unit* boss) return false; } -bool TyrannusAction::Execute(Event event) +bool TyrannusAction::Execute(Event /*event*/) { Unit* boss = AI_VALUE2(Unit*, "find target", "scourgelord tyrannus"); if (!boss) diff --git a/src/Ai/Dungeon/TrialOfTheChampion/Action/TrialOfTheChampionActions.cpp b/src/Ai/Dungeon/TrialOfTheChampion/Action/TrialOfTheChampionActions.cpp index 92b687b2921..da865a2d170 100644 --- a/src/Ai/Dungeon/TrialOfTheChampion/Action/TrialOfTheChampionActions.cpp +++ b/src/Ai/Dungeon/TrialOfTheChampion/Action/TrialOfTheChampionActions.cpp @@ -1,15 +1,12 @@ #include "Playerbots.h" #include "TrialOfTheChampionActions.h" -#include "TrialOfTheChampionStrategy.h" #include "NearestNpcsValue.h" #include "ObjectAccessor.h" -#include "Timer.h" #include "Vehicle.h" #include "GenericSpellActions.h" #include "GenericActions.h" -#include -bool ToCLanceAction::Execute(Event event) +bool ToCLanceAction::Execute(Event /*event*/) { // If already has lance equipped, do nothing if (bot->HasItemOrGemWithIdEquipped(ITEM_LANCE, 1)) @@ -64,13 +61,11 @@ bool ToCLanceAction::Execute(Event event) // First unequip current weapon if it exists if (oldWeapon) - { bot->SwapItem(oldWeapon->GetPos(), lanceItem->GetPos()); - } + else - { bot->EquipItem(EQUIPMENT_SLOT_MAINHAND, lanceItem, true); - } + return true; } @@ -105,7 +100,7 @@ bool ToCUELanceAction::Execute(Event event) return false; } -bool ToCMountedAction::Execute(Event event) +bool ToCMountedAction::Execute(Event /*event*/) { Unit* vehicleBase = bot->GetVehicleBase(); Vehicle* vehicle = bot->GetVehicle(); @@ -179,7 +174,7 @@ bool ToCMountedAction::Execute(Event event) return false; } -bool ToCMountAction::Execute(Event event) +bool ToCMountAction::Execute(Event /*event*/) { // do not switch vehicles yet if (bot->GetVehicle()) @@ -244,7 +239,7 @@ bool ToCMountAction::EnterVehicle(Unit* vehicleBase, bool moveIfFar) return true; } -bool ToCEadricAction::Execute(Event event) +bool ToCEadricAction::Execute(Event /*event*/) { Unit* boss = AI_VALUE2(Unit*, "find target", "eadric the pure"); if (!boss) diff --git a/src/Ai/Dungeon/TrialOfTheChampion/Strategy/TrialOfTheChampionStrategy.cpp b/src/Ai/Dungeon/TrialOfTheChampion/Strategy/TrialOfTheChampionStrategy.cpp index bbccca71f37..323970d52d0 100644 --- a/src/Ai/Dungeon/TrialOfTheChampion/Strategy/TrialOfTheChampionStrategy.cpp +++ b/src/Ai/Dungeon/TrialOfTheChampion/Strategy/TrialOfTheChampionStrategy.cpp @@ -1,5 +1,4 @@ #include "TrialOfTheChampionStrategy.h" -#include "TrialOfTheChampionMultipliers.h" void WotlkDungeonToCStrategy::InitTriggers(std::vector &triggers) { diff --git a/src/Ai/Dungeon/UtgardeKeep/Action/UtgardeKeepActions.cpp b/src/Ai/Dungeon/UtgardeKeep/Action/UtgardeKeepActions.cpp index 20a5f27b49b..85d8590ee2b 100644 --- a/src/Ai/Dungeon/UtgardeKeep/Action/UtgardeKeepActions.cpp +++ b/src/Ai/Dungeon/UtgardeKeep/Action/UtgardeKeepActions.cpp @@ -1,9 +1,8 @@ #include "Playerbots.h" #include "UtgardeKeepActions.h" -#include "UtgardeKeepStrategy.h" bool AttackFrostTombAction::isUseful() { return !botAI->IsHeal(bot); } -bool AttackFrostTombAction::Execute(Event event) +bool AttackFrostTombAction::Execute(Event /*event*/) { Unit* frostTomb = nullptr; @@ -28,7 +27,7 @@ bool AttackFrostTombAction::Execute(Event event) } // TODO: Possibly add player stacking behaviour close to tank, to prevent Skarvald charging ranged -bool AttackDalronnAction::Execute(Event event) +bool AttackDalronnAction::Execute(Event /*event*/) { Unit* boss = AI_VALUE2(Unit*, "find target", "dalronn the controller"); if (!boss) { return false; } @@ -40,7 +39,7 @@ bool AttackDalronnAction::Execute(Event event) return Attack(boss); } -bool IngvarStopCastingAction::Execute(Event event) +bool IngvarStopCastingAction::Execute(Event /*event*/) { // Doesn't work, this action gets queued behind the current spell instead of interrupting it Unit* boss = AI_VALUE2(Unit*, "find target", "ingvar the plunderer"); @@ -64,7 +63,7 @@ bool IngvarStopCastingAction::Execute(Event event) } bool IngvarDodgeSmashAction::isUseful() { return !AI_VALUE2(bool, "behind", "current target"); } -bool IngvarDodgeSmashAction::Execute(Event event) +bool IngvarDodgeSmashAction::Execute(Event /*event*/) { Unit* boss = AI_VALUE2(Unit*, "find target", "ingvar the plunderer"); if (!boss) { return false; } @@ -78,7 +77,7 @@ bool IngvarDodgeSmashAction::Execute(Event event) } bool IngvarSmashReturnAction::isUseful() { return AI_VALUE2(bool, "behind", "current target"); } -bool IngvarSmashReturnAction::Execute(Event event) +bool IngvarSmashReturnAction::Execute(Event /*event*/) { Unit* boss = AI_VALUE2(Unit*, "find target", "ingvar the plunderer"); if (!boss) { return false; } diff --git a/src/Ai/Dungeon/UtgardePinnacle/Action/UtgardePinnacleActions.cpp b/src/Ai/Dungeon/UtgardePinnacle/Action/UtgardePinnacleActions.cpp index f084ca15b67..8025f1aac0c 100644 --- a/src/Ai/Dungeon/UtgardePinnacle/Action/UtgardePinnacleActions.cpp +++ b/src/Ai/Dungeon/UtgardePinnacle/Action/UtgardePinnacleActions.cpp @@ -1,8 +1,7 @@ #include "Playerbots.h" #include "UtgardePinnacleActions.h" -#include "UtgardePinnacleStrategy.h" -bool AvoidFreezingCloudAction::Execute(Event event) +bool AvoidFreezingCloudAction::Execute(Event /*event*/) { Unit* closestTrigger = nullptr; GuidVector objects = AI_VALUE(GuidVector, "nearest hostile npcs"); @@ -36,7 +35,7 @@ bool AvoidFreezingCloudAction::Execute(Event event) return false; } -bool AvoidSkadiWhirlwindAction::Execute(Event event) +bool AvoidSkadiWhirlwindAction::Execute(Event /*event*/) { Unit* boss = AI_VALUE2(Unit*, "find target", "skadi the ruthless"); if (!boss) { return false; } diff --git a/src/Ai/Dungeon/VioletHold/Action/VioletHoldActions.cpp b/src/Ai/Dungeon/VioletHold/Action/VioletHoldActions.cpp index b590642d8b9..b61f84bdfbb 100644 --- a/src/Ai/Dungeon/VioletHold/Action/VioletHoldActions.cpp +++ b/src/Ai/Dungeon/VioletHold/Action/VioletHoldActions.cpp @@ -1,8 +1,7 @@ #include "Playerbots.h" #include "VioletHoldActions.h" -#include "VioletHoldStrategy.h" -bool AttackErekemAction::Execute(Event event) +bool AttackErekemAction::Execute(Event /*event*/) { // Focus boss first, adds after Unit* boss = AI_VALUE2(Unit*, "find target", "erekem"); @@ -15,7 +14,7 @@ bool AttackErekemAction::Execute(Event event) return false; } -bool AttackIchorGlobuleAction::Execute(Event event) +bool AttackIchorGlobuleAction::Execute(Event /*event*/) { Unit* boss = AI_VALUE2(Unit*, "find target", "ichoron"); if (!boss) { return false; } @@ -60,7 +59,7 @@ bool AttackIchorGlobuleAction::Execute(Event event) return false; } -bool AttackVoidSentryAction::Execute(Event event) +bool AttackVoidSentryAction::Execute(Event /*event*/) { Unit* boss = AI_VALUE2(Unit*, "find target", "zuramat the obliterator"); if (!boss) { return false; } @@ -96,7 +95,7 @@ bool AttackVoidSentryAction::Execute(Event event) return false; } -bool StopAttackAction::Execute(Event event) +bool StopAttackAction::Execute(Event /*event*/) { return bot->AttackStop(); } diff --git a/src/Ai/Raid/Aq20/Action/RaidAq20Actions.cpp b/src/Ai/Raid/Aq20/Action/RaidAq20Actions.cpp index 1bf33147f84..5d9b4aaa365 100644 --- a/src/Ai/Raid/Aq20/Action/RaidAq20Actions.cpp +++ b/src/Ai/Raid/Aq20/Action/RaidAq20Actions.cpp @@ -1,9 +1,8 @@ #include "RaidAq20Actions.h" -#include "Playerbots.h" #include "RaidAq20Utils.h" -bool Aq20UseCrystalAction::Execute(Event event) +bool Aq20UseCrystalAction::Execute(Event /*event*/) { if (Unit* boss = AI_VALUE2(Unit*, "find target", "ossirian the unscarred")) { diff --git a/src/Ai/Raid/Aq20/Trigger/RaidAq20Triggers.cpp b/src/Ai/Raid/Aq20/Trigger/RaidAq20Triggers.cpp index 1a580d6bd34..913cb269062 100644 --- a/src/Ai/Raid/Aq20/Trigger/RaidAq20Triggers.cpp +++ b/src/Ai/Raid/Aq20/Trigger/RaidAq20Triggers.cpp @@ -1,6 +1,5 @@ #include "RaidAq20Triggers.h" -#include "SharedDefines.h" #include "RaidAq20Utils.h" bool Aq20MoveToCrystalTrigger::IsActive() diff --git a/src/Ai/Raid/BlackwingLair/Action/RaidBwlActions.cpp b/src/Ai/Raid/BlackwingLair/Action/RaidBwlActions.cpp index 54b21791e8a..9014345cc02 100644 --- a/src/Ai/Raid/BlackwingLair/Action/RaidBwlActions.cpp +++ b/src/Ai/Raid/BlackwingLair/Action/RaidBwlActions.cpp @@ -2,7 +2,7 @@ #include "Playerbots.h" -bool BwlOnyxiaScaleCloakAuraCheckAction::Execute(Event event) +bool BwlOnyxiaScaleCloakAuraCheckAction::Execute(Event /*event*/) { bot->AddAura(22683, bot); return true; @@ -10,7 +10,7 @@ bool BwlOnyxiaScaleCloakAuraCheckAction::Execute(Event event) bool BwlOnyxiaScaleCloakAuraCheckAction::isUseful() { return !bot->HasAura(22683); } -bool BwlTurnOffSuppressionDeviceAction::Execute(Event event) +bool BwlTurnOffSuppressionDeviceAction::Execute(Event /*event*/) { GuidVector gos = AI_VALUE(GuidVector, "nearest game objects"); for (GuidVector::iterator i = gos.begin(); i != gos.end(); i++) @@ -29,4 +29,7 @@ bool BwlTurnOffSuppressionDeviceAction::Execute(Event event) return true; } -bool BwlUseHourglassSandAction::Execute(Event event) { return botAI->CastSpell(23645, bot); } +bool BwlUseHourglassSandAction::Execute(Event /*event*/) +{ + return botAI->CastSpell(23645, bot); +} diff --git a/src/Ai/Raid/EyeOfEternity/Action/RaidEoEActions.cpp b/src/Ai/Raid/EyeOfEternity/Action/RaidEoEActions.cpp index 35473884268..b08db3f33e7 100644 --- a/src/Ai/Raid/EyeOfEternity/Action/RaidEoEActions.cpp +++ b/src/Ai/Raid/EyeOfEternity/Action/RaidEoEActions.cpp @@ -2,7 +2,7 @@ #include "RaidEoEActions.h" #include "RaidEoETriggers.h" -bool MalygosPositionAction::Execute(Event event) +bool MalygosPositionAction::Execute(Event /*event*/) { Unit* boss = AI_VALUE2(Unit*, "find target", "malygos"); if (!boss) { return false; } @@ -65,7 +65,7 @@ bool MalygosPositionAction::Execute(Event event) return false; } -bool MalygosTargetAction::Execute(Event event) +bool MalygosTargetAction::Execute(Event /*event*/) { Unit* boss = AI_VALUE2(Unit*, "find target", "malygos"); if (!boss) { return false; } @@ -229,7 +229,7 @@ bool EoEFlyDrakeAction::isPossible() Unit* vehicleBase = bot->GetVehicleBase(); return (vehicleBase && vehicleBase->GetEntry() == NPC_WYRMREST_SKYTALON); } -bool EoEFlyDrakeAction::Execute(Event event) +bool EoEFlyDrakeAction::Execute(Event /*event*/) { Player* master = botAI->GetMaster(); if (!master) { return false; } @@ -279,7 +279,7 @@ bool EoEDrakeAttackAction::isPossible() return (vehicleBase && vehicleBase->GetEntry() == NPC_WYRMREST_SKYTALON); } -bool EoEDrakeAttackAction::Execute(Event event) +bool EoEDrakeAttackAction::Execute(Event /*event*/) { vehicleBase = bot->GetVehicleBase(); if (!vehicleBase) @@ -367,8 +367,6 @@ bool EoEDrakeAttackAction::DrakeDpsAction(Unit* target) Unit* vehicleBase = bot->GetVehicleBase(); if (!vehicleBase) { return false; } - Vehicle* veh = bot->GetVehicle(); - uint8 comboPoints = vehicleBase->GetComboPoints(target); if (comboPoints >= 2) { diff --git a/src/Ai/Raid/GruulsLair/Action/RaidGruulsLairActions.cpp b/src/Ai/Raid/GruulsLair/Action/RaidGruulsLairActions.cpp index 2af82ebe99f..1a45b0c156d 100644 --- a/src/Ai/Raid/GruulsLair/Action/RaidGruulsLairActions.cpp +++ b/src/Ai/Raid/GruulsLair/Action/RaidGruulsLairActions.cpp @@ -10,7 +10,7 @@ using namespace GruulsLairHelpers; // High King Maulgar Actions // Main tank on Maulgar -bool HighKingMaulgarMainTankAttackMaulgarAction::Execute(Event event) +bool HighKingMaulgarMainTankAttackMaulgarAction::Execute(Event /*event*/) { Unit* maulgar = AI_VALUE2(Unit*, "find target", "high king maulgar"); if (!maulgar) @@ -44,7 +44,7 @@ bool HighKingMaulgarMainTankAttackMaulgarAction::Execute(Event event) } // First offtank on Olm -bool HighKingMaulgarFirstAssistTankAttackOlmAction::Execute(Event event) +bool HighKingMaulgarFirstAssistTankAttackOlmAction::Execute(Event /*event*/) { Unit* olm = AI_VALUE2(Unit*, "find target", "olm the summoner"); if (!olm) @@ -79,7 +79,7 @@ bool HighKingMaulgarFirstAssistTankAttackOlmAction::Execute(Event event) } // Second offtank on Blindeye -bool HighKingMaulgarSecondAssistTankAttackBlindeyeAction::Execute(Event event) +bool HighKingMaulgarSecondAssistTankAttackBlindeyeAction::Execute(Event /*event*/) { Unit* blindeye = AI_VALUE2(Unit*, "find target", "blindeye the seer"); if (!blindeye) @@ -113,7 +113,7 @@ bool HighKingMaulgarSecondAssistTankAttackBlindeyeAction::Execute(Event event) } // Mage with highest max HP on Krosh -bool HighKingMaulgarMageTankAttackKroshAction::Execute(Event event) +bool HighKingMaulgarMageTankAttackKroshAction::Execute(Event /*event*/) { Unit* krosh = AI_VALUE2(Unit*, "find target", "krosh firehand"); if (!krosh) @@ -166,7 +166,7 @@ bool HighKingMaulgarMageTankAttackKroshAction::Execute(Event event) } // Moonkin with highest max HP on Kiggler -bool HighKingMaulgarMoonkinTankAttackKigglerAction::Execute(Event event) +bool HighKingMaulgarMoonkinTankAttackKigglerAction::Execute(Event /*event*/) { Unit* kiggler = AI_VALUE2(Unit*, "find target", "kiggler the crazed"); if (!kiggler) @@ -188,7 +188,7 @@ bool HighKingMaulgarMoonkinTankAttackKigglerAction::Execute(Event event) return false; } -bool HighKingMaulgarAssignDPSPriorityAction::Execute(Event event) +bool HighKingMaulgarAssignDPSPriorityAction::Execute(Event /*event*/) { // Target priority 1: Blindeye Unit* blindeye = AI_VALUE2(Unit*, "find target", "blindeye the seer"); @@ -297,7 +297,7 @@ bool HighKingMaulgarAssignDPSPriorityAction::Execute(Event event) } // Avoid Whirlwind and Blast Wave and generally try to stay near the center of the room -bool HighKingMaulgarHealerFindSafePositionAction::Execute(Event event) +bool HighKingMaulgarHealerFindSafePositionAction::Execute(Event /*event*/) { const Position& center = MAULGAR_ROOM_CENTER; const float maxDistanceFromCenter = 50.0f; @@ -331,7 +331,7 @@ bool HighKingMaulgarHealerFindSafePositionAction::Execute(Event event) } // Run away from Maulgar during Whirlwind (logic for after all other ogres are dead) -bool HighKingMaulgarRunAwayFromWhirlwindAction::Execute(Event event) +bool HighKingMaulgarRunAwayFromWhirlwindAction::Execute(Event /*event*/) { Unit* maulgar = AI_VALUE2(Unit*, "find target", "high king maulgar"); if (!maulgar) @@ -366,7 +366,7 @@ bool HighKingMaulgarRunAwayFromWhirlwindAction::Execute(Event event) return false; } -bool HighKingMaulgarBanishFelstalkerAction::Execute(Event event) +bool HighKingMaulgarBanishFelstalkerAction::Execute(Event /*event*/) { Group* group = bot->GetGroup(); if (!group) @@ -411,7 +411,7 @@ bool HighKingMaulgarBanishFelstalkerAction::Execute(Event event) // Hunter 1: Misdirect Olm to first offtank and have pet attack Blindeye // Hunter 2: Misdirect Blindeye to second offtank -bool HighKingMaulgarMisdirectOlmAndBlindeyeAction::Execute(Event event) +bool HighKingMaulgarMisdirectOlmAndBlindeyeAction::Execute(Event /*event*/) { Group* group = bot->GetGroup(); if (!group) @@ -491,7 +491,7 @@ bool HighKingMaulgarMisdirectOlmAndBlindeyeAction::Execute(Event event) // Gruul the Dragonkiller Actions // Position in center of the room -bool GruulTheDragonkillerTanksPositionBossAction::Execute(Event event) +bool GruulTheDragonkillerTanksPositionBossAction::Execute(Event /*event*/) { Unit* gruul = AI_VALUE2(Unit*, "find target", "gruul the dragonkiller"); if (!gruul) @@ -525,7 +525,7 @@ bool GruulTheDragonkillerTanksPositionBossAction::Execute(Event event) // Ranged will take initial positions around the middle of the room, 25-40 yards from center // Ranged should spread out 10 yards from each other -bool GruulTheDragonkillerSpreadRangedAction::Execute(Event event) +bool GruulTheDragonkillerSpreadRangedAction::Execute(Event /*event*/) { Group* group = bot->GetGroup(); if (!group) @@ -618,7 +618,7 @@ bool GruulTheDragonkillerSpreadRangedAction::Execute(Event event) } // Try to get away from other group members when Ground Slam is cast -bool GruulTheDragonkillerShatterSpreadAction::Execute(Event event) +bool GruulTheDragonkillerShatterSpreadAction::Execute(Event /*event*/) { Group* group = bot->GetGroup(); if (!group) diff --git a/src/Ai/Raid/Icecrown/Action/RaidIccActions.cpp b/src/Ai/Raid/Icecrown/Action/RaidIccActions.cpp index c3e3513e2a3..95f5bc3bf63 100644 --- a/src/Ai/Raid/Icecrown/Action/RaidIccActions.cpp +++ b/src/Ai/Raid/Icecrown/Action/RaidIccActions.cpp @@ -1,19 +1,16 @@ #include "RaidIccActions.h" #include "NearestNpcsValue.h" #include "ObjectAccessor.h" -#include "RaidIccStrategy.h" #include "Playerbots.h" -#include "Timer.h" #include "Vehicle.h" #include "RtiValue.h" #include "GenericSpellActions.h" #include "GenericActions.h" -#include #include "RaidIccTriggers.h" #include "Multiplier.h" // Lord Marrowgwar -bool IccLmTankPositionAction::Execute(Event event) +bool IccLmTankPositionAction::Execute(Event /*event*/) { Unit* boss = AI_VALUE2(Unit*, "find target", "lord marrowgar"); if (!boss) @@ -73,7 +70,7 @@ bool IccLmTankPositionAction::MoveTowardPosition(const Position& position, float MovementPriority::MOVEMENT_COMBAT); } -bool IccSpikeAction::Execute(Event event) +bool IccSpikeAction::Execute(Event /*event*/) { // If we're impaled, we can't do anything if (botAI->GetAura("Impaled", bot)) @@ -183,7 +180,7 @@ void IccSpikeAction::UpdateRaidTargetIcon(Unit* target) } // Lady Deathwhisper -bool IccDarkReckoningAction::Execute(Event event) +bool IccDarkReckoningAction::Execute(Event /*event*/) { constexpr float SAFE_DISTANCE_THRESHOLD = 2.0f; @@ -201,7 +198,7 @@ bool IccDarkReckoningAction::Execute(Event event) return false; } -bool IccRangedPositionLadyDeathwhisperAction::Execute(Event event) +bool IccRangedPositionLadyDeathwhisperAction::Execute(Event /*event*/) { Unit* boss = AI_VALUE2(Unit*, "find target", "lady deathwhisper"); if (!boss) @@ -301,7 +298,7 @@ bool IccRangedPositionLadyDeathwhisperAction::MaintainRangedSpacing() return false; // Everyone is properly spaced } -bool IccAddsLadyDeathwhisperAction::Execute(Event event) +bool IccAddsLadyDeathwhisperAction::Execute(Event /*event*/) { Unit* boss = AI_VALUE2(Unit*, "find target", "lady deathwhisper"); if (!boss) @@ -419,7 +416,7 @@ void IccAddsLadyDeathwhisperAction::UpdateRaidTargetIcon(Unit* target) } } -bool IccShadeLadyDeathwhisperAction::Execute(Event event) +bool IccShadeLadyDeathwhisperAction::Execute(Event /*event*/) { static constexpr uint32 VENGEFUL_SHADE_ID = NPC_SHADE; static constexpr float SAFE_DISTANCE = 12.0f; @@ -473,7 +470,7 @@ bool IccShadeLadyDeathwhisperAction::Execute(Event event) return false; } -bool IccRottingFrostGiantTankPositionAction::Execute(Event event) +bool IccRottingFrostGiantTankPositionAction::Execute(Event /*event*/) { Unit* boss = AI_VALUE2(Unit*, "find target", "rotting frost giant"); if (!boss) @@ -696,7 +693,7 @@ bool IccRottingFrostGiantTankPositionAction::Execute(Event event) } //Gunship -bool IccCannonFireAction::Execute(Event event) +bool IccCannonFireAction::Execute(Event /*event*/) { Unit* vehicleBase = bot->GetVehicleBase(); Vehicle* vehicle = bot->GetVehicle(); @@ -755,7 +752,7 @@ bool IccCannonFireAction::TryCastCannonSpell(uint32 spellId, Unit* target, Unit* return false; } -bool IccGunshipEnterCannonAction::Execute(Event event) +bool IccGunshipEnterCannonAction::Execute(Event /*event*/) { // Do not switch vehicles if already in one if (bot->GetVehicle()) @@ -855,7 +852,7 @@ bool IccGunshipEnterCannonAction::EnterVehicle(Unit* vehicleBase, bool moveIfFar return true; } -bool IccGunshipTeleportAllyAction::Execute(Event event) +bool IccGunshipTeleportAllyAction::Execute(Event /*event*/) { static constexpr float MAX_WAITING_DISTANCE = 45.0f; static constexpr float MAX_ATTACK_DISTANCE = 15.0f; @@ -922,7 +919,7 @@ void IccGunshipTeleportAllyAction::UpdateBossSkullIcon(Unit* boss, uint8_t SKULL } } -bool IccGunshipTeleportHordeAction::Execute(Event event) +bool IccGunshipTeleportHordeAction::Execute(Event /*event*/) { static constexpr float MAX_WAITING_DISTANCE = 45.0f; static constexpr float MAX_ATTACK_DISTANCE = 15.0f; @@ -990,7 +987,7 @@ void IccGunshipTeleportHordeAction::UpdateBossSkullIcon(Unit* boss, uint8_t SKUL } //DBS -bool IccDbsTankPositionAction::Execute(Event event) +bool IccDbsTankPositionAction::Execute(Event /*event*/) { Unit* boss = AI_VALUE2(Unit*, "find target", "deathbringer saurfang"); if (!boss) @@ -1231,7 +1228,7 @@ bool IccDbsTankPositionAction::PositionInRangedFormation() return false; } -bool IccAddsDbsAction::Execute(Event event) +bool IccAddsDbsAction::Execute(Event /*event*/) { Unit* boss = AI_VALUE2(Unit*, "find target", "deathbringer saurfang"); if (!boss) @@ -1295,7 +1292,7 @@ void IccAddsDbsAction::UpdateSkullMarker(Unit* priorityTarget) } // Festergut -bool IccFestergutGroupPositionAction::Execute(Event event) +bool IccFestergutGroupPositionAction::Execute(Event /*event*/) { Unit* boss = AI_VALUE2(Unit*, "find target", "festergut"); if (!boss) @@ -1511,7 +1508,7 @@ int IccFestergutGroupPositionAction::CalculatePositionIndex(Group* group) return -1; } -bool IccFestergutSporeAction::Execute(Event event) +bool IccFestergutSporeAction::Execute(Event /*event*/) { constexpr float POSITION_TOLERANCE = 4.0f; constexpr float SPREAD_RADIUS = 2.0f; @@ -1626,7 +1623,7 @@ bool IccFestergutSporeAction::CheckMainTankSpore() } // Rotface -bool IccRotfaceTankPositionAction::Execute(Event event) +bool IccRotfaceTankPositionAction::Execute(Event /*event*/) { Unit* boss = AI_VALUE2(Unit*, "find target", "rotface"); if (!boss) @@ -1702,7 +1699,7 @@ bool IccRotfaceTankPositionAction::HandleAssistTankPositioning(Unit* boss) return HandleBigOozePositioning(boss); } -bool IccRotfaceTankPositionAction::HandleBigOozePositioning(Unit* boss) +bool IccRotfaceTankPositionAction::HandleBigOozePositioning(Unit*) { // Find all big oozes GuidVector bigOozes = AI_VALUE(GuidVector, "nearest hostile npcs"); @@ -1826,7 +1823,7 @@ bool IccRotfaceTankPositionAction::HandleBigOozePositioning(Unit* boss) return false; } -bool IccRotfaceGroupPositionAction::Execute(Event event) +bool IccRotfaceGroupPositionAction::Execute(Event /*event*/) { Unit* boss = AI_VALUE2(Unit*, "find target", "rotface"); if (!boss) @@ -1893,7 +1890,7 @@ bool IccRotfaceGroupPositionAction::HandlePuddleAvoidance(Unit* boss) return false; } -bool IccRotfaceGroupPositionAction::MoveAwayFromPuddle(Unit* boss, Unit* puddle, float puddleDistance) +bool IccRotfaceGroupPositionAction::MoveAwayFromPuddle(Unit* boss, Unit* puddle, float) { if (!boss || !puddle) return false; @@ -2177,7 +2174,7 @@ bool IccRotfaceGroupPositionAction::FindAndMoveFromClosestMember(Unit* boss, Uni return false; // Everyone is properly spaced } -bool IccRotfaceMoveAwayFromExplosionAction::Execute(Event event) +bool IccRotfaceMoveAwayFromExplosionAction::Execute(Event /*event*/) { // Skip if main tank or ooze flood if (botAI->IsMainTank(bot)) @@ -2260,7 +2257,7 @@ bool IccRotfaceMoveAwayFromExplosionAction::MoveToRandomSafeLocation() } // Proffesor Putricide -bool IccPutricideGrowingOozePuddleAction::Execute(Event event) +bool IccPutricideGrowingOozePuddleAction::Execute(Event /*event*/) { Unit* closestPuddle = FindClosestThreateningPuddle(); if (!closestPuddle) @@ -2418,7 +2415,7 @@ bool IccPutricideGrowingOozePuddleAction::IsPositionTooCloseToOtherPuddles(float return false; } -bool IccPutricideVolatileOozeAction::Execute(Event event) +bool IccPutricideVolatileOozeAction::Execute(Event /*event*/) { static const float STACK_DISTANCE = 7.0f; @@ -2531,7 +2528,7 @@ Unit* IccPutricideVolatileOozeAction::FindAuraTarget() return nullptr; } -bool IccPutricideGasCloudAction::Execute(Event event) +bool IccPutricideGasCloudAction::Execute(Event /*event*/) { Unit* gasCloud = AI_VALUE2(Unit*, "find target", "gas cloud"); if (!gasCloud) @@ -2808,7 +2805,6 @@ Position IccPutricideGasCloudAction::CalculateEmergencyPosition(const Position& Position bestPos = Position(botPos.GetPositionX() + dx * 15.0f, botPos.GetPositionY() + dy * 15.0f, botPos.GetPositionZ()); float bestFreedom = 0.0f; - static const float MOVEMENT_INCREMENT = 5.0f; // Fixed movement increment // Try fewer directions for emergency but still avoid corners for (int i = 0; i < 8; i++) @@ -2924,9 +2920,7 @@ bool IccPutricideGasCloudAction::HandleGroupAuraSituation(Unit* gasCloud) gasCloud->GetPositionZ(), false, false, false, false, MovementPriority::MOVEMENT_COMBAT); } else - { return Attack(gasCloud); - } } } @@ -2944,7 +2938,7 @@ bool IccPutricideGasCloudAction::GroupHasGaseousBloat(Group* group) return false; } -bool IccPutricideAvoidMalleableGooAction::Execute(Event event) +bool IccPutricideAvoidMalleableGooAction::Execute(Event /*event*/) { Unit* boss = AI_VALUE2(Unit*, "find target", "professor putricide"); if (!boss) @@ -2966,7 +2960,7 @@ bool IccPutricideAvoidMalleableGooAction::Execute(Event event) return HandleBossPositioning(boss); } -bool IccPutricideAvoidMalleableGooAction::HandleTankPositioning(Unit* boss) +bool IccPutricideAvoidMalleableGooAction::HandleTankPositioning(Unit*) { if (!botAI->IsTank(bot)) return false; @@ -3231,7 +3225,7 @@ Position IccPutricideAvoidMalleableGooAction::CalculateIncrementalMove(const Pos } // BPC -bool IccBpcKelesethTankAction::Execute(Event event) +bool IccBpcKelesethTankAction::Execute(Event /*event*/) { if (!botAI->IsAssistTank(bot)) return false; @@ -3312,7 +3306,7 @@ bool IccBpcKelesethTankAction::Execute(Event event) return false; } -bool IccBpcMainTankAction::Execute(Event event) +bool IccBpcMainTankAction::Execute(Event /*event*/) { // Main tank specific behavior (higher priority) if (botAI->IsMainTank(bot)) @@ -3429,7 +3423,7 @@ void IccBpcMainTankAction::MarkEmpoweredPrince() } } -bool IccBpcEmpoweredVortexAction::Execute(Event event) +bool IccBpcEmpoweredVortexAction::Execute(Event /*event*/) { Unit* valanar = AI_VALUE2(Unit*, "find target", "prince valanar"); if (!valanar) @@ -3614,7 +3608,7 @@ bool IccBpcEmpoweredVortexAction::HandleEmpoweredVortexSpread() return false; // Everyone is properly spaced } -bool IccBpcKineticBombAction::Execute(Event event) +bool IccBpcKineticBombAction::Execute(Event /*event*/) { // Early exit if not ranged DPS if (!botAI->IsRangedDps(bot)) @@ -3760,7 +3754,7 @@ bool IccBpcKineticBombAction::IsBombAlreadyHandled(Unit* bomb, Group* group) return false; } -bool IccBpcBallOfFlameAction::Execute(Event event) +bool IccBpcBallOfFlameAction::Execute(Event /*event*/) { Unit* boss = AI_VALUE2(Unit*, "find target", "prince taldaram"); if (!boss) @@ -3841,7 +3835,7 @@ bool IccBpcBallOfFlameAction::Execute(Event event) } // Blood Queen Lana'thel -bool IccBqlGroupPositionAction::Execute(Event event) +bool IccBqlGroupPositionAction::Execute(Event /*event*/) { Unit* boss = AI_VALUE2(Unit*, "find target", "blood-queen lana'thel"); if (!boss) @@ -4603,7 +4597,7 @@ bool IccBqlGroupPositionAction::HandleGroupPosition(Unit* boss, Aura* frenzyAura return false; } -bool IccBqlPactOfDarkfallenAction::Execute(Event event) +bool IccBqlPactOfDarkfallenAction::Execute(Event /*event*/) { // Check if bot has Pact of the Darkfallen if (!botAI->GetAura("Pact of the Darkfallen", bot)) @@ -4722,7 +4716,7 @@ bool IccBqlPactOfDarkfallenAction::MoveToTargetPosition(const Position& targetPo return false; } -bool IccBqlVampiricBiteAction::Execute(Event event) +bool IccBqlVampiricBiteAction::Execute(Event /*event*/) { // Only act when bot has Frenzied Bloodthirst if (!botAI->GetAura("Frenzied Bloodthirst", bot)) @@ -4859,7 +4853,7 @@ bool IccBqlVampiricBiteAction::CastVampiricBite(Player* target) } // Sister Svalna -bool IccValkyreSpearAction::Execute(Event event) +bool IccValkyreSpearAction::Execute(Event /*event*/) { // Find the nearest spear Creature* spear = bot->FindNearestCreature(NPC_SPEAR, 100.0f); @@ -4885,7 +4879,7 @@ bool IccValkyreSpearAction::Execute(Event event) return false; } -bool IccSisterSvalnaAction::Execute(Event event) +bool IccSisterSvalnaAction::Execute(Event /*event*/) { Unit* svalna = AI_VALUE2(Unit*, "find target", "sister svalna"); if (!svalna || !svalna->HasAura(SPELL_AETHER_SHIELD)) // Check for Aether Shield aura @@ -4910,7 +4904,7 @@ bool IccSisterSvalnaAction::Execute(Event event) } // VDW -bool IccValithriaGroupAction::Execute(Event event) +bool IccValithriaGroupAction::Execute(Event /*event*/) { // Helper lambda to find nearest creature of given entries auto findNearestCreature = [this](std::initializer_list entries, float range) -> Creature* @@ -5320,7 +5314,7 @@ bool IccValithriaGroupAction::Handle10ManGroupLogic() return false; } -bool IccValithriaPortalAction::Execute(Event event) +bool IccValithriaPortalAction::Execute(Event /*event*/) { // Only healers should take portals, and not if already inside if (!botAI->IsHeal(bot) || bot->HasAura(SPELL_DREAM_STATE)) @@ -5453,7 +5447,7 @@ bool IccValithriaPortalAction::Execute(Event event) return false; } -bool IccValithriaHealAction::Execute(Event event) +bool IccValithriaHealAction::Execute(Event /*event*/) { // Early validation checks if (!botAI->IsHeal(bot) || bot->GetHealthPct() < 50.0f) @@ -5543,7 +5537,7 @@ bool IccValithriaHealAction::Execute(Event event) return false; } -bool IccValithriaDreamCloudAction::Execute(Event event) +bool IccValithriaDreamCloudAction::Execute(Event /*event*/) { // Only execute if we're in dream state if (!bot->HasAura(SPELL_DREAM_STATE)) @@ -5826,7 +5820,7 @@ bool IccValithriaDreamCloudAction::Execute(Event event) } // Sindragosa -bool IccSindragosaGroupPositionAction::Execute(Event event) +bool IccSindragosaGroupPositionAction::Execute(Event /*event*/) { Unit* boss = AI_VALUE2(Unit*, "find target", "sindragosa"); if (!boss || boss->HasUnitMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY)) @@ -6085,7 +6079,7 @@ bool IccSindragosaGroupPositionAction::MoveIncrementallyToPosition(const Positio MovementPriority::MOVEMENT_COMBAT); } -bool IccSindragosaTankSwapPositionAction::Execute(Event event) +bool IccSindragosaTankSwapPositionAction::Execute(Event /*event*/) { Unit* boss = AI_VALUE2(Unit*, "find target", "sindragosa"); if (!boss) @@ -6109,7 +6103,7 @@ bool IccSindragosaTankSwapPositionAction::Execute(Event event) return false; } -bool IccSindragosaFrostBeaconAction::Execute(Event event) +bool IccSindragosaFrostBeaconAction::Execute(Event /*event*/) { const Unit* boss = AI_VALUE2(Unit*, "find target", "sindragosa"); if (!boss) @@ -6343,7 +6337,7 @@ bool IccSindragosaFrostBeaconAction::IsBossFlying(const Unit* boss) ICC_SINDRAGOSA_FLYING_POSITION.GetPositionY()) < 30.0f; } -bool IccSindragosaBlisteringColdAction::Execute(Event event) +bool IccSindragosaBlisteringColdAction::Execute(Event /*event*/) { Unit* boss = AI_VALUE2(Unit*, "find target", "sindragosa"); if (!boss) @@ -6391,7 +6385,7 @@ bool IccSindragosaBlisteringColdAction::Execute(Event event) return false; } -bool IccSindragosaUnchainedMagicAction::Execute(Event event) +bool IccSindragosaUnchainedMagicAction::Execute(Event /*event*/) { Unit* boss = AI_VALUE2(Unit*, "find target", "sindragosa"); if (!boss) @@ -6413,7 +6407,7 @@ bool IccSindragosaUnchainedMagicAction::Execute(Event event) return false; } -bool IccSindragosaChilledToTheBoneAction::Execute(Event event) +bool IccSindragosaChilledToTheBoneAction::Execute(Event /*event*/) { Unit* boss = AI_VALUE2(Unit*, "find target", "sindragosa"); if (!boss) @@ -6436,7 +6430,7 @@ bool IccSindragosaChilledToTheBoneAction::Execute(Event event) return false; } -bool IccSindragosaMysticBuffetAction::Execute(Event event) +bool IccSindragosaMysticBuffetAction::Execute(Event /*event*/) { Unit* boss = AI_VALUE2(Unit*, "find target", "sindragosa"); if (!boss || !bot || !bot->IsAlive()) @@ -6519,7 +6513,7 @@ bool IccSindragosaMysticBuffetAction::Execute(Event event) return false; } -bool IccSindragosaFrostBombAction::Execute(Event event) +bool IccSindragosaFrostBombAction::Execute(Event /*event*/) { if (!bot || !bot->IsAlive() || bot->HasAura(SPELL_ICE_TOMB)) // Skip if dead or in Ice Tomb return false; @@ -6804,7 +6798,7 @@ bool IccSindragosaFrostBombAction::Execute(Event event) } // The Lich King -bool IccLichKingShadowTrapAction::Execute(Event event) +bool IccLichKingShadowTrapAction::Execute(Event /*event*/) { Unit* boss = AI_VALUE2(Unit*, "find target", "the lich king"); if (!boss || !botAI->IsTank(bot)) @@ -6931,7 +6925,7 @@ bool IccLichKingShadowTrapAction::Execute(Event event) return false; } -bool IccLichKingNecroticPlagueAction::Execute(Event event) +bool IccLichKingNecroticPlagueAction::Execute(Event /*event*/) { bool hasPlague = botAI->HasAura("Necrotic Plague", bot); // Only execute if we have the plague @@ -6983,7 +6977,7 @@ bool IccLichKingNecroticPlagueAction::Execute(Event event) return false; } -bool IccLichKingWinterAction::Execute(Event event) +bool IccLichKingWinterAction::Execute(Event /*event*/) { Unit* boss = AI_VALUE2(Unit*, "find target", "the lich king"); if (!boss) @@ -7785,7 +7779,7 @@ void IccLichKingWinterAction::HandleAssistTankAddManagement(Unit* boss, const Po } } -bool IccLichKingAddsAction::Execute(Event event) +bool IccLichKingAddsAction::Execute(Event /*event*/) { if (bot->HasAura(SPELL_HARVEST_SOUL_VALKYR)) // Don't process actions if bot is picked up by Val'kyr return false; diff --git a/src/Ai/Raid/Icecrown/Multiplier/RaidIccMultipliers.cpp b/src/Ai/Raid/Icecrown/Multiplier/RaidIccMultipliers.cpp index fc02d56bea3..c6a6fdee561 100644 --- a/src/Ai/Raid/Icecrown/Multiplier/RaidIccMultipliers.cpp +++ b/src/Ai/Raid/Icecrown/Multiplier/RaidIccMultipliers.cpp @@ -15,7 +15,6 @@ #include "RaidIccActions.h" #include "ReachTargetActions.h" #include "RogueActions.h" -#include "ScriptedCreature.h" #include "ShamanActions.h" #include "UseMeetingStoneAction.h" #include "WarriorActions.h" diff --git a/src/Ai/Raid/Icecrown/Trigger/RaidIccTriggers.cpp b/src/Ai/Raid/Icecrown/Trigger/RaidIccTriggers.cpp index b34fe003fc0..75989ba1c40 100644 --- a/src/Ai/Raid/Icecrown/Trigger/RaidIccTriggers.cpp +++ b/src/Ai/Raid/Icecrown/Trigger/RaidIccTriggers.cpp @@ -4,14 +4,9 @@ #include "PlayerbotAIConfig.h" #include "ObjectAccessor.h" #include "GenericTriggers.h" -#include "DungeonStrategyUtils.h" -#include "EventMap.h" #include "Playerbots.h" -#include "ScriptedCreature.h" #include "Trigger.h" -#include "CellImpl.h" #include "GridNotifiers.h" -#include "GridNotifiersImpl.h" #include "Vehicle.h" //Lord Marrogwar diff --git a/src/Ai/Raid/Karazhan/Action/RaidKarazhanActions.cpp b/src/Ai/Raid/Karazhan/Action/RaidKarazhanActions.cpp index 4d40a9eedb5..b04e09d0d5f 100644 --- a/src/Ai/Raid/Karazhan/Action/RaidKarazhanActions.cpp +++ b/src/Ai/Raid/Karazhan/Action/RaidKarazhanActions.cpp @@ -10,7 +10,7 @@ using namespace KarazhanHelpers; // Mana Warps blow up when they die for massive raid damage // But they cannot cast the ability if they are stunned -bool ManaWarpStunCreatureBeforeWarpBreachAction::Execute(Event event) +bool ManaWarpStunCreatureBeforeWarpBreachAction::Execute(Event /*event*/) { Unit* manaWarp = GetFirstAliveUnitByEntry(botAI, NPC_MANA_WARP); if (!manaWarp) @@ -40,7 +40,7 @@ bool ManaWarpStunCreatureBeforeWarpBreachAction::Execute(Event event) // Attumen the Huntsman // Prioritize Midnight until Attumen is mounted -bool AttumenTheHuntsmanMarkTargetAction::Execute(Event event) +bool AttumenTheHuntsmanMarkTargetAction::Execute(Event /*event*/) { Unit* attumenMounted = GetFirstAliveUnitByEntry(botAI, NPC_ATTUMEN_THE_HUNTSMAN_MOUNTED); if (attumenMounted) @@ -77,7 +77,7 @@ bool AttumenTheHuntsmanMarkTargetAction::Execute(Event event) } // Off tank should move Attumen out of the way so he doesn't cleave bots -bool AttumenTheHuntsmanSplitBossesAction::Execute(Event event) +bool AttumenTheHuntsmanSplitBossesAction::Execute(Event /*event*/) { Unit* midnight = AI_VALUE2(Unit*, "find target", "midnight"); if (!midnight) @@ -105,7 +105,7 @@ bool AttumenTheHuntsmanSplitBossesAction::Execute(Event event) } // Stack behind mounted Attumen (inside minimum range of Berserker Charge) -bool AttumenTheHuntsmanStackBehindAction::Execute(Event event) +bool AttumenTheHuntsmanStackBehindAction::Execute(Event /*event*/) { Unit* attumenMounted = GetFirstAliveUnitByEntry(botAI, NPC_ATTUMEN_THE_HUNTSMAN_MOUNTED); if (!attumenMounted) @@ -126,7 +126,7 @@ bool AttumenTheHuntsmanStackBehindAction::Execute(Event event) } // Reset timer for bots to pause DPS when Attumen mounts Midnight -bool AttumenTheHuntsmanManageDpsTimerAction::Execute(Event event) +bool AttumenTheHuntsmanManageDpsTimerAction::Execute(Event /*event*/) { Unit* midnight = AI_VALUE2(Unit*, "find target", "midnight"); if (!midnight) @@ -153,7 +153,7 @@ bool AttumenTheHuntsmanManageDpsTimerAction::Execute(Event event) // Moroes -bool MoroesMainTankAttackBossAction::Execute(Event event) +bool MoroesMainTankAttackBossAction::Execute(Event /*event*/) { Unit* moroes = AI_VALUE2(Unit*, "find target", "moroes"); if (!moroes) @@ -169,7 +169,7 @@ bool MoroesMainTankAttackBossAction::Execute(Event event) } // Mark targets with skull in the recommended kill order -bool MoroesMarkTargetAction::Execute(Event event) +bool MoroesMarkTargetAction::Execute(Event /*event*/) { Unit* dorothea = AI_VALUE2(Unit*, "find target", "baroness dorothea millstipe"); Unit* catriona = AI_VALUE2(Unit*, "find target", "lady catriona von'indi"); @@ -194,7 +194,7 @@ bool MoroesMarkTargetAction::Execute(Event event) // Tank the boss in the center of the room // Move to healers after Repentenace to break the stun -bool MaidenOfVirtueMoveBossToHealerAction::Execute(Event event) +bool MaidenOfVirtueMoveBossToHealerAction::Execute(Event /*event*/) { Unit* maiden = AI_VALUE2(Unit*, "find target", "maiden of virtue"); if (!maiden) @@ -248,7 +248,7 @@ bool MaidenOfVirtueMoveBossToHealerAction::Execute(Event event) } // Spread out ranged DPS between the pillars -bool MaidenOfVirtuePositionRangedAction::Execute(Event event) +bool MaidenOfVirtuePositionRangedAction::Execute(Event /*event*/) { const uint8 maxIndex = 7; uint8 index = 0; @@ -288,7 +288,7 @@ bool MaidenOfVirtuePositionRangedAction::Execute(Event event) // The Big Bad Wolf // Tank the boss at the front left corner of the stage -bool BigBadWolfPositionBossAction::Execute(Event event) +bool BigBadWolfPositionBossAction::Execute(Event /*event*/) { Unit* wolf = AI_VALUE2(Unit*, "find target", "the big bad wolf"); if (!wolf) @@ -319,7 +319,7 @@ bool BigBadWolfPositionBossAction::Execute(Event event) } // Run away, little girl, run away -bool BigBadWolfRunAwayFromBossAction::Execute(Event event) +bool BigBadWolfRunAwayFromBossAction::Execute(Event /*event*/) { const ObjectGuid botGuid = bot->GetGUID(); uint8 index = bigBadWolfRunIndex.count(botGuid) ? bigBadWolfRunIndex[botGuid] : 0; @@ -342,7 +342,7 @@ bool BigBadWolfRunAwayFromBossAction::Execute(Event event) // Romulo and Julianne // Keep the couple within 10% HP of each other -bool RomuloAndJulianneMarkTargetAction::Execute(Event event) +bool RomuloAndJulianneMarkTargetAction::Execute(Event /*event*/) { Unit* romulo = AI_VALUE2(Unit*, "find target", "romulo"); if (!romulo) @@ -371,7 +371,7 @@ bool RomuloAndJulianneMarkTargetAction::Execute(Event event) // The Wizard of Oz // Mark targets with skull in the recommended kill order -bool WizardOfOzMarkTargetAction::Execute(Event event) +bool WizardOfOzMarkTargetAction::Execute(Event /*event*/) { Unit* dorothee = AI_VALUE2(Unit*, "find target", "dorothee"); Unit* tito = AI_VALUE2(Unit*, "find target", "tito"); @@ -388,7 +388,7 @@ bool WizardOfOzMarkTargetAction::Execute(Event event) } // Mages spam Scorch on Strawman to disorient him -bool WizardOfOzScorchStrawmanAction::Execute(Event event) +bool WizardOfOzScorchStrawmanAction::Execute(Event /*event*/) { Unit* strawman = AI_VALUE2(Unit*, "find target", "strawman"); if (strawman && botAI->CanCastSpell("scorch", strawman)) @@ -400,7 +400,7 @@ bool WizardOfOzScorchStrawmanAction::Execute(Event event) // The Curator // Prioritize destroying Astral Flares -bool TheCuratorMarkAstralFlareAction::Execute(Event event) +bool TheCuratorMarkAstralFlareAction::Execute(Event /*event*/) { Unit* flare = AI_VALUE2(Unit*, "find target", "astral flare"); if (!flare) @@ -416,7 +416,7 @@ bool TheCuratorMarkAstralFlareAction::Execute(Event event) // Tank the boss in the center of the hallway near the Guardian's Library // Main tank and off tank will attack the boss; others will focus on Astral Flares -bool TheCuratorPositionBossAction::Execute(Event event) +bool TheCuratorPositionBossAction::Execute(Event /*event*/) { Unit* curator = AI_VALUE2(Unit*, "find target", "the curator"); if (!curator) @@ -450,7 +450,7 @@ bool TheCuratorPositionBossAction::Execute(Event event) } // Spread out ranged DPS to avoid Arcing Sear damage -bool TheCuratorSpreadRangedAction::Execute(Event event) +bool TheCuratorSpreadRangedAction::Execute(Event /*event*/) { const float minDistance = 5.0f; Unit* nearestPlayer = GetNearestPlayerInRadius(bot, minDistance); @@ -468,7 +468,7 @@ bool TheCuratorSpreadRangedAction::Execute(Event event) // Terestian Illhoof // Prioritize (1) Demon Chains, (2) Kil'rek, (3) Illhoof -bool TerestianIllhoofMarkTargetAction::Execute(Event event) +bool TerestianIllhoofMarkTargetAction::Execute(Event /*event*/) { Unit* demonChains = GetFirstAliveUnitByEntry(botAI, NPC_DEMON_CHAINS); Unit* kilrek = GetFirstAliveUnitByEntry(botAI, NPC_KILREK); @@ -484,7 +484,7 @@ bool TerestianIllhoofMarkTargetAction::Execute(Event event) // Shade of Aran // Run to the edge of the room to avoid Arcane Explosion -bool ShadeOfAranRunAwayFromArcaneExplosionAction::Execute(Event event) +bool ShadeOfAranRunAwayFromArcaneExplosionAction::Execute(Event /*event*/) { Unit* aran = AI_VALUE2(Unit*, "find target", "shade of aran"); if (!aran) @@ -503,7 +503,7 @@ bool ShadeOfAranRunAwayFromArcaneExplosionAction::Execute(Event event) } // I will not move when Flame Wreath is cast or the raid blows up -bool ShadeOfAranStopMovingDuringFlameWreathAction::Execute(Event event) +bool ShadeOfAranStopMovingDuringFlameWreathAction::Execute(Event /*event*/) { AI_VALUE(LastMovement&, "last movement").Set(nullptr); @@ -518,7 +518,7 @@ bool ShadeOfAranStopMovingDuringFlameWreathAction::Execute(Event event) } // Mark Conjured Elementals with skull so DPS can burn them down -bool ShadeOfAranMarkConjuredElementalAction::Execute(Event event) +bool ShadeOfAranMarkConjuredElementalAction::Execute(Event /*event*/) { Unit* elemental = GetFirstAliveUnitByEntry(botAI, NPC_CONJURED_ELEMENTAL); @@ -530,7 +530,7 @@ bool ShadeOfAranMarkConjuredElementalAction::Execute(Event event) // Don't get closer than 11 yards to Aran to avoid counterspell // Don't get farther than 15 yards from Aran to avoid getting stuck in alcoves -bool ShadeOfAranRangedMaintainDistanceAction::Execute(Event event) +bool ShadeOfAranRangedMaintainDistanceAction::Execute(Event /*event*/) { Unit* aran = AI_VALUE2(Unit*, "find target", "shade of aran"); if (!aran) @@ -594,7 +594,7 @@ bool ShadeOfAranRangedMaintainDistanceAction::Execute(Event event) // One tank bot per phase will dance in and out of the red beam (5 seconds in, 5 seconds out) // Tank bots will ignore void zones--their positioning is too important to risk losing beam control -bool NetherspiteBlockRedBeamAction::Execute(Event event) +bool NetherspiteBlockRedBeamAction::Execute(Event /*event*/) { Unit* netherspite = AI_VALUE2(Unit*, "find target", "netherspite"); if (!netherspite) @@ -681,7 +681,7 @@ Position NetherspiteBlockRedBeamAction::GetPositionOnBeam(Unit* netherspite, Uni // Two non-Rogue/Warrior DPS bots will block the blue beam for each phase (swap at 25 debuff stacks) // When avoiding void zones, blocking bots will move along the beam to continue blocking -bool NetherspiteBlockBlueBeamAction::Execute(Event event) +bool NetherspiteBlockBlueBeamAction::Execute(Event /*event*/) { Unit* netherspite = AI_VALUE2(Unit*, "find target", "netherspite"); if (!netherspite) @@ -774,7 +774,7 @@ bool NetherspiteBlockBlueBeamAction::Execute(Event event) // Two healer bots will block the green beam for each phase (swap at 25 debuff stacks) // OR one rogue or DPS warrior bot will block the green beam for an entire phase (if they begin the phase as the blocker) // When avoiding void zones, blocking bots will move along the beam to continue blocking -bool NetherspiteBlockGreenBeamAction::Execute(Event event) +bool NetherspiteBlockGreenBeamAction::Execute(Event /*event*/) { Unit* netherspite = AI_VALUE2(Unit*, "find target", "netherspite"); if (!netherspite) @@ -864,7 +864,7 @@ bool NetherspiteBlockGreenBeamAction::Execute(Event event) } // All bots not currently blocking a beam will avoid beams and void zones -bool NetherspiteAvoidBeamAndVoidZoneAction::Execute(Event event) +bool NetherspiteAvoidBeamAndVoidZoneAction::Execute(Event /*event*/) { Unit* netherspite = AI_VALUE2(Unit*, "find target", "netherspite"); if (!netherspite) @@ -980,7 +980,7 @@ bool NetherspiteAvoidBeamAndVoidZoneAction::IsAwayFromBeams( return true; } -bool NetherspiteBanishPhaseAvoidVoidZoneAction::Execute(Event event) +bool NetherspiteBanishPhaseAvoidVoidZoneAction::Execute(Event /*event*/) { std::vector voidZones = GetAllVoidZones(botAI, bot); @@ -993,7 +993,7 @@ bool NetherspiteBanishPhaseAvoidVoidZoneAction::Execute(Event event) return false; } -bool NetherspiteManageTimersAndTrackersAction::Execute(Event event) +bool NetherspiteManageTimersAndTrackersAction::Execute(Event /*event*/) { Unit* netherspite = AI_VALUE2(Unit*, "find target", "netherspite"); if (!netherspite) @@ -1045,7 +1045,7 @@ bool NetherspiteManageTimersAndTrackersAction::Execute(Event event) // Move away from the boss to avoid Shadow Nova when Enfeebled // Do not cross within Infernal Hellfire radius while doing so -bool PrinceMalchezaarEnfeebledAvoidHazardAction::Execute(Event event) +bool PrinceMalchezaarEnfeebledAvoidHazardAction::Execute(Event /*event*/) { Unit* malchezaar = AI_VALUE2(Unit*, "find target", "prince malchezaar"); if (!malchezaar) @@ -1057,7 +1057,6 @@ bool PrinceMalchezaarEnfeebledAvoidHazardAction::Execute(Event event) const float minSafeBossDistanceSq = minSafeBossDistance * minSafeBossDistance; const float maxSafeBossDistance = 60.0f; const float safeInfernalDistance = 23.0f; - const float safeInfernalDistanceSq = safeInfernalDistance * safeInfernalDistance; const float distIncrement = 0.5f; const uint8 numAngles = 64; @@ -1122,7 +1121,7 @@ bool PrinceMalchezaarEnfeebledAvoidHazardAction::Execute(Event event) // Move away from infernals while staying within range of the boss // Prioritize finding a safe path to the new location, but will fallback to just finding a safe location if needed -bool PrinceMalchezaarNonTankAvoidInfernalAction::Execute(Event event) +bool PrinceMalchezaarNonTankAvoidInfernalAction::Execute(Event /*event*/) { Unit* malchezaar = AI_VALUE2(Unit*, "find target", "prince malchezaar"); if (!malchezaar) @@ -1189,7 +1188,7 @@ bool PrinceMalchezaarNonTankAvoidInfernalAction::Execute(Event event) // This is similar to the non-tank avoid infernal action, but the movement is based on the bot's location // And the safe distance from infernals is larger to give melee more room to maneuver -bool PrinceMalchezaarMainTankMovementAction::Execute(Event event) +bool PrinceMalchezaarMainTankMovementAction::Execute(Event /*event*/) { Unit* malchezaar = AI_VALUE2(Unit*, "find target", "prince malchezaar"); if (!malchezaar) @@ -1255,7 +1254,7 @@ bool PrinceMalchezaarMainTankMovementAction::Execute(Event event) // The tank position is near the Southeastern area of the Master's Terrace // The tank moves Nightbane into position in two steps to try to get Nightbane to face sideways to the raid -bool NightbaneGroundPhasePositionBossAction::Execute(Event event) +bool NightbaneGroundPhasePositionBossAction::Execute(Event /*event*/) { Unit* nightbane = AI_VALUE2(Unit*, "find target", "nightbane"); if (!nightbane) @@ -1301,7 +1300,7 @@ bool NightbaneGroundPhasePositionBossAction::Execute(Event event) // Ranged bots rotate between 3 positions to avoid standing in Charred Earth, which lasts for // 30s and has a minimum cooldown of 18s (so there can be 2 active at once) // Ranged positions are near the Northeastern door to the tower -bool NightbaneGroundPhaseRotateRangedPositionsAction::Execute(Event event) +bool NightbaneGroundPhaseRotateRangedPositionsAction::Execute(Event /*event*/) { const ObjectGuid botGuid = bot->GetGUID(); uint8 index = nightbaneRangedStep.count(botGuid) ? nightbaneRangedStep[botGuid] : 0; @@ -1345,7 +1344,7 @@ bool NightbaneGroundPhaseRotateRangedPositionsAction::Execute(Event event) } // For countering Bellowing Roars during the ground phase -bool NightbaneCastFearWardOnMainTankAction::Execute(Event event) +bool NightbaneCastFearWardOnMainTankAction::Execute(Event /*event*/) { Player* mainTank = nullptr; if (Group* group = bot->GetGroup()) @@ -1368,7 +1367,7 @@ bool NightbaneCastFearWardOnMainTankAction::Execute(Event event) } // Put pets on passive during the flight phase so they don't try to chase Nightbane off the map -bool NightbaneControlPetAggressionAction::Execute(Event event) +bool NightbaneControlPetAggressionAction::Execute(Event /*event*/) { Unit* nightbane = AI_VALUE2(Unit*, "find target", "nightbane"); if (!nightbane) @@ -1394,7 +1393,7 @@ bool NightbaneControlPetAggressionAction::Execute(Event event) // 2. Once Rain of Bones hits, the whole party moves to a new stack position // This action lasts for the first 35 seconds of the flight phase, after which Nightbane gets // ready to land, and the player will need to lead the bots over near the ground phase position -bool NightbaneFlightPhaseMovementAction::Execute(Event event) +bool NightbaneFlightPhaseMovementAction::Execute(Event /*event*/) { Unit* nightbane = AI_VALUE2(Unit*, "find target", "nightbane"); if (!nightbane || nightbane->GetPositionZ() <= NIGHTBANE_FLIGHT_Z) @@ -1440,7 +1439,7 @@ bool NightbaneFlightPhaseMovementAction::Execute(Event event) return false; } -bool NightbaneManageTimersAndTrackersAction::Execute(Event event) +bool NightbaneManageTimersAndTrackersAction::Execute(Event /*event*/) { Unit* nightbane = AI_VALUE2(Unit*, "find target", "nightbane"); if (!nightbane) diff --git a/src/Ai/Raid/Karazhan/Util/RaidKarazhanHelpers.cpp b/src/Ai/Raid/Karazhan/Util/RaidKarazhanHelpers.cpp index ea989dcf31f..513920e1117 100644 --- a/src/Ai/Raid/Karazhan/Util/RaidKarazhanHelpers.cpp +++ b/src/Ai/Raid/Karazhan/Util/RaidKarazhanHelpers.cpp @@ -1,5 +1,4 @@ #include "RaidKarazhanHelpers.h" -#include "RaidKarazhanActions.h" #include "Playerbots.h" namespace KarazhanHelpers @@ -304,10 +303,8 @@ namespace KarazhanHelpers { float sx = start.GetPositionX(); float sy = start.GetPositionY(); - float sz = start.GetPositionZ(); float tx = target.GetPositionX(); float ty = target.GetPositionY(); - float tz = target.GetPositionZ(); const float totalDist = start.GetExactDist2d(target.GetPositionX(), target.GetPositionY()); if (totalDist == 0.0f) @@ -318,7 +315,6 @@ namespace KarazhanHelpers float t = checkDist / totalDist; float checkX = sx + (tx - sx) * t; float checkY = sy + (ty - sy) * t; - float checkZ = sz + (tz - sz) * t; for (Unit* hazard : hazards) { const float hx = checkX - hazard->GetPositionX(); diff --git a/src/Ai/Raid/Magtheridon/Action/RaidMagtheridonActions.cpp b/src/Ai/Raid/Magtheridon/Action/RaidMagtheridonActions.cpp index 7f1ad5b859f..ffe446965d6 100644 --- a/src/Ai/Raid/Magtheridon/Action/RaidMagtheridonActions.cpp +++ b/src/Ai/Raid/Magtheridon/Action/RaidMagtheridonActions.cpp @@ -8,7 +8,7 @@ using namespace MagtheridonHelpers; -bool MagtheridonMainTankAttackFirstThreeChannelersAction::Execute(Event event) +bool MagtheridonMainTankAttackFirstThreeChannelersAction::Execute(Event /*event*/) { Unit* magtheridon = AI_VALUE2(Unit*, "find target", "magtheridon"); if (!magtheridon) @@ -67,7 +67,7 @@ bool MagtheridonMainTankAttackFirstThreeChannelersAction::Execute(Event event) return false; } -bool MagtheridonFirstAssistTankAttackNWChannelerAction::Execute(Event event) +bool MagtheridonFirstAssistTankAttackNWChannelerAction::Execute(Event /*event*/) { Creature* channelerDiamond = GetChanneler(bot, NORTHWEST_CHANNELER); if (!channelerDiamond) @@ -100,7 +100,7 @@ bool MagtheridonFirstAssistTankAttackNWChannelerAction::Execute(Event event) return false; } -bool MagtheridonSecondAssistTankAttackNEChannelerAction::Execute(Event event) +bool MagtheridonSecondAssistTankAttackNEChannelerAction::Execute(Event /*event*/) { Creature* channelerTriangle = GetChanneler(bot, NORTHEAST_CHANNELER); if (!channelerTriangle) @@ -134,7 +134,7 @@ bool MagtheridonSecondAssistTankAttackNEChannelerAction::Execute(Event event) } // Misdirect West & East Channelers to Main Tank -bool MagtheridonMisdirectHellfireChannelers::Execute(Event event) +bool MagtheridonMisdirectHellfireChannelers::Execute(Event /*event*/) { Group* group = bot->GetGroup(); if (!group) @@ -211,7 +211,7 @@ bool MagtheridonMisdirectHellfireChannelers::Execute(Event event) return false; } -bool MagtheridonAssignDPSPriorityAction::Execute(Event event) +bool MagtheridonAssignDPSPriorityAction::Execute(Event /*event*/) { // Listed in order of priority Creature* channelerSquare = GetChanneler(bot, SOUTH_CHANNELER); @@ -285,7 +285,7 @@ bool MagtheridonAssignDPSPriorityAction::Execute(Event event) // Assign Burning Abyssals to Warlocks to Banish // Burning Abyssals in excess of Warlocks in party will be Feared -bool MagtheridonWarlockCCBurningAbyssalAction::Execute(Event event) +bool MagtheridonWarlockCCBurningAbyssalAction::Execute(Event /*event*/) { Group* group = bot->GetGroup(); if (!group) @@ -338,7 +338,7 @@ bool MagtheridonWarlockCCBurningAbyssalAction::Execute(Event event) } // Main tank will back up to the Northern point of the room -bool MagtheridonMainTankPositionBossAction::Execute(Event event) +bool MagtheridonMainTankPositionBossAction::Execute(Event /*event*/) { Unit* magtheridon = AI_VALUE2(Unit*, "find target", "magtheridon"); if (!magtheridon) @@ -376,7 +376,7 @@ bool MagtheridonMainTankPositionBossAction::Execute(Event event) std::unordered_map MagtheridonSpreadRangedAction::initialPositions; std::unordered_map MagtheridonSpreadRangedAction::hasReachedInitialPosition; -bool MagtheridonSpreadRangedAction::Execute(Event event) +bool MagtheridonSpreadRangedAction::Execute(Event /*event*/) { Unit* magtheridon = AI_VALUE2(Unit*, "find target", "magtheridon"); if (!magtheridon) @@ -486,7 +486,7 @@ bool MagtheridonSpreadRangedAction::Execute(Event event) // For bots that are assigned to click cubes // Magtheridon casts Blast Nova every 54.35 to 55.40s, with a 2s cast time -bool MagtheridonUseManticronCubeAction::Execute(Event event) +bool MagtheridonUseManticronCubeAction::Execute(Event /*event*/) { Unit* magtheridon = AI_VALUE2(Unit*, "find target", "magtheridon"); if (!magtheridon) @@ -627,7 +627,7 @@ bool MagtheridonUseManticronCubeAction::HandleCubeInteraction(const CubeInfo& cu // is not interrupted or takes too long to interrupt, the timer will be thrown off for the rest of the encounter. // Correcting this issue is complicated and probably would need some rewriting--I have not done so and // and view the current solution as sufficient since in TBC a missed Blast Nova would be a guaranteed wipe anyway. -bool MagtheridonManageTimersAndAssignmentsAction::Execute(Event event) +bool MagtheridonManageTimersAndAssignmentsAction::Execute(Event /*event*/) { Unit* magtheridon = AI_VALUE2(Unit*, "find target", "magtheridon"); if (!magtheridon) diff --git a/src/Ai/Raid/MoltenCore/Action/RaidMcActions.cpp b/src/Ai/Raid/MoltenCore/Action/RaidMcActions.cpp index b18c8b85343..d2bc2edc1ba 100644 --- a/src/Ai/Raid/MoltenCore/Action/RaidMcActions.cpp +++ b/src/Ai/Raid/MoltenCore/Action/RaidMcActions.cpp @@ -2,7 +2,6 @@ #include "Playerbots.h" #include "RtiTargetValue.h" -#include "RaidMcTriggers.h" #include "RaidMcHelpers.h" static constexpr float LIVING_BOMB_DISTANCE = 20.0f; @@ -20,12 +19,12 @@ static constexpr float CORE_RAGER_STEP_DISTANCE = 5.0f; using namespace MoltenCoreHelpers; -bool McMoveFromGroupAction::Execute(Event event) +bool McMoveFromGroupAction::Execute(Event /*event*/) { return MoveFromGroup(LIVING_BOMB_DISTANCE); } -bool McMoveFromBaronGeddonAction::Execute(Event event) +bool McMoveFromBaronGeddonAction::Execute(Event /*event*/) { if (Unit* boss = AI_VALUE2(Unit*, "find target", "baron geddon")) { @@ -42,7 +41,7 @@ bool McMoveFromBaronGeddonAction::Execute(Event event) return false; } -bool McShazzrahMoveAwayAction::Execute(Event event) +bool McShazzrahMoveAwayAction::Execute(Event /*event*/) { if (Unit* boss = AI_VALUE2(Unit*, "find target", "shazzrah")) { @@ -53,7 +52,7 @@ bool McShazzrahMoveAwayAction::Execute(Event event) return false; } -bool McGolemaggMarkBossAction::Execute(Event event) +bool McGolemaggMarkBossAction::Execute(Event /*event*/) { if (Unit* boss = AI_VALUE2(Unit*, "find target", "golemagg the incinerator")) { @@ -115,7 +114,7 @@ bool McGolemaggTankAction::FindCoreRagers(Unit*& coreRager1, Unit*& coreRager2) return coreRager1 != nullptr && coreRager2 != nullptr; } -bool McGolemaggMainTankAttackGolemaggAction::Execute(Event event) +bool McGolemaggMainTankAttackGolemaggAction::Execute(Event /*event*/) { // At this point, we know we are not the last living tank in the group. if (Unit* boss = AI_VALUE2(Unit*, "find target", "golemagg the incinerator")) diff --git a/src/Ai/Raid/ObsidianSanctum/Action/RaidOsActions.cpp b/src/Ai/Raid/ObsidianSanctum/Action/RaidOsActions.cpp index 2ee68bca4b3..ee9dfb0f752 100644 --- a/src/Ai/Raid/ObsidianSanctum/Action/RaidOsActions.cpp +++ b/src/Ai/Raid/ObsidianSanctum/Action/RaidOsActions.cpp @@ -3,7 +3,7 @@ #include "Playerbots.h" -bool SartharionTankPositionAction::Execute(Event event) +bool SartharionTankPositionAction::Execute(Event /*event*/) { Unit* boss = AI_VALUE2(Unit*, "find target", "sartharion"); if (!boss) { return false; } @@ -84,7 +84,7 @@ bool SartharionTankPositionAction::Execute(Event event) return false; } -bool AvoidTwilightFissureAction::Execute(Event event) +bool AvoidTwilightFissureAction::Execute(Event /*event*/) { const float radius = 5.0f; @@ -104,7 +104,7 @@ bool AvoidTwilightFissureAction::Execute(Event event) return false; } -bool AvoidFlameTsunamiAction::Execute(Event event) +bool AvoidFlameTsunamiAction::Execute(Event /*event*/) { // Adjustable, this is the acceptable distance to stack point that will be accepted as "safe" float looseDistance = 4.0f; @@ -167,7 +167,7 @@ bool AvoidFlameTsunamiAction::Execute(Event event) return false; } -bool SartharionAttackPriorityAction::Execute(Event event) +bool SartharionAttackPriorityAction::Execute(Event /*event*/) { Unit* sartharion = AI_VALUE2(Unit*, "find target", "sartharion"); Unit* shadron = AI_VALUE2(Unit*, "find target", "shadron"); @@ -206,7 +206,7 @@ bool SartharionAttackPriorityAction::Execute(Event event) return false; } -bool EnterTwilightPortalAction::Execute(Event event) +bool EnterTwilightPortalAction::Execute(Event /*event*/) { Unit* boss = AI_VALUE2(Unit*, "find target", "sartharion"); if (!boss || !boss->HasAura(SPELL_GIFT_OF_TWILIGHT_FIRE)) { return false; } @@ -227,7 +227,7 @@ bool EnterTwilightPortalAction::Execute(Event event) return true; } -bool ExitTwilightPortalAction::Execute(Event event) +bool ExitTwilightPortalAction::Execute(Event /*event*/) { GameObject* portal = bot->FindNearestGameObject(GO_NORMAL_PORTAL, 100.0f); if (!portal) { return false; } diff --git a/src/Ai/Raid/Onyxia/Action/RaidOnyxiaActions.cpp b/src/Ai/Raid/Onyxia/Action/RaidOnyxiaActions.cpp index 9fa4612bf65..e2fe3cbe6d7 100644 --- a/src/Ai/Raid/Onyxia/Action/RaidOnyxiaActions.cpp +++ b/src/Ai/Raid/Onyxia/Action/RaidOnyxiaActions.cpp @@ -1,4 +1,3 @@ -// RaidOnyxiaActions.cpp #include "RaidOnyxiaActions.h" #include "GenericSpellActions.h" @@ -7,7 +6,7 @@ #include "Playerbots.h" #include "PositionAction.h" -bool RaidOnyxiaMoveToSideAction::Execute(Event event) +bool RaidOnyxiaMoveToSideAction::Execute(Event /*event*/) { Unit* boss = AI_VALUE2(Unit*, "find target", "onyxia"); if (!boss) @@ -38,7 +37,7 @@ bool RaidOnyxiaMoveToSideAction::Execute(Event event) return false; } -bool RaidOnyxiaSpreadOutAction::Execute(Event event) +bool RaidOnyxiaSpreadOutAction::Execute(Event /*event*/) { Unit* boss = AI_VALUE2(Unit*, "find target", "onyxia"); @@ -64,7 +63,7 @@ bool RaidOnyxiaSpreadOutAction::Execute(Event event) return MoveFromGroup(9.0f); // move 9 yards } -bool RaidOnyxiaMoveToSafeZoneAction::Execute(Event event) +bool RaidOnyxiaMoveToSafeZoneAction::Execute(Event /*event*/) { Unit* boss = AI_VALUE2(Unit*, "find target", "onyxia"); if (!boss) @@ -105,7 +104,7 @@ bool RaidOnyxiaMoveToSafeZoneAction::Execute(Event event) false, false, false, false, MovementPriority::MOVEMENT_COMBAT); } -bool RaidOnyxiaKillWhelpsAction::Execute(Event event) +bool RaidOnyxiaKillWhelpsAction::Execute(Event /*event*/) { Unit* currentTarget = AI_VALUE(Unit*, "current target"); // If already attacking a whelp, don't swap targets @@ -129,7 +128,7 @@ bool RaidOnyxiaKillWhelpsAction::Execute(Event event) return false; } -bool OnyxiaAvoidEggsAction::Execute(Event event) +bool OnyxiaAvoidEggsAction::Execute(Event /*event*/) { Position botPos = Position(bot->GetPositionX(), bot->GetPositionY(), bot->GetPositionZ()); diff --git a/src/Ai/Raid/Ulduar/Action/RaidUlduarActions.cpp b/src/Ai/Raid/Ulduar/Action/RaidUlduarActions.cpp index f7eca38db1e..15db518a73d 100644 --- a/src/Ai/Raid/Ulduar/Action/RaidUlduarActions.cpp +++ b/src/Ai/Raid/Ulduar/Action/RaidUlduarActions.cpp @@ -47,7 +47,7 @@ const Position yoggPortalLoc[] = { {1960.62f, -32.00f, 325.5f}, {1981.98f, -5.69f, 325.5f}, {1982.78f, -45.73f, 325.5f}, {2000.66f, -29.68f, 325.5f}, {1999.88f, -19.61f, 325.5f}, {1961.37f, -19.54f, 325.5f}}; -bool FlameLeviathanVehicleAction::Execute(Event event) +bool FlameLeviathanVehicleAction::Execute(Event /*event*/) { vehicleBase_ = bot->GetVehicleBase(); vehicle_ = bot->GetVehicle(); @@ -269,7 +269,7 @@ bool FlameLeviathanVehicleAction::ChopperAction(Unit* target) return false; } -bool FlameLeviathanEnterVehicleAction::Execute(Event event) +bool FlameLeviathanEnterVehicleAction::Execute(Event /*event*/) { // do not switch vehicles yet if (bot->GetVehicle()) @@ -414,7 +414,7 @@ bool FlameLeviathanEnterVehicleAction::AllMainVehiclesOnUse() return demolisher >= maxC && siege >= maxC; } -bool RazorscaleAvoidDevouringFlameAction::Execute(Event event) +bool RazorscaleAvoidDevouringFlameAction::Execute(Event /*event*/) { RazorscaleBossHelper razorscaleHelper(botAI); @@ -495,7 +495,7 @@ bool RazorscaleAvoidDevouringFlameAction::isUseful() return false; // No nearby flames or bot is at a safe distance } -bool RazorscaleAvoidSentinelAction::Execute(Event event) +bool RazorscaleAvoidSentinelAction::Execute(Event /*event*/) { bool isMainTank = botAI->IsMainTank(bot); bool isRanged = botAI->IsRanged(bot); @@ -617,7 +617,7 @@ bool RazorscaleAvoidSentinelAction::isUseful() return false; } -bool RazorscaleAvoidWhirlwindAction::Execute(Event event) +bool RazorscaleAvoidWhirlwindAction::Execute(Event /*event*/) { if (botAI->IsTank(bot)) { @@ -734,24 +734,18 @@ bool RazorscaleIgnoreBossAction::isUseful() return false; } -bool RazorscaleIgnoreBossAction::Execute(Event event) +bool RazorscaleIgnoreBossAction::Execute(Event /*event*/) { if (!bot) - { return false; - } Unit* boss = AI_VALUE2(Unit*, "find target", "razorscale"); if (!boss) - { return false; - } Group* group = bot->GetGroup(); if (!group) - { return false; - } // Check if the bot is outside the designated area and move inside first if (bot->GetDistance2d(RazorscaleBossHelper::RAZORSCALE_ARENA_CENTER_X, @@ -764,17 +758,13 @@ bool RazorscaleIgnoreBossAction::Execute(Event event) } if (!botAI->IsTank(bot)) - { return false; - } // Check if the boss is already set as the moon marker int8 moonIndex = 4; ObjectGuid currentMoonTarget = group->GetTargetIcon(moonIndex); if (currentMoonTarget == boss->GetGUID()) - { return false; // Moon marker is already correctly set - } // Get the main tank and determine role Unit* mainTankUnit = AI_VALUE(Unit*, "main tank"); @@ -809,9 +799,7 @@ bool RazorscaleGroundedAction::isUseful() { Unit* boss = AI_VALUE2(Unit*, "find target", "razorscale"); if (!boss || !boss->IsAlive() || boss->GetPositionZ() > RazorscaleBossHelper::RAZORSCALE_FLYING_Z_THRESHOLD) - { return false; - } if (botAI->IsMainTank(bot)) { @@ -854,9 +842,7 @@ bool RazorscaleGroundedAction::isUseful() } if (botAI->IsMelee(bot)) - { return false; - } if (botAI->IsRanged(bot)) { @@ -891,7 +877,7 @@ bool RazorscaleGroundedAction::isUseful() return false; } -bool RazorscaleGroundedAction::Execute(Event event) +bool RazorscaleGroundedAction::Execute(Event /*event*/) { Unit* boss = AI_VALUE2(Unit*, "find target", "razorscale"); if (!boss || !boss->IsAlive() || boss->GetPositionZ() > RazorscaleBossHelper::RAZORSCALE_FLYING_Z_THRESHOLD) @@ -974,12 +960,10 @@ bool RazorscaleGroundedAction::Execute(Event event) return false; } -bool RazorscaleHarpoonAction::Execute(Event event) +bool RazorscaleHarpoonAction::Execute(Event /*event*/) { if (!bot) - { return false; - } RazorscaleBossHelper razorscaleHelper(botAI); @@ -1142,7 +1126,7 @@ bool RazorscaleFuseArmorAction::isUseful() return false; } -bool RazorscaleFuseArmorAction::Execute(Event event) +bool RazorscaleFuseArmorAction::Execute(Event /*event*/) { // We already know from isUseful() that: // 1) This bot can tank, AND @@ -1161,7 +1145,7 @@ bool IronAssemblyLightningTendrilsAction::isUseful() return ironAssemblyLightningTendrilsTrigger.IsActive(); } -bool IronAssemblyLightningTendrilsAction::Execute(Event event) +bool IronAssemblyLightningTendrilsAction::Execute(Event /*event*/) { const float radius = 18.0f + 10.0f; // 18 yards + 10 yards for safety @@ -1185,7 +1169,7 @@ bool IronAssemblyOverloadAction::isUseful() return ironAssemblyOverloadTrigger.IsActive(); } -bool IronAssemblyOverloadAction::Execute(Event event) +bool IronAssemblyOverloadAction::Execute(Event /*event*/) { const float radius = 20.0f + 5.0f; // 20 yards + 5 yards for safety @@ -1209,7 +1193,7 @@ bool IronAssemblyRuneOfPowerAction::isUseful() return ironAssemblyRuneOfPowerTrigger.IsActive(); } -bool IronAssemblyRuneOfPowerAction::Execute(Event event) +bool IronAssemblyRuneOfPowerAction::Execute(Event /*event*/) { Unit* target = botAI->GetUnit(bot->GetTarget()); if (!target || !target->IsAlive()) @@ -1224,7 +1208,7 @@ bool KologarnMarkDpsTargetAction::isUseful() return kologarnMarkDpsTargetTrigger.IsActive(); } -bool KologarnMarkDpsTargetAction::Execute(Event event) +bool KologarnMarkDpsTargetAction::Execute(Event /*event*/) { Unit* targetToMark = nullptr; Unit* additionalTargetToMark = nullptr; @@ -1359,7 +1343,7 @@ bool KologarnMarkDpsTargetAction::Execute(Event event) return false; } -bool KologarnFallFromFloorAction::Execute(Event event) +bool KologarnFallFromFloorAction::Execute(Event /*event*/) { return bot->TeleportTo(bot->GetMapId(), ULDUAR_KOLOGARN_RESTORE_POSITION.GetPositionX(), ULDUAR_KOLOGARN_RESTORE_POSITION.GetPositionY(), @@ -1373,7 +1357,7 @@ bool KologarnFallFromFloorAction::isUseful() return kologarnFallFromFloorTrigger.IsActive(); } -bool KologarnRubbleSlowdownAction::Execute(Event event) +bool KologarnRubbleSlowdownAction::Execute(Event /*event*/) { Group* group = bot->GetGroup(); if (!group) @@ -1388,7 +1372,7 @@ bool KologarnRubbleSlowdownAction::Execute(Event event) return botAI->CastSpell("frost trap", currentSkullUnit); } -bool KologarnEyebeamAction::Execute(Event event) +bool KologarnEyebeamAction::Execute(Event /*event*/) { float distanceToLeftPoint = bot->GetExactDist(ULDUAR_KOLOGARN_EYEBEAM_LEFT_POSITION); float distanceToRightPoint = bot->GetExactDist(ULDUAR_KOLOGARN_EYEBEAM_RIGHT_POSITION); @@ -1447,7 +1431,7 @@ bool KologarnRtiTargetAction::isUseful() return kologarnRtiTargetTrigger.IsActive(); } -bool KologarnRtiTargetAction::Execute(Event event) +bool KologarnRtiTargetAction::Execute(Event /*event*/) { if (botAI->IsMainTank(bot) || botAI->IsAssistTankOfIndex(bot, 0)) { @@ -1470,13 +1454,13 @@ bool KologarnCrunchArmorAction::isUseful() return botAI->HasCheat(BotCheatMask::raid); } -bool KologarnCrunchArmorAction::Execute(Event event) +bool KologarnCrunchArmorAction::Execute(Event /*event*/) { bot->RemoveAura(SPELL_CRUNCH_ARMOR); return true; } -bool AuriayaFallFromFloorAction::Execute(Event event) +bool AuriayaFallFromFloorAction::Execute(Event /*event*/) { Player* master = botAI->GetMaster(); @@ -1522,7 +1506,7 @@ bool HodirMoveSnowpackedIcicleAction::isUseful() return true; } -bool HodirMoveSnowpackedIcicleAction::Execute(Event event) +bool HodirMoveSnowpackedIcicleAction::Execute(Event /*event*/) { Creature* target = bot->FindNearestCreature(NPC_SNOWPACKED_ICICLE, 100.0f); if (!target) @@ -1532,7 +1516,7 @@ bool HodirMoveSnowpackedIcicleAction::Execute(Event event) false, false, true, MovementPriority::MOVEMENT_NORMAL, true); } -bool HodirBitingColdJumpAction::Execute(Event event) +bool HodirBitingColdJumpAction::Execute(Event /*event*/) { bot->RemoveAurasDueToSpell(SPELL_BITING_COLD_PLAYER_AURA); @@ -1588,7 +1572,7 @@ bool FreyaMoveAwayNatureBombAction::isUseful() return true; } -bool FreyaMoveAwayNatureBombAction::Execute(Event event) +bool FreyaMoveAwayNatureBombAction::Execute(Event /*event*/) { GameObject* target = bot->FindNearestGameObject(GOBJECT_NATURE_BOMB, 12.0f); if (!target) @@ -1603,7 +1587,7 @@ bool FreyaMarkDpsTargetAction::isUseful() return freyaMarkDpsTargetTrigger.IsActive(); } -bool FreyaMarkDpsTargetAction::Execute(Event event) +bool FreyaMarkDpsTargetAction::Execute(Event /*event*/) { Unit* boss = AI_VALUE2(Unit*, "find target", "freya"); if (!boss || !boss->IsAlive()) @@ -1759,7 +1743,7 @@ bool FreyaMoveToHealingSporeAction::isUseful() return freyaMoveToHealingSporeTrigger.IsActive(); } -bool FreyaMoveToHealingSporeAction::Execute(Event event) +bool FreyaMoveToHealingSporeAction::Execute(Event /*event*/) { GuidVector targets = AI_VALUE(GuidVector, "nearest npcs"); Creature* nearestSpore = nullptr; @@ -1801,7 +1785,7 @@ bool ThorimUnbalancingStrikeAction::isUseful() return botAI->HasCheat(BotCheatMask::raid); } -bool ThorimUnbalancingStrikeAction::Execute(Event event) +bool ThorimUnbalancingStrikeAction::Execute(Event /*event*/) { bot->RemoveAura(SPELL_UNBALANCING_STRIKE); return true; @@ -1813,7 +1797,7 @@ bool ThorimMarkDpsTargetAction::isUseful() return thorimMarkDpsTargetTrigger.IsActive(); } -bool ThorimMarkDpsTargetAction::Execute(Event event) +bool ThorimMarkDpsTargetAction::Execute(Event /*event*/) { Unit* targetToMark = nullptr; @@ -1914,7 +1898,7 @@ bool ThorimArenaPositioningAction::isUseful() return thorimArenaPositioningTrigger.IsActive(); } -bool ThorimArenaPositioningAction::Execute(Event event) +bool ThorimArenaPositioningAction::Execute(Event /*event*/) { FollowMasterStrategy followMasterStrategy(botAI); @@ -1936,7 +1920,7 @@ bool ThorimGauntletPositioningAction::isUseful() return thorimGauntletPositioningTrigger.IsActive(); } -bool ThorimGauntletPositioningAction::Execute(Event event) +bool ThorimGauntletPositioningAction::Execute(Event /*event*/) { FollowMasterStrategy followMasterStrategy(botAI); @@ -2110,7 +2094,7 @@ bool ThorimGauntletPositioningAction::Execute(Event event) return false; } -bool ThorimFallFromFloorAction::Execute(Event event) +bool ThorimFallFromFloorAction::Execute(Event /*event*/) { Player* master = botAI->GetMaster(); @@ -2127,7 +2111,7 @@ bool ThorimFallFromFloorAction::isUseful() return thorimFallFromFloorTrigger.IsActive(); } -bool ThorimPhase2PositioningAction::Execute(Event event) +bool ThorimPhase2PositioningAction::Execute(Event /*event*/) { Position targetPosition; bool backward = false; @@ -2187,7 +2171,7 @@ bool ThorimPhase2PositioningAction::isUseful() return thorimPhase2PositioningTrigger.IsActive(); } -bool MimironShockBlastAction::Execute(Event event) +bool MimironShockBlastAction::Execute(Event /*event*/) { Unit* leviathanMkII = nullptr; Unit* vx001 = nullptr; @@ -2261,7 +2245,7 @@ bool MimironShockBlastAction::isUseful() return mimironShockBlastTrigger.IsActive(); } -bool MimironPhase1PositioningAction::Execute(Event event) +bool MimironPhase1PositioningAction::Execute(Event /*event*/) { SET_AI_VALUE(float, "disperse distance", 6.0f); return true; @@ -2273,7 +2257,7 @@ bool MimironPhase1PositioningAction::isUseful() return mimironPhase1PositioningTrigger.IsActive(); } -bool MimironP3Wx2LaserBarrageAction::Execute(Event event) +bool MimironP3Wx2LaserBarrageAction::Execute(Event /*event*/) { auto master = botAI->GetMaster(); if (!master || !master->IsAlive()) @@ -2297,7 +2281,7 @@ bool MimironRapidBurstAction::isUseful() return mimironRapidBurstTrigger.IsActive(); } -bool MimironRapidBurstAction::Execute(Event event) +bool MimironRapidBurstAction::Execute(Event /*event*/) { Unit* leviathanMkII = nullptr; @@ -2404,7 +2388,7 @@ bool MimironRapidBurstAction::Execute(Event event) return true; } -bool MimironAerialCommandUnitAction::Execute(Event event) +bool MimironAerialCommandUnitAction::Execute(Event /*event*/) { Unit* boss = nullptr; Unit* bombBot = nullptr; @@ -2476,7 +2460,7 @@ bool MimironRocketStrikeAction::isUseful() return mimironRocketStrikeTrigger.IsActive(); } -bool MimironRocketStrikeAction::Execute(Event event) +bool MimironRocketStrikeAction::Execute(Event /*event*/) { Unit* leviathanMkII = nullptr; Unit* vx001 = nullptr; @@ -2491,25 +2475,19 @@ bool MimironRocketStrikeAction::Execute(Event event) continue; if (target->GetEntry() == NPC_LEVIATHAN_MKII) - { leviathanMkII = target; - } + else if (target->GetEntry() == NPC_VX001) - { vx001 = target; - } + else if (target->GetEntry() == NPC_AERIAL_COMMAND_UNIT) - { aerialCommandUnit = target; - } } Creature* rocketStrikeN = bot->FindNearestCreature(NPC_ROCKET_STRIKE_N, 100.0f); if (!rocketStrikeN) - { return false; - } if (!vx001 && !aerialCommandUnit) { @@ -2537,7 +2515,7 @@ bool MimironRocketStrikeAction::Execute(Event event) } } -bool MimironPhase4MarkDpsAction::Execute(Event event) +bool MimironPhase4MarkDpsAction::Execute(Event /*event*/) { Unit* leviathanMkII = nullptr; Unit* vx001 = nullptr; @@ -2626,7 +2604,7 @@ bool MimironPhase4MarkDpsAction::Execute(Event event) } } -bool MimironCheatAction::Execute(Event event) +bool MimironCheatAction::Execute(Event /*event*/) { GuidVector targets = AI_VALUE(GuidVector, "nearest npcs"); for (const ObjectGuid& guid : targets) @@ -2648,7 +2626,7 @@ bool MimironCheatAction::Execute(Event event) return true; } -bool VezaxCheatAction::Execute(Event event) +bool VezaxCheatAction::Execute(Event /*event*/) { // Restore bot's mana to full uint32 maxMana = bot->GetMaxPower(POWER_MANA); @@ -2660,7 +2638,7 @@ bool VezaxCheatAction::Execute(Event event) return true; } -bool VezaxShadowCrashAction::Execute(Event event) +bool VezaxShadowCrashAction::Execute(Event /*event*/) { // Find General Vezax boss Unit* boss = AI_VALUE2(Unit*, "find target", "general vezax"); @@ -2704,7 +2682,7 @@ bool VezaxShadowCrashAction::Execute(Event event) true); } -bool VezaxMarkOfTheFacelessAction::Execute(Event event) +bool VezaxMarkOfTheFacelessAction::Execute(Event /*event*/) { return MoveTo(bot->GetMapId(), ULDUAR_VEZAX_MARK_OF_THE_FACELESS_SPOT.GetPositionX(), ULDUAR_VEZAX_MARK_OF_THE_FACELESS_SPOT.GetPositionY(), @@ -2712,7 +2690,7 @@ bool VezaxMarkOfTheFacelessAction::Execute(Event event) MovementPriority::MOVEMENT_FORCED, true, false); } -bool YoggSaronOminousCloudCheatAction::Execute(Event event) +bool YoggSaronOminousCloudCheatAction::Execute(Event /*event*/) { YoggSaronTrigger yoggSaronTrigger(botAI); @@ -2732,14 +2710,14 @@ bool YoggSaronOminousCloudCheatAction::Execute(Event event) return true; } -bool YoggSaronGuardianPositioningAction::Execute(Event event) +bool YoggSaronGuardianPositioningAction::Execute(Event /*event*/) { return MoveTo(bot->GetMapId(), ULDUAR_YOGG_SARON_MIDDLE.GetPositionX(), ULDUAR_YOGG_SARON_MIDDLE.GetPositionY(), ULDUAR_YOGG_SARON_MIDDLE.GetPositionZ(), false, false, false, true, MovementPriority::MOVEMENT_FORCED, true, false); } -bool YoggSaronSanityAction::Execute(Event event) +bool YoggSaronSanityAction::Execute(Event /*event*/) { Creature* sanityWell = bot->FindNearestCreature(NPC_SANITY_WELL, 200.0f); @@ -2748,7 +2726,7 @@ bool YoggSaronSanityAction::Execute(Event event) true, false); } -bool YoggSaronMarkTargetAction::Execute(Event event) +bool YoggSaronMarkTargetAction::Execute(Event /*event*/) { Group* group = bot->GetGroup(); if (!group) @@ -2877,7 +2855,7 @@ bool YoggSaronMarkTargetAction::Execute(Event event) return false; } -bool YoggSaronBrainLinkAction::Execute(Event event) +bool YoggSaronBrainLinkAction::Execute(Event /*event*/) { Group* group = bot->GetGroup(); if (!group) @@ -2897,7 +2875,7 @@ bool YoggSaronBrainLinkAction::Execute(Event event) return false; } -bool YoggSaronMoveToEnterPortalAction::Execute(Event event) +bool YoggSaronMoveToEnterPortalAction::Execute(Event /*event*/) { Group* group = bot->GetGroup(); if (!group) @@ -2966,7 +2944,7 @@ bool YoggSaronMoveToEnterPortalAction::Execute(Event event) } } -bool YoggSaronFallFromFloorAction::Execute(Event event) +bool YoggSaronFallFromFloorAction::Execute(Event /*event*/) { std::string rtiMark = AI_VALUE(std::string, "rti"); if (rtiMark == "skull") @@ -2998,7 +2976,7 @@ bool YoggSaronFallFromFloorAction::Execute(Event event) return false; } -bool YoggSaronBossRoomMovementCheatAction::Execute(Event event) +bool YoggSaronBossRoomMovementCheatAction::Execute(Event /*event*/) { FollowMasterStrategy followMasterStrategy(botAI); if (botAI->HasStrategy(followMasterStrategy.getName(), BotState::BOT_STATE_NON_COMBAT)) @@ -3034,7 +3012,7 @@ bool YoggSaronBossRoomMovementCheatAction::Execute(Event event) currentSkullUnit->GetPositionZ(), bot->GetOrientation()); } -bool YoggSaronUsePortalAction::Execute(Event event) +bool YoggSaronUsePortalAction::Execute(Event /*event*/) { Creature* assignedPortal = bot->FindNearestCreature(NPC_DESCEND_INTO_MADNESS, 2.0f, true); if (!assignedPortal) @@ -3051,7 +3029,7 @@ bool YoggSaronUsePortalAction::Execute(Event event) return assignedPortal->HandleSpellClick(bot); } -bool YoggSaronIllusionRoomAction::Execute(Event event) +bool YoggSaronIllusionRoomAction::Execute(Event /*event*/) { YoggSaronTrigger yoggSaronTrigger(botAI); @@ -3173,30 +3151,23 @@ bool YoggSaronIllusionRoomAction::SetBrainRtiTarget(YoggSaronTrigger yoggSaronTr return true; } -bool YoggSaronMoveToExitPortalAction::Execute(Event event) +bool YoggSaronMoveToExitPortalAction::Execute(Event /*event*/) { GameObject* portal = bot->FindNearestGameObject(GO_FLEE_TO_THE_SURFACE_PORTAL, 100.0f); if (!portal) - { return false; - } if (botAI->HasCheat(BotCheatMask::raid)) - { bot->TeleportTo(bot->GetMapId(), portal->GetPositionX(), portal->GetPositionY(), portal->GetPositionZ(), bot->GetOrientation()); - } + else - { MoveTo(bot->GetMapId(), portal->GetPositionX(), portal->GetPositionY(), portal->GetPositionZ(), false, false, false, true, MovementPriority::MOVEMENT_FORCED, true, false); - } if (bot->GetDistance2d(portal) > 2.0f) - { return false; - } portal->Use(bot); @@ -3204,13 +3175,12 @@ bool YoggSaronMoveToExitPortalAction::Execute(Event event) return true; } -bool YoggSaronLunaticGazeAction::Execute(Event event) +bool YoggSaronLunaticGazeAction::Execute(Event /*event*/) { Unit* boss = AI_VALUE2(Unit*, "find target", "yogg-saron"); if (!boss || !boss->IsAlive()) - { return false; - } + float angle = bot->GetAngle(boss); float newAngle = Position::NormalizeOrientation(angle + M_PI); // Add 180 degrees (PI radians) bot->SetFacingTo(newAngle); @@ -3218,15 +3188,14 @@ bool YoggSaronLunaticGazeAction::Execute(Event event) if (botAI->IsRangedDps(bot)) { if (AI_VALUE(std::string, "rti") != "cross") - { botAI->GetAiObjectContext()->GetValue("rti")->Set("cross"); - } + } return true; } -bool YoggSaronPhase3PositioningAction::Execute(Event event) +bool YoggSaronPhase3PositioningAction::Execute(Event /*event*/) { if (botAI->IsRanged(bot)) { diff --git a/src/Ai/Raid/Ulduar/Trigger/RaidUlduarTriggers.cpp b/src/Ai/Raid/Ulduar/Trigger/RaidUlduarTriggers.cpp index f14a513118c..a99ea8dbce9 100644 --- a/src/Ai/Raid/Ulduar/Trigger/RaidUlduarTriggers.cpp +++ b/src/Ai/Raid/Ulduar/Trigger/RaidUlduarTriggers.cpp @@ -1,6 +1,5 @@ #include "RaidUlduarTriggers.h" -#include "EventMap.h" #include "GameObject.h" #include "Object.h" #include "PlayerbotAI.h" @@ -350,7 +349,6 @@ bool KologarnMarkDpsTargetTrigger::IsActive() if (!target) continue; - uint32 creatureId = target->GetEntry(); if (target->GetEntry() == NPC_RUBBLE && target->IsAlive()) { return true; // Found a rubble to mark @@ -1094,7 +1092,7 @@ bool ThorimPhase2PositioningTrigger::IsActive() Unit* boss = AI_VALUE2(Unit*, "find target", "thorim"); if (!boss || !boss->IsInWorld() || boss->IsDuringRemoveFromWorld()) - return false; + return false; if (!boss->IsAlive()) return false; @@ -1193,17 +1191,14 @@ bool MimironPhase1PositioningTrigger::IsActive() continue; if (target->GetEntry() == NPC_LEVIATHAN_MKII) - { leviathanMkII = target; - } + else if (target->GetEntry() == NPC_VX001) - { return false; - } + else if (target->GetEntry() == NPC_AERIAL_COMMAND_UNIT) - { return false; - } + } if (!leviathanMkII || !leviathanMkII->IsAlive()) @@ -1796,7 +1791,7 @@ Unit* YoggSaronTrigger::GetIllusionRoomRtiTarget() return nullptr; } - uint8 rtiIndex = RtiTargetValue::GetRtiIndex(AI_VALUE(std::string, "rti")); + int32_t rtiIndex = RtiTargetValue::GetRtiIndex(AI_VALUE(std::string, "rti")); if (rtiIndex == -1) { return nullptr; // Invalid RTI mark @@ -1816,21 +1811,16 @@ Unit* YoggSaronTrigger::GetNextIllusionRoomRtiTarget() { float detectionRadius = 0.0f; if (IsInStormwindKeeperIllusion()) - { detectionRadius = ULDUAR_YOGG_SARON_STORMWIND_KEEPER_RADIUS; - } + else if (IsInIcecrownKeeperIllusion()) - { detectionRadius = ULDUAR_YOGG_SARON_ICECROWN_CITADEL_RADIUS; - } + else if (IsInChamberOfTheAspectsIllusion()) - { detectionRadius = ULDUAR_YOGG_SARON_CHAMBER_OF_ASPECTS_RADIUS; - } + else - { return nullptr; - } GuidVector targets = AI_VALUE(GuidVector, "nearest npcs"); @@ -1840,9 +1830,7 @@ Unit* YoggSaronTrigger::GetNextIllusionRoomRtiTarget() { Unit* unit = botAI->GetUnit(guid); if (unit && unit->IsAlive() && unit->GetEntry() == NPC_LAUGHING_SKULL) - { return unit; - } } } @@ -1875,9 +1863,7 @@ Unit* YoggSaronTrigger::GetNextIllusionRoomRtiTarget() { Creature* target = bot->FindNearestCreature(NPC_SUIT_OF_ARMOR, detectionRadius, true); if (target) - { return target; - } } return nullptr; @@ -1886,25 +1872,17 @@ Unit* YoggSaronTrigger::GetNextIllusionRoomRtiTarget() bool YoggSaronOminousCloudCheatTrigger::IsActive() { if (!botAI->HasCheat(BotCheatMask::raid)) - { return false; - } Unit* boss = GetSaraIfAlive(); if (!boss) - { return false; - } if (!botAI->IsBotMainTank(bot)) - { return false; - } if (bot->GetDistance2d(boss->GetPositionX(), boss->GetPositionY()) > 50.0f) - { return false; - } Creature* target = boss->FindNearestCreature(NPC_OMINOUS_CLOUD, 25.0f, true); @@ -1914,14 +1892,10 @@ bool YoggSaronOminousCloudCheatTrigger::IsActive() bool YoggSaronGuardianPositioningTrigger::IsActive() { if (!GetSaraIfAlive()) - { return false; - } if (!botAI->IsTank(bot)) - { return false; - } GuidVector targets = AI_VALUE(GuidVector, "nearest npcs"); bool thereIsAnyGuardian = false; @@ -1930,9 +1904,7 @@ bool YoggSaronGuardianPositioningTrigger::IsActive() { Unit* unit = botAI->GetUnit(guid); if (!unit || !unit->IsAlive()) - { continue; - } if (unit->GetEntry() == NPC_GUARDIAN_OF_YS) { @@ -1940,9 +1912,7 @@ bool YoggSaronGuardianPositioningTrigger::IsActive() ObjectGuid unitTargetGuid = unit->GetTarget(); Player* targetedPlayer = botAI->GetPlayer(unitTargetGuid); if (!targetedPlayer || !botAI->IsTank(targetedPlayer)) - { return false; - } } } @@ -1955,18 +1925,14 @@ bool YoggSaronSanityTrigger::IsActive() Aura* sanityAura = bot->GetAura(SPELL_SANITY); if (!sanityAura) - { return false; - } int sanityAuraStacks = sanityAura->GetStackAmount(); Creature* sanityWell = bot->FindNearestCreature(NPC_SANITY_WELL, 200.0f); if (!sanityWell) - { return false; - } float distanceToSanityWell = bot->GetDistance(sanityWell); @@ -1989,20 +1955,14 @@ bool YoggSaronMaladyOfTheMindTrigger::IsActive() bool YoggSaronMarkTargetTrigger::IsActive() { if (!IsYoggSaronFight()) - { return false; - } if (!botAI->IsBotMainTank(bot)) - { return false; - } Group* group = bot->GetGroup(); if (!group) - { return false; - } if (IsPhase2()) { @@ -2020,9 +1980,7 @@ bool YoggSaronMarkTargetTrigger::IsActive() { nextPossibleTarget = bot->FindNearestCreature(NPC_CORRUPTOR_TENTACLE, 200.0f, true); if (!nextPossibleTarget) - { return false; - } } if (currentSkullTarget) @@ -2030,14 +1988,10 @@ bool YoggSaronMarkTargetTrigger::IsActive() Unit* currentSkullUnit = botAI->GetUnit(currentSkullTarget); if (!currentSkullUnit) - { return true; - } if (currentSkullUnit->IsAlive() && currentSkullUnit->GetGUID() == nextPossibleTarget->GetGUID()) - { return false; - } } return true; @@ -2047,9 +2001,7 @@ bool YoggSaronMarkTargetTrigger::IsActive() ObjectGuid currentSkullTarget = group->GetTargetIcon(RtiTargetValue::skullIndex); Unit* currentSkullUnit = nullptr; if (currentSkullTarget) - { currentSkullUnit = botAI->GetUnit(currentSkullTarget); - } if (currentSkullUnit && (currentSkullUnit->GetEntry() == NPC_IMMORTAL_GUARDIAN || @@ -2064,21 +2016,15 @@ bool YoggSaronMarkTargetTrigger::IsActive() { Unit* unit = botAI->GetUnit(guid); if (!unit || !unit->IsAlive()) - { continue; - } if ((unit->GetEntry() == NPC_IMMORTAL_GUARDIAN || unit->GetEntry() == NPC_MARKED_IMMORTAL_GUARDIAN) && unit->GetHealthPct() > 10) - { return true; - } } if (!currentSkullUnit || currentSkullUnit->GetEntry() != NPC_YOGG_SARON) - { return true; - } return false; } @@ -2096,61 +2042,41 @@ bool YoggSaronBrainLinkTrigger::IsActive() bool YoggSaronMoveToEnterPortalTrigger::IsActive() { if (!IsPhase2()) - { return false; - } Creature* portal = bot->FindNearestCreature(NPC_DESCEND_INTO_MADNESS, 100.0f, true); if (!portal) - { return false; - } if (bot->GetDistance2d(portal->GetPositionX(), portal->GetPositionY()) < 2.0f) - { return false; - } if (AI_VALUE(std::string, "rti") != "skull") - { return false; - } Group* group = bot->GetGroup(); if (!group) - { return false; - } int brainRoomTeamCount = 10; if (bot->GetRaidDifficulty() == Difficulty::RAID_DIFFICULTY_10MAN_NORMAL) - { brainRoomTeamCount = 4; - } if (IsMasterIsInIllusionGroup()) - { brainRoomTeamCount--; - } for (GroupReference* gref = group->GetFirstMember(); gref; gref = gref->next()) { Player* member = gref->GetSource(); if (!member || !member->IsAlive() || botAI->IsTank(member)) - { continue; - } if (member->GetGUID() == bot->GetGUID()) - { return true; - } brainRoomTeamCount--; if (brainRoomTeamCount == 0) - { break; - } } return false; @@ -2159,20 +2085,15 @@ bool YoggSaronMoveToEnterPortalTrigger::IsActive() bool YoggSaronFallFromFloorTrigger::IsActive() { if (!IsYoggSaronFight()) - { return false; - } std::string rtiMark = AI_VALUE(std::string, "rti"); if (rtiMark == "skull" && bot->GetPositionZ() < ULDUAR_YOGG_SARON_BOSS_ROOM_AXIS_Z_PATHING_ISSUE_DETECT) - { return true; - } + if ((rtiMark == "cross" || rtiMark == "circle" || rtiMark == "star") && bot->GetPositionZ() < ULDUAR_YOGG_SARON_BRAIN_ROOM_AXIS_Z_PATHING_ISSUE_DETECT) - { return true; - } return false; } @@ -2180,44 +2101,31 @@ bool YoggSaronFallFromFloorTrigger::IsActive() bool YoggSaronBossRoomMovementCheatTrigger::IsActive() { if (!IsYoggSaronFight() || !IsPhase2()) - { return false; - } FollowMasterStrategy followMasterStrategy(botAI); if (botAI->HasStrategy(followMasterStrategy.getName(), BotState::BOT_STATE_NON_COMBAT)) - { return true; - } if (!botAI->HasCheat(BotCheatMask::raid)) - { return false; - } if (AI_VALUE(std::string, "rti") != "skull") - { return false; - } Group* group = bot->GetGroup(); if (!group) - { return false; - } + ObjectGuid currentSkullTarget = group->GetTargetIcon(RtiTargetValue::skullIndex); if (!currentSkullTarget) - { return false; - } Unit* currentSkullUnit = botAI->GetUnit(currentSkullTarget); if (!currentSkullUnit || !currentSkullUnit->IsAlive() || bot->GetDistance2d(currentSkullUnit->GetPositionX(), currentSkullUnit->GetPositionY()) < 40.0f) - { return false; - } return true; } @@ -2225,14 +2133,10 @@ bool YoggSaronBossRoomMovementCheatTrigger::IsActive() bool YoggSaronUsePortalTrigger::IsActive() { if (!IsPhase2()) - { return false; - } if (AI_VALUE(std::string, "rti") != "diamond") - { return false; - } return bot->FindNearestCreature(NPC_DESCEND_INTO_MADNESS, 2.0f, true) != nullptr; } @@ -2240,24 +2144,16 @@ bool YoggSaronUsePortalTrigger::IsActive() bool YoggSaronIllusionRoomTrigger::IsActive() { if (!IsYoggSaronFight() || !IsInIllusionRoom() || AI_VALUE(std::string, "rti") == "square") - { return false; - } if (SetRtiMarkRequired()) - { return true; - } if (SetRtiTargetRequired()) - { return true; - } if (GoToBrainRoomRequired()) - { return true; - } return false; } @@ -2265,9 +2161,7 @@ bool YoggSaronIllusionRoomTrigger::IsActive() bool YoggSaronIllusionRoomTrigger::GoToBrainRoomRequired() { if (AI_VALUE(std::string, "rti") == "square") - { return false; - } return IsMasterIsInBrainRoom(); } @@ -2281,9 +2175,7 @@ bool YoggSaronIllusionRoomTrigger::SetRtiTargetRequired() { Unit const* currentRtiTarget = GetIllusionRoomRtiTarget(); if (currentRtiTarget != nullptr) - { return false; - } return GetNextIllusionRoomRtiTarget() != nullptr; } @@ -2291,15 +2183,11 @@ bool YoggSaronIllusionRoomTrigger::SetRtiTargetRequired() bool YoggSaronMoveToExitPortalTrigger::IsActive() { if (!IsYoggSaronFight() || !IsInBrainLevel()) - { return false; - } Creature const* brain = bot->FindNearestCreature(NPC_BRAIN, 60.0f, true); if (!brain || !brain->IsAlive()) - { return false; - } if (brain->HasUnitState(UNIT_STATE_CASTING)) { @@ -2316,9 +2204,7 @@ bool YoggSaronMoveToExitPortalTrigger::IsActive() } } else if (brain->GetHealth() < brain->GetMaxHealth() * 0.3f) - { return true; - } return false; } @@ -2331,9 +2217,7 @@ bool YoggSaronLunaticGazeTrigger::IsActive() { Spell* currentSpell = yoggsaron->GetCurrentSpell(CURRENT_CHANNELED_SPELL); if (currentSpell && currentSpell->m_spellInfo->Id == SPELL_LUNATIC_GAZE_YS) - { return true; - } } return false; @@ -2342,15 +2226,11 @@ bool YoggSaronLunaticGazeTrigger::IsActive() bool YoggSaronPhase3PositioningTrigger::IsActive() { if (!IsYoggSaronFight() || !IsPhase3()) - { return false; - } YoggSaronSanityTrigger sanityTrigger(botAI); if (sanityTrigger.IsActive()) - { return false; - } if (botAI->IsRanged(bot) && bot->GetDistance2d(ULDUAR_YOGG_SARON_PHASE_3_RANGED_SPOT.GetPositionX(), ULDUAR_YOGG_SARON_PHASE_3_RANGED_SPOT.GetPositionY()) > 15.0f) @@ -2368,9 +2248,7 @@ bool YoggSaronPhase3PositioningTrigger::IsActive() if (botAI->IsTank(bot)) { if (bot->GetDistance(ULDUAR_YOGG_SARON_PHASE_3_MELEE_SPOT) > 30.0f) - { return true; - } GuidVector targets = AI_VALUE(GuidVector, "nearest npcs"); bool thereIsAnyGuardian = false; @@ -2379,9 +2257,7 @@ bool YoggSaronPhase3PositioningTrigger::IsActive() { Unit* unit = botAI->GetUnit(guid); if (!unit || !unit->IsAlive()) - { continue; - } if (unit->GetEntry() == NPC_IMMORTAL_GUARDIAN || unit->GetEntry() == NPC_MARKED_IMMORTAL_GUARDIAN) { @@ -2389,9 +2265,7 @@ bool YoggSaronPhase3PositioningTrigger::IsActive() ObjectGuid unitTargetGuid = unit->GetTarget(); Player* targetedPlayer = botAI->GetPlayer(unitTargetGuid); if (!targetedPlayer || !botAI->IsTank(targetedPlayer)) - { return false; - } } } diff --git a/src/Ai/Raid/VaultOfArchavon/Action/RaidVoAActions.cpp b/src/Ai/Raid/VaultOfArchavon/Action/RaidVoAActions.cpp index 05d6328e5cf..892ddf3eb43 100644 --- a/src/Ai/Raid/VaultOfArchavon/Action/RaidVoAActions.cpp +++ b/src/Ai/Raid/VaultOfArchavon/Action/RaidVoAActions.cpp @@ -10,7 +10,7 @@ const Position VOA_EMALON_RESTORE_POSITION = Position(-221.8f, -243.8f, 96.8f, 4.7f); -bool EmalonMarkBossAction::Execute(Event event) +bool EmalonMarkBossAction::Execute(Event /*event*/) { Unit* boss = AI_VALUE2(Unit*, "find target", "emalon the storm watcher"); if (!boss || !boss->IsAlive()) @@ -72,7 +72,7 @@ bool EmalonMarkBossAction::isUseful() return emalonMarkBossTrigger.IsActive(); } -bool EmalonLightingNovaAction::Execute(Event event) +bool EmalonLightingNovaAction::Execute(Event /*event*/) { const float radius = 25.0f; // 20 yards + 5 yard for safety for 10 man. For 25man there is no maximum range but 25 yards should be ok @@ -96,7 +96,7 @@ bool EmalonLightingNovaAction::isUseful() return emalonLightingNovaTrigger.IsActive(); } -bool EmalonOverchargeAction::Execute(Event event) +bool EmalonOverchargeAction::Execute(Event /*event*/) { // Check if there is any overcharged minion Unit* minion = nullptr; @@ -173,7 +173,7 @@ bool EmalonOverchargeAction::isUseful() return emalonOverchargeTrigger.IsActive(); } -bool EmalonFallFromFloorAction::Execute(Event event) +bool EmalonFallFromFloorAction::Execute(Event /*event*/) { return bot->TeleportTo(bot->GetMapId(), VOA_EMALON_RESTORE_POSITION.GetPositionX(), VOA_EMALON_RESTORE_POSITION.GetPositionY(), VOA_EMALON_RESTORE_POSITION.GetPositionZ(), diff --git a/src/Ai/World/Rpg/Action/NewRpgAction.cpp b/src/Ai/World/Rpg/Action/NewRpgAction.cpp index 2c42741c885..6ccb8454810 100644 --- a/src/Ai/World/Rpg/Action/NewRpgAction.cpp +++ b/src/Ai/World/Rpg/Action/NewRpgAction.cpp @@ -1,12 +1,10 @@ #include "NewRpgAction.h" #include -#include #include #include "BroadcastHelper.h" #include "ChatHelper.h" -#include "DBCStores.h" #include "G3D/Vector2.h" #include "GossipDef.h" #include "IVMapMgr.h" @@ -20,16 +18,11 @@ #include "PathGenerator.h" #include "Player.h" #include "PlayerbotAI.h" -#include "Playerbots.h" -#include "Position.h" #include "QuestDef.h" #include "Random.h" -#include "RandomPlayerbotMgr.h" #include "SharedDefines.h" -#include "StatsWeightCalculator.h" #include "Timer.h" #include "TravelMgr.h" -#include "World.h" bool TellRpgStatusAction::Execute(Event event) { @@ -61,7 +54,7 @@ bool StartRpgDoQuestAction::Execute(Event event) return false; } -bool NewRpgStatusUpdateAction::Execute(Event event) +bool NewRpgStatusUpdateAction::Execute(Event /*event*/) { NewRpgInfo& info = botAI->rpgInfo; NewRpgStatus status = info.GetStatus(); @@ -153,7 +146,7 @@ bool NewRpgStatusUpdateAction::Execute(Event event) return false; } -bool NewRpgGoGrindAction::Execute(Event event) +bool NewRpgGoGrindAction::Execute(Event /*event*/) { if (SearchQuestGiverAndAcceptOrReward()) return true; @@ -163,7 +156,7 @@ bool NewRpgGoGrindAction::Execute(Event event) return false; } -bool NewRpgGoCampAction::Execute(Event event) +bool NewRpgGoCampAction::Execute(Event /*event*/) { if (SearchQuestGiverAndAcceptOrReward()) return true; @@ -174,7 +167,7 @@ bool NewRpgGoCampAction::Execute(Event event) return false; } -bool NewRpgWanderRandomAction::Execute(Event event) +bool NewRpgWanderRandomAction::Execute(Event /*event*/) { if (SearchQuestGiverAndAcceptOrReward()) return true; @@ -182,7 +175,7 @@ bool NewRpgWanderRandomAction::Execute(Event event) return MoveRandomNear(); } -bool NewRpgWanderNpcAction::Execute(Event event) +bool NewRpgWanderNpcAction::Execute(Event /*event*/) { NewRpgInfo& info = botAI->rpgInfo; auto* dataPtr = std::get_if(&info.data); @@ -227,7 +220,7 @@ bool NewRpgWanderNpcAction::Execute(Event event) return true; } -bool NewRpgDoQuestAction::Execute(Event event) +bool NewRpgDoQuestAction::Execute(Event /*event*/) { if (SearchQuestGiverAndAcceptOrReward()) return true; @@ -423,7 +416,7 @@ bool NewRpgDoQuestAction::DoCompletedQuest(NewRpgInfo::DoQuest& data) return false; } -bool NewRpgTravelFlightAction::Execute(Event event) +bool NewRpgTravelFlightAction::Execute(Event /*event*/) { NewRpgInfo& info = botAI->rpgInfo; auto* dataPtr = std::get_if(&info.data); diff --git a/src/Ai/World/Rpg/Strategy/NewRpgStrategy.cpp b/src/Ai/World/Rpg/Strategy/NewRpgStrategy.cpp index 030ad6b4fc2..f0d0ce5a923 100644 --- a/src/Ai/World/Rpg/Strategy/NewRpgStrategy.cpp +++ b/src/Ai/World/Rpg/Strategy/NewRpgStrategy.cpp @@ -5,8 +5,6 @@ #include "NewRpgStrategy.h" -#include "Playerbots.h" - NewRpgStrategy::NewRpgStrategy(PlayerbotAI* botAI) : Strategy(botAI) {} std::vector NewRpgStrategy::getDefaultActions() @@ -69,7 +67,6 @@ void NewRpgStrategy::InitTriggers(std::vector& triggers) ); } -void NewRpgStrategy::InitMultipliers(std::vector& multipliers) +void NewRpgStrategy::InitMultipliers(std::vector&) { - } diff --git a/src/Bot/Cmd/PlayerbotCommandServer.cpp b/src/Bot/Cmd/PlayerbotCommandServer.cpp index 1532cc05439..7f3de21a2d9 100644 --- a/src/Bot/Cmd/PlayerbotCommandServer.cpp +++ b/src/Bot/Cmd/PlayerbotCommandServer.cpp @@ -10,10 +10,9 @@ #include #include #include -#include +#include "RandomPlayerbotMgr.h" #include "IoContext.h" -#include "Playerbots.h" using boost::asio::ip::tcp; typedef boost::shared_ptr socket_ptr; @@ -48,7 +47,7 @@ void session(socket_ptr sock) std::string buffer, request; while (ReadLine(sock, &buffer, &request)) { - std::string const response = sRandomPlayerbotMgr.HandleRemoteCommand(request) + "\n"; + std::string const response = RandomPlayerbotMgr::instance().HandleRemoteCommand(request) + "\n"; boost::asio::write(*sock, boost::asio::buffer(response.c_str(), response.size())); request = ""; } diff --git a/src/Bot/Engine/Action/Action.h b/src/Bot/Engine/Action/Action.h index 6c54d24b970..084a40a5520 100644 --- a/src/Bot/Engine/Action/Action.h +++ b/src/Bot/Engine/Action/Action.h @@ -6,7 +6,6 @@ #pragma once #include "AiObject.h" -#include "Common.h" #include "Event.h" #include "Value.h" diff --git a/src/Bot/Engine/Strategy/CustomStrategy.cpp b/src/Bot/Engine/Strategy/CustomStrategy.cpp index d4dd3e514e8..65bf411d923 100644 --- a/src/Bot/Engine/Strategy/CustomStrategy.cpp +++ b/src/Bot/Engine/Strategy/CustomStrategy.cpp @@ -36,9 +36,7 @@ std::vector toNextActionArray(const std::string actions) std::vector res = {}; for (const std::string token : tokens) - { res.push_back(toNextAction(token)); - } return res; } diff --git a/src/Bot/Engine/Trigger/Trigger.cpp b/src/Bot/Engine/Trigger/Trigger.cpp index 07105be2991..bfd8eeaed51 100644 --- a/src/Bot/Engine/Trigger/Trigger.cpp +++ b/src/Bot/Engine/Trigger/Trigger.cpp @@ -5,9 +5,8 @@ #include "Trigger.h" +#include "AiObjectContext.h" #include "Event.h" -#include "Playerbots.h" -#include "Timer.h" Trigger::Trigger(PlayerbotAI* botAI, std::string const name, int32 checkInterval) : AiNamedObject(botAI, name), diff --git a/src/Bot/Engine/Trigger/Trigger.h b/src/Bot/Engine/Trigger/Trigger.h index d32845dc521..8878530f8d5 100644 --- a/src/Bot/Engine/Trigger/Trigger.h +++ b/src/Bot/Engine/Trigger/Trigger.h @@ -6,7 +6,6 @@ #pragma once #include "Action.h" -#include "Common.h" class PlayerbotAI; class Unit; diff --git a/src/Bot/Factory/AiFactory.h b/src/Bot/Factory/AiFactory.h index 3d11d80aebe..b853bf6705f 100644 --- a/src/Bot/Factory/AiFactory.h +++ b/src/Bot/Factory/AiFactory.h @@ -7,7 +7,6 @@ #define _PLAYERBOT_AIFACTORY_H #include - #include "Common.h" class AiObjectContext; diff --git a/src/Bot/Factory/PlayerbotFactory.cpp b/src/Bot/Factory/PlayerbotFactory.cpp index ca1f4d1800d..f5026057730 100644 --- a/src/Bot/Factory/PlayerbotFactory.cpp +++ b/src/Bot/Factory/PlayerbotFactory.cpp @@ -5,7 +5,6 @@ #include "PlayerbotFactory.h" -#include #include #include "AccountMgr.h" @@ -20,9 +19,7 @@ #include "ItemTemplate.h" #include "ItemVisitors.h" #include "Log.h" -#include "LogCommon.h" #include "LootMgr.h" -#include "MapMgr.h" #include "ObjectMgr.h" #include "PerfMonitor.h" #include "PetDefines.h" @@ -37,7 +34,6 @@ #include "RandomPlayerbotFactory.h" #include "ReputationMgr.h" #include "SharedDefines.h" -#include "SpellAuraDefines.h" #include "StatsWeightCalculator.h" #include "World.h" #include "AiObjectContext.h" @@ -241,19 +237,17 @@ void PlayerbotFactory::Randomize(bool incremental) Prepare(); LOG_DEBUG("playerbots", "Resetting player..."); PerfMonitorOperation* pmo = sPerfMonitor.start(PERF_MON_RNDBOT, "PlayerbotFactory_Reset"); - if (!sPlayerbotAIConfig.equipmentPersistence || level < sPlayerbotAIConfig.equipmentPersistenceLevel) - { + + if (!PlayerbotAIConfig::instance().equipmentPersistence || level < PlayerbotAIConfig::instance().equipmentPersistenceLevel) bot->resetTalents(true); - } + if (!incremental) { ClearSkills(); ClearSpells(); ResetQuests(); - if (!sPlayerbotAIConfig.equipmentPersistence || level < sPlayerbotAIConfig.equipmentPersistenceLevel) - { + if (!PlayerbotAIConfig::instance().equipmentPersistence || level < PlayerbotAIConfig::instance().equipmentPersistenceLevel) ClearAllItems(); - } } ClearInventory(); bot->RemoveAllSpellCooldown(); @@ -1787,9 +1781,8 @@ void PlayerbotFactory::InitEquipment(bool incremental, bool second_chance) int32 desiredQuality = itemQuality; if (urand(0, 100) < 100 * sPlayerbotAIConfig.randomGearLoweringChance && desiredQuality > ITEM_QUALITY_NORMAL) - { desiredQuality--; - } + do { for (uint32 requiredLevel = bot->GetLevel(); requiredLevel > std::max((int32)bot->GetLevel() - delta, 0); @@ -1973,14 +1966,12 @@ void PlayerbotFactory::InitEquipment(bool incremental, bool second_chance) } if (bestItemForSlot == 0) - { continue; - } + uint16 dest; if (!CanEquipUnseenItem(slot, dest, bestItemForSlot)) - { continue; - } + Item* newItem = bot->EquipNewItem(dest, bestItemForSlot, true); bot->AutoUnequipOffhandIfNeed(); // if (newItem) @@ -2143,21 +2134,18 @@ void PlayerbotFactory::InitBags(bool destroyOld) uint32 newItemId = 51809; Item* old_bag = bot->GetItemByPos(INVENTORY_SLOT_BAG_0, slot); if (old_bag && old_bag->GetTemplate()->ItemId == newItemId) - { continue; - } + uint16 dest; if (!CanEquipUnseenItem(slot, dest, newItemId)) continue; if (old_bag && destroyOld) - { bot->DestroyItem(INVENTORY_SLOT_BAG_0, slot, true); - } + if (old_bag) - { continue; - } + Item* newItem = bot->EquipNewItem(dest, newItemId, true); // if (newItem) // { diff --git a/src/Bot/Factory/RandomPlayerbotFactory.cpp b/src/Bot/Factory/RandomPlayerbotFactory.cpp index e2e6ffb11a7..908bd389932 100644 --- a/src/Bot/Factory/RandomPlayerbotFactory.cpp +++ b/src/Bot/Factory/RandomPlayerbotFactory.cpp @@ -8,17 +8,12 @@ #include "AccountMgr.h" #include "ArenaTeamMgr.h" #include "DatabaseEnv.h" -#include "GuildMgr.h" -#include "PlayerbotFactory.h" -#include "Playerbots.h" -#include "PlayerbotGuildMgr.h" +#include "PlayerbotAI.h" #include "ScriptMgr.h" #include "SharedDefines.h" #include "SocialMgr.h" #include "Timer.h" -#include "Guild.h" // EmblemInfo::SaveToDB #include "Log.h" -#include "GuildMgr.h" constexpr RandomPlayerbotFactory::NameRaceAndGender RandomPlayerbotFactory::CombineRaceAndGender(uint8 race, uint8 gender) diff --git a/src/Bot/PlayerbotAI.cpp b/src/Bot/PlayerbotAI.cpp index c8fc4cb303f..b6afb1c0a8d 100644 --- a/src/Bot/PlayerbotAI.cpp +++ b/src/Bot/PlayerbotAI.cpp @@ -24,7 +24,6 @@ #include "GameObjectData.h" #include "GameTime.h" #include "GuildMgr.h" -#include "GuildTaskMgr.h" #include "LFGMgr.h" #include "LastMovementValue.h" #include "LastSpellCastValue.h" @@ -39,7 +38,6 @@ #include "PerfMonitor.h" #include "Player.h" #include "PlayerbotAIConfig.h" -#include "PlayerbotRepository.h" #include "PlayerbotMgr.h" #include "PlayerbotGuildMgr.h" #include "Playerbots.h" diff --git a/src/Bot/PlayerbotAI.h b/src/Bot/PlayerbotAI.h index 3364b31ac5a..05710548d16 100644 --- a/src/Bot/PlayerbotAI.h +++ b/src/Bot/PlayerbotAI.h @@ -6,13 +6,11 @@ #ifndef _PLAYERBOT_PLAYERbotAI_H #define _PLAYERBOT_PLAYERbotAI_H -#include #include #include "Chat.h" #include "ChatFilter.h" #include "ChatHelper.h" -#include "Common.h" #include "CreatureData.h" #include "Event.h" #include "Item.h" diff --git a/src/Bot/PlayerbotMgr.cpp b/src/Bot/PlayerbotMgr.cpp index 79850ab24ec..03ee1a8fc97 100644 --- a/src/Bot/PlayerbotMgr.cpp +++ b/src/Bot/PlayerbotMgr.cpp @@ -7,7 +7,6 @@ #include #include -#include #include #include #include @@ -20,11 +19,9 @@ #include "Common.h" #include "Define.h" #include "Group.h" -#include "GroupMgr.h" #include "GuildMgr.h" #include "ObjectAccessor.h" #include "ObjectGuid.h" -#include "ObjectMgr.h" #include "PlayerbotAIConfig.h" #include "PlayerbotRepository.h" #include "PlayerbotFactory.h" @@ -126,7 +123,7 @@ void PlayerbotHolder::AddPlayerBot(ObjectGuid playerGuid, uint32 masterAccountId return; } uint32 count = mgr->GetPlayerbotsCount() + botLoading.size(); - if (count >= sPlayerbotAIConfig.maxAddedBots) + if (count >= PlayerbotAIConfig::instance().maxAddedBots) { allowed = false; out << "Failure: You have added too many bots (more than " << sPlayerbotAIConfig.maxAddedBots << ")"; @@ -710,12 +707,11 @@ void PlayerbotHolder::OnBotLogin(Player* const bot) } std::string const PlayerbotHolder::ProcessBotCommand(std::string const cmd, ObjectGuid guid, ObjectGuid masterguid, - bool admin, uint32 masterAccountId, uint32 masterGuildId) + bool admin, uint32 masterAccountId, uint32) { if (!sPlayerbotAIConfig.enabled || guid.IsEmpty()) return "bot system is disabled"; - uint32 botAccount = sCharacterCache->GetCharacterAccountIdByGuid(guid); //bool isRandomBot = sRandomPlayerbotMgr.IsRandomBot(guid.GetCounter()); //not used, line marked for removal. //bool isRandomAccount = sPlayerbotAIConfig.IsInRandomAccountList(botAccount); //not used, shadowed, line marked for removal. //bool isMasterAccount = (masterAccountId == botAccount); //not used, line marked for removal. @@ -730,13 +726,15 @@ std::string const PlayerbotHolder::ProcessBotCommand(std::string const cmd, Obje { uint32 accountId = sCharacterCache->GetCharacterAccountIdByGuid(guid); if (!accountId) + { return "character not found"; + } - if (!sPlayerbotAIConfig.allowAccountBots && accountId != masterAccountId && - !(sPlayerbotAIConfig.allowTrustedAccountBots && IsAccountLinked(accountId, masterAccountId))) - { - return "you can only add bots from your own account or linked accounts"; - } + if (!sPlayerbotAIConfig.allowAccountBots && accountId != masterAccountId && + !(sPlayerbotAIConfig.allowTrustedAccountBots && IsAccountLinked(accountId, masterAccountId))) + { + return "you can only add bots from your own account or linked accounts"; + } } AddPlayerBot(guid, masterAccountId); @@ -1462,7 +1460,7 @@ std::string const PlayerbotHolder::ListBots(Player* master) return out.str(); } -std::string const PlayerbotHolder::LookupBots(Player* master) +std::string const PlayerbotHolder::LookupBots(Player*) { std::list messages; messages.push_back("Classes Available:"); diff --git a/src/Bot/RandomPlayerbotMgr.cpp b/src/Bot/RandomPlayerbotMgr.cpp index 6cdf1fcaebe..412c27a960e 100644 --- a/src/Bot/RandomPlayerbotMgr.cpp +++ b/src/Bot/RandomPlayerbotMgr.cpp @@ -25,7 +25,6 @@ #include "FleeManager.h" #include "FlightMasterCache.h" #include "GridNotifiers.h" -#include "GuildTaskMgr.h" #include "LFGMgr.h" #include "MapMgr.h" #include "NewRpgInfo.h" @@ -3211,40 +3210,38 @@ void RandomPlayerbotMgr::PrintStats() //++revive; } if (bot->IsInCombat()) - { ++combat; - } + if (bot->isMoving()) - { ++moving; - } + if (bot->IsInFlight()) - { ++inFlight; - } + if (bot->IsMounted()) - { ++mounted; - } + if (bot->InBattleground() || bot->InArena()) - { ++inBg; - } + if (bot->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_RESTING)) - { ++rest; - } + if (botAI->GetState() == BOT_STATE_NON_COMBAT) ++engine_noncombat; + else if (botAI->GetState() == BOT_STATE_COMBAT) ++engine_combat; + else ++engine_dead; if (botAI->IsHeal(bot, true)) ++heal; + else if (botAI->IsTank(bot, true)) ++tank; + else ++dps; diff --git a/src/Db/PlayerbotRepository.cpp b/src/Db/PlayerbotRepository.cpp index 886cebb8335..731534edd63 100644 --- a/src/Db/PlayerbotRepository.cpp +++ b/src/Db/PlayerbotRepository.cpp @@ -4,10 +4,7 @@ */ #include "PlayerbotRepository.h" - -#include - -#include "Playerbots.h" +#include "AiObjectContext.h" void PlayerbotRepository::Load(PlayerbotAI* botAI) { diff --git a/src/Mgr/Item/RandomItemMgr.cpp b/src/Mgr/Item/RandomItemMgr.cpp index 4abd2eaa9d0..71fbb9f79ae 100644 --- a/src/Mgr/Item/RandomItemMgr.cpp +++ b/src/Mgr/Item/RandomItemMgr.cpp @@ -2771,9 +2771,8 @@ inline bool IsCraftedBySpellInfo(ItemTemplate const* proto, SpellInfo const* spe } if (proto->ItemId == spellInfo->Reagent[x]) - { return true; - } + } for (uint8 i = 0; i < 3; ++i) @@ -2781,9 +2780,7 @@ inline bool IsCraftedBySpellInfo(ItemTemplate const* proto, SpellInfo const* spe if (spellInfo->Effects[i].Effect == SPELL_EFFECT_CREATE_ITEM) { if (spellInfo->Effects[i].ItemType == proto->ItemId) - { return true; - } } } diff --git a/src/Mgr/Item/StatsCollector.cpp b/src/Mgr/Item/StatsCollector.cpp index 4f719fea4ee..7818dc73867 100644 --- a/src/Mgr/Item/StatsCollector.cpp +++ b/src/Mgr/Item/StatsCollector.cpp @@ -1,18 +1,13 @@ #include "StatsCollector.h" -#include - #include "DBCStores.h" -#include "ItemEnchantmentMgr.h" #include "ItemTemplate.h" -#include "ObjectMgr.h" #include "PlayerbotAI.h" #include "PlayerbotAIAware.h" #include "SharedDefines.h" #include "SpellAuraDefines.h" #include "SpellInfo.h" #include "SpellMgr.h" -#include "UpdateFields.h" #include "Util.h" StatsCollector::StatsCollector(CollectorType type, int32 cls) : type_(type), cls_(cls) { Reset(); } diff --git a/src/Mgr/Talent/Talentspec.cpp b/src/Mgr/Talent/Talentspec.cpp index df647baf10c..7ee760ed46e 100644 --- a/src/Mgr/Talent/Talentspec.cpp +++ b/src/Mgr/Talent/Talentspec.cpp @@ -6,7 +6,9 @@ #include "Talentspec.h" #include "Event.h" -#include "Playerbots.h" +#include "Player.h" +#include "SpellMgr.h" +#include "World.h" uint32 TalentSpec::TalentListEntry::tabPage() const { diff --git a/src/Mgr/Talent/Talentspec.h b/src/Mgr/Talent/Talentspec.h index 8cb63e44d95..83243be0360 100644 --- a/src/Mgr/Talent/Talentspec.h +++ b/src/Mgr/Talent/Talentspec.h @@ -6,7 +6,9 @@ #ifndef _PLAYERBOT_TALENTSPEC_H #define _PLAYERBOT_TALENTSPEC_H -#include "Action.h" +#include +#include +#include "Player.h" struct TalentEntry; struct TalentTabEntry; diff --git a/src/Mgr/Travel/TravelMgr.cpp b/src/Mgr/Travel/TravelMgr.cpp index 1a390d50411..2909df5e507 100644 --- a/src/Mgr/Travel/TravelMgr.cpp +++ b/src/Mgr/Travel/TravelMgr.cpp @@ -1246,9 +1246,8 @@ bool RpgTravelDestination::isActive(Player* bot) for (ObjectGuid const guid : ignoreList) { if (guid.GetEntry() == getEntry()) - { return false; - } + } FactionTemplateEntry const* factionEntry = sFactionTemplateStore.LookupEntry(cInfo->faction); diff --git a/src/Script/Playerbots.cpp b/src/Script/Playerbots.cpp index c4487f89861..94b8eb1b09b 100644 --- a/src/Script/Playerbots.cpp +++ b/src/Script/Playerbots.cpp @@ -71,9 +71,7 @@ class PlayerbotsDatabaseScript : public DatabaseScript } if (revision.empty()) - { revision = "Unknown Playerbots Database Revision"; - } } }; @@ -217,16 +215,12 @@ class PlayerbotsPlayerScript : public PlayerScript Player* const member = itr->GetSource(); if (member == nullptr) - { continue; - } PlayerbotAI* const botAI = PlayerbotsMgr::instance().GetPlayerbotAI(member); if (botAI == nullptr) - { continue; - } botAI->HandleCommand(type, msg, player); } @@ -237,30 +231,22 @@ class PlayerbotsPlayerScript : public PlayerScript bool OnPlayerCanUseChat(Player* player, uint32 type, uint32 /*lang*/, std::string& msg, Guild* guild) override { if (type != CHAT_MSG_GUILD) - { return true; - } PlayerbotMgr* playerbotMgr = PlayerbotsMgr::instance().GetPlayerbotMgr(player); if (playerbotMgr == nullptr) - { return true; - } for (PlayerBotMap::const_iterator it = playerbotMgr->GetPlayerBotsBegin(); it != playerbotMgr->GetPlayerBotsEnd(); ++it) { Player* const bot = it->second; if (bot == nullptr) - { continue; - } if (bot->GetGuildId() != player->GetGuildId()) - { continue; - } PlayerbotsMgr::instance().GetPlayerbotAI(bot)->HandleCommand(type, msg, player); } @@ -273,9 +259,7 @@ class PlayerbotsPlayerScript : public PlayerScript PlayerbotMgr* const playerbotMgr = PlayerbotsMgr::instance().GetPlayerbotMgr(player); if (playerbotMgr != nullptr && channel->GetFlags() & 0x18) - { playerbotMgr->HandleCommand(type, msg); - } sRandomPlayerbotMgr.HandleCommand(type, msg, player); @@ -310,14 +294,10 @@ class PlayerbotsPlayerScript : public PlayerScript { Player* member = gref->GetSource(); if (!member) - { continue; - } if (!member->GetSession()->IsBot()) - { return; - } } } @@ -336,14 +316,10 @@ class PlayerbotsMiscScript : public MiscScript PlayerbotAI* botAI = PlayerbotsMgr::instance().GetPlayerbotAI(player); if (botAI != nullptr) - { delete botAI; - } if (PlayerbotMgr* playerbotMgr = GET_PLAYERBOT_MGR(player)) - { delete playerbotMgr; - } } }; @@ -441,14 +417,10 @@ class PlayerbotsScript : public PlayerbotScript void OnPlayerbotCheckPetitionAccount(Player* player, bool& found) override { if (!found) - { return; - } if (PlayerbotsMgr::instance().GetPlayerbotAI(player) != nullptr) - { found = false; - } } bool OnPlayerbotCheckUpdatesToSend(Player* player) override @@ -456,9 +428,7 @@ class PlayerbotsScript : public PlayerbotScript PlayerbotAI* botAI = PlayerbotsMgr::instance().GetPlayerbotAI(player); if (botAI == nullptr) - { return true; - } return botAI->IsRealPlayer(); } @@ -466,21 +436,15 @@ class PlayerbotsScript : public PlayerbotScript void OnPlayerbotPacketSent(Player* player, WorldPacket const* packet) override { if (player == nullptr) - { return; - } PlayerbotAI* botAI = PlayerbotsMgr::instance().GetPlayerbotAI(player); if (botAI != nullptr) - { botAI->HandleBotOutgoingPacket(*packet); - } if (PlayerbotMgr* playerbotMgr = GET_PLAYERBOT_MGR(player)) - { playerbotMgr->HandleMasterOutgoingPacket(*packet); - } } void OnPlayerbotUpdate(uint32 diff) override diff --git a/src/Script/WorldThr/PlayerbotWorldThreadProcessor.h b/src/Script/WorldThr/PlayerbotWorldThreadProcessor.h index e975b8fbdb0..bd489829ee5 100644 --- a/src/Script/WorldThr/PlayerbotWorldThreadProcessor.h +++ b/src/Script/WorldThr/PlayerbotWorldThreadProcessor.h @@ -11,7 +11,6 @@ #include #include "Log.h" - #include "PlayerbotOperation.h" /** From 3c62a45fad0827b0d0279e9f92f18ab05f9ede4a Mon Sep 17 00:00:00 2001 From: bash Date: Sun, 15 Feb 2026 20:47:26 +0100 Subject: [PATCH 09/25] Revert "Convert PlayerBots tables to InnoDB (#2083)" This reverts commit c86032f43b7bccb861c33769385db7a522e75513. --- .../updates/2026_01_30_00_change_to_InnoDB.sql | 9 --------- .../updates/2026_01_30_00_change_to_InnoDB.sql | 18 ------------------ 2 files changed, 27 deletions(-) delete mode 100644 data/sql/characters/updates/2026_01_30_00_change_to_InnoDB.sql delete mode 100644 data/sql/playerbots/updates/2026_01_30_00_change_to_InnoDB.sql diff --git a/data/sql/characters/updates/2026_01_30_00_change_to_InnoDB.sql b/data/sql/characters/updates/2026_01_30_00_change_to_InnoDB.sql deleted file mode 100644 index 8c2c226b51a..00000000000 --- a/data/sql/characters/updates/2026_01_30_00_change_to_InnoDB.sql +++ /dev/null @@ -1,9 +0,0 @@ --- Temporarily disables innodb_strict_mode for the session to allow the script to complete even if legacy table definitions contain InnoDB-incompatible attributes -SET SESSION innodb_strict_mode = 0; - --- Change the tables to InnoDB -ALTER TABLE playerbots_guild_names ENGINE=InnoDB; -ALTER TABLE playerbots_names ENGINE=InnoDB; - --- Re-enables innodb_strict_mode -SET SESSION innodb_strict_mode = 1; diff --git a/data/sql/playerbots/updates/2026_01_30_00_change_to_InnoDB.sql b/data/sql/playerbots/updates/2026_01_30_00_change_to_InnoDB.sql deleted file mode 100644 index c7f9c51f0a9..00000000000 --- a/data/sql/playerbots/updates/2026_01_30_00_change_to_InnoDB.sql +++ /dev/null @@ -1,18 +0,0 @@ --- Temporarily disables innodb_strict_mode for the session to allow the script to complete even if legacy table definitions contain InnoDB-incompatible attributes -SET SESSION innodb_strict_mode = 0; - --- Change the tables to InnoDB -ALTER TABLE playerbots_dungeon_suggestion_abbrevation ENGINE=InnoDB; -ALTER TABLE playerbots_dungeon_suggestion_definition ENGINE=InnoDB; -ALTER TABLE playerbots_dungeon_suggestion_strategy ENGINE=InnoDB; -ALTER TABLE playerbots_equip_cache ENGINE=InnoDB; -ALTER TABLE playerbots_item_info_cache ENGINE=InnoDB; -ALTER TABLE playerbots_rarity_cache ENGINE=InnoDB; -ALTER TABLE playerbots_rnditem_cache ENGINE=InnoDB; -ALTER TABLE playerbots_tele_cache ENGINE=InnoDB; -ALTER TABLE playerbots_travelnode ENGINE=InnoDB; -ALTER TABLE playerbots_travelnode_link ENGINE=InnoDB; -ALTER TABLE playerbots_travelnode_path ENGINE=InnoDB; - --- Re-enables innodb_strict_mode -SET SESSION innodb_strict_mode = 1; From e37455ff72f697b02dffa9f02266a7c565c1f3e4 Mon Sep 17 00:00:00 2001 From: Wishmaster117 <140754794+Wishmaster117@users.noreply.github.com> Date: Tue, 11 Nov 2025 13:26:11 +0100 Subject: [PATCH 10/25] Fix transport boarding when master is on a transport (Zep/Boats) --- src/Ai/Base/Actions/FollowActions.cpp | 44 +++++++++++++++++++++++++++ src/Bot/PlayerbotAI.cpp | 7 +++++ src/Bot/PlayerbotAI.h | 1 + 3 files changed, 52 insertions(+) diff --git a/src/Ai/Base/Actions/FollowActions.cpp b/src/Ai/Base/Actions/FollowActions.cpp index b9623233a9f..cfc4c553f87 100644 --- a/src/Ai/Base/Actions/FollowActions.cpp +++ b/src/Ai/Base/Actions/FollowActions.cpp @@ -14,12 +14,56 @@ #include "Playerbots.h" #include "ServerFacade.h" #include "SharedDefines.h" +#include "Transport.h" bool FollowAction::Execute(Event event) { Formation* formation = AI_VALUE(Formation*, "formation"); std::string const target = formation->GetTargetName(); + // Transport (Zep + Boats) Fix + Player* master = botAI->GetMaster(); + if (master && master->GetTransport()) + { + Transport* transport = master->GetTransport(); + + // If the bot is not already a passenger on this transport + if (bot->GetTransport() != transport) + { + // Offset to avoid landing under the floor + float offsetX = 1.0f, offsetY = 0.5f, offsetZ = 0.2f; + float x = master->GetPositionX() + offsetX; + float y = master->GetPositionY() + offsetY; + float z = master->GetPositionZ() + offsetZ; + + // Teleports to a position close to the master (world coordinates) + bot->TeleportTo(transport->GetMapId(), x, y, z, master->GetOrientation()); + + // Add as a passenger (server-side) + transport->AddPassenger(bot, true); + + // Force complete cleanup of the movement and flags to avoid + // wrestling between MoveSpline/MotionMaster and the transport driver. + bot->StopMoving(); + // MotionMaster current clear (true to force) then idle to stabilize + bot->GetMotionMaster()->Clear(true); + bot->GetMotionMaster()->MoveIdle(); + + // Ensure that the march/mounted flags are no longer active + bot->m_movementInfo.RemoveMovementFlag(MOVEMENTFLAG_FORWARD); + bot->m_movementInfo.RemoveMovementFlag(MOVEMENTFLAG_WALKING); + + // Allow a slightly longer verification period; during this time + // the server will update the transport status and relative positions. + botAI->SetNextCheckDelay(urand(1000, 2500)); + + LOG_DEBUG("playerbots", "Bot {} boarded transport {} near master {} at {:.2f},{:.2f},{:.2f}", + bot->GetName(), transport->GetGUID().GetCounter(), master->GetName(), x, y, z); + + return true; + } + } // End Transport (Zep + Boats) Fix + bool moved = false; if (!target.empty()) { diff --git a/src/Bot/PlayerbotAI.cpp b/src/Bot/PlayerbotAI.cpp index 96019402d3b..cb0ac8c44e8 100644 --- a/src/Bot/PlayerbotAI.cpp +++ b/src/Bot/PlayerbotAI.cpp @@ -883,6 +883,13 @@ void PlayerbotAI::LeaveOrDisbandGroup() bot->GetSession()->QueuePacket(packet); } +} + +bool PlayerbotAI::IsMasterOnTransport() +{ + return master && master->GetTransport(); +} + bool PlayerbotAI::IsAllowedCommand(std::string const text) { if (unsecuredCommands.empty()) diff --git a/src/Bot/PlayerbotAI.h b/src/Bot/PlayerbotAI.h index 3364b31ac5a..ed9e3bb502a 100644 --- a/src/Bot/PlayerbotAI.h +++ b/src/Bot/PlayerbotAI.h @@ -604,6 +604,7 @@ class PlayerbotAI : public PlayerbotAIBase NewRpgStatistic rpgStatistic; std::unordered_set lowPriorityQuest; time_t bgReleaseAttemptTime = 0; + bool IsMasterOnTransport(); // Schedules a callback to run once after milliseconds. void AddTimedEvent(std::function callback, uint32 delayMs); From 0599bae320576a88a752c238877ca2df04f75c5a Mon Sep 17 00:00:00 2001 From: Wishmaster117 <140754794+Wishmaster117@users.noreply.github.com> Date: Tue, 11 Nov 2025 13:47:55 +0100 Subject: [PATCH 11/25] Opsiee --- src/Bot/PlayerbotAI.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Bot/PlayerbotAI.cpp b/src/Bot/PlayerbotAI.cpp index cb0ac8c44e8..26c76c2e143 100644 --- a/src/Bot/PlayerbotAI.cpp +++ b/src/Bot/PlayerbotAI.cpp @@ -883,8 +883,6 @@ void PlayerbotAI::LeaveOrDisbandGroup() bot->GetSession()->QueuePacket(packet); } -} - bool PlayerbotAI::IsMasterOnTransport() { return master && master->GetTransport(); From d483a9fa58cc6d5bf615ff28e8d7eb3b2a23d5f3 Mon Sep 17 00:00:00 2001 From: Wishmaster117 <140754794+Wishmaster117@users.noreply.github.com> Date: Wed, 12 Nov 2025 15:32:06 +0100 Subject: [PATCH 12/25] Update FollowActions.cpp --- src/Ai/Base/Actions/FollowActions.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Ai/Base/Actions/FollowActions.cpp b/src/Ai/Base/Actions/FollowActions.cpp index cfc4c553f87..9038d96dae1 100644 --- a/src/Ai/Base/Actions/FollowActions.cpp +++ b/src/Ai/Base/Actions/FollowActions.cpp @@ -22,6 +22,7 @@ bool FollowAction::Execute(Event event) std::string const target = formation->GetTargetName(); // Transport (Zep + Boats) Fix + // TODO: Smooth out bot boarding on transports (boats, zeppelins, tram). Player* master = botAI->GetMaster(); if (master && master->GetTransport()) { From 065df95f00e56bb5d67670675509f38c6bba94ca Mon Sep 17 00:00:00 2001 From: Wishmaster117 <140754794+Wishmaster117@users.noreply.github.com> Date: Fri, 14 Nov 2025 14:55:31 +0100 Subject: [PATCH 13/25] Add Elevators handler --- src/Ai/Base/Actions/FollowActions.cpp | 66 ++++++++++++++++++++++++++- 1 file changed, 64 insertions(+), 2 deletions(-) diff --git a/src/Ai/Base/Actions/FollowActions.cpp b/src/Ai/Base/Actions/FollowActions.cpp index 9038d96dae1..bc34833c592 100644 --- a/src/Ai/Base/Actions/FollowActions.cpp +++ b/src/Ai/Base/Actions/FollowActions.cpp @@ -15,19 +15,26 @@ #include "ServerFacade.h" #include "SharedDefines.h" #include "Transport.h" +#include "Map.h" bool FollowAction::Execute(Event event) { Formation* formation = AI_VALUE(Formation*, "formation"); std::string const target = formation->GetTargetName(); - - // Transport (Zep + Boats) Fix + + /* + // Transport (Zep + Boats) Fix // TODO: Smooth out bot boarding on transports (boats, zeppelins, tram). + // TODO: Handle bot's pets Player* master = botAI->GetMaster(); if (master && master->GetTransport()) { Transport* transport = master->GetTransport(); + // Vérification de map : le bot doit être sur la même map que le maître + if (bot->GetMap() != master->GetMap()) + return false; + // If the bot is not already a passenger on this transport if (bot->GetTransport() != transport) { @@ -64,6 +71,61 @@ bool FollowAction::Execute(Event event) return true; } } // End Transport (Zep + Boats) Fix + */ + + // Unified Transport Handling (boats, zeppelins, elevators, platforms) + Player* master = botAI->GetMaster(); + if (master && master->IsInWorld()) + { + Map* map = master->GetMap(); + if (map && bot->GetMap() == map) + { + // Detect any kind of moving transport the master is currently standing on + Transport* transport = master->GetTransport(); + + // Some moving platforms/elevators do not expose a direct Transport* on the master. + // In that case we fall back to a positional lookup on the map while the master + // has the ONTRANSPORT movement flag. + if (!transport && master->m_movementInfo.HasMovementFlag(MOVEMENTFLAG_ONTRANSPORT)) + { + transport = map->GetTransportForPos(master->GetPhaseMask(), + master->GetPositionX(), + master->GetPositionY(), + master->GetPositionZ(), + master); + } + + // If we found a transport and the bot is not yet attached, board it. + if (transport && bot->GetTransport() != transport) + { + float const offsetX = 1.0f; + float const offsetY = 0.5f; + float const offsetZ = 0.2f; + + float const x = master->GetPositionX() + offsetX; + float const y = master->GetPositionY() + offsetY; + float const z = master->GetPositionZ() + offsetZ; + + // Teleport close to the master (world coordinates) and attach as passenger (server-side). + bot->TeleportTo(transport->GetMapId(), x, y, z, master->GetOrientation()); + transport->AddPassenger(bot, true); + + // Reset movement state so the transport driver fully takes over. + bot->StopMoving(); + bot->GetMotionMaster()->Clear(true); + bot->GetMotionMaster()->MoveIdle(); + bot->m_movementInfo.RemoveMovementFlag(MOVEMENTFLAG_FORWARD); + bot->m_movementInfo.RemoveMovementFlag(MOVEMENTFLAG_WALKING); + + botAI->SetNextCheckDelay(urand(1000, 2500)); + LOG_INFO("playerbots", + "Bot {} boarded transport {} near master {} at {:.2f},{:.2f},{:.2f}", + bot->GetName(), transport->GetGUID().GetCounter(), master->GetName(), x, y, z); + return true; + } + } + } + // end unified transport handling bool moved = false; if (!target.empty()) From 845d4bc4456783cb0c3ad7564db0a3f5fa790c2d Mon Sep 17 00:00:00 2001 From: Alex Dcnh <140754794+Wishmaster117@users.noreply.github.com> Date: Fri, 14 Nov 2025 14:58:18 +0100 Subject: [PATCH 14/25] Clean up FollowActions.cpp by removing comments Removed commented-out code related to transport handling. --- src/Ai/Base/Actions/FollowActions.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/Ai/Base/Actions/FollowActions.cpp b/src/Ai/Base/Actions/FollowActions.cpp index bc34833c592..cd20c54cec6 100644 --- a/src/Ai/Base/Actions/FollowActions.cpp +++ b/src/Ai/Base/Actions/FollowActions.cpp @@ -21,11 +21,10 @@ bool FollowAction::Execute(Event event) { Formation* formation = AI_VALUE(Formation*, "formation"); std::string const target = formation->GetTargetName(); - /* // Transport (Zep + Boats) Fix // TODO: Smooth out bot boarding on transports (boats, zeppelins, tram). - // TODO: Handle bot's pets + // TODO: Handle bot's pets Player* master = botAI->GetMaster(); if (master && master->GetTransport()) { @@ -34,7 +33,6 @@ bool FollowAction::Execute(Event event) // Vérification de map : le bot doit être sur la même map que le maître if (bot->GetMap() != master->GetMap()) return false; - // If the bot is not already a passenger on this transport if (bot->GetTransport() != transport) { @@ -72,7 +70,6 @@ bool FollowAction::Execute(Event event) } } // End Transport (Zep + Boats) Fix */ - // Unified Transport Handling (boats, zeppelins, elevators, platforms) Player* master = botAI->GetMaster(); if (master && master->IsInWorld()) From 2ea9f10cccf2b4be16d69c520c6577a0e8975f02 Mon Sep 17 00:00:00 2001 From: Alex Dcnh <140754794+Wishmaster117@users.noreply.github.com> Date: Fri, 14 Nov 2025 15:00:26 +0100 Subject: [PATCH 15/25] Fix comment formatting in FollowActions.cpp --- src/Ai/Base/Actions/FollowActions.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Ai/Base/Actions/FollowActions.cpp b/src/Ai/Base/Actions/FollowActions.cpp index cd20c54cec6..900b8a95865 100644 --- a/src/Ai/Base/Actions/FollowActions.cpp +++ b/src/Ai/Base/Actions/FollowActions.cpp @@ -69,7 +69,7 @@ bool FollowAction::Execute(Event event) return true; } } // End Transport (Zep + Boats) Fix - */ + */ // Unified Transport Handling (boats, zeppelins, elevators, platforms) Player* master = botAI->GetMaster(); if (master && master->IsInWorld()) From 546c03aa814601ddd6bacc8afe49abc4946fadfc Mon Sep 17 00:00:00 2001 From: Alex Dcnh <140754794+Wishmaster117@users.noreply.github.com> Date: Fri, 14 Nov 2025 15:47:05 +0100 Subject: [PATCH 16/25] Fix comment formatting in FollowActions.cpp --- src/Ai/Base/Actions/FollowActions.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Ai/Base/Actions/FollowActions.cpp b/src/Ai/Base/Actions/FollowActions.cpp index 900b8a95865..e60a2ccc853 100644 --- a/src/Ai/Base/Actions/FollowActions.cpp +++ b/src/Ai/Base/Actions/FollowActions.cpp @@ -22,7 +22,7 @@ bool FollowAction::Execute(Event event) Formation* formation = AI_VALUE(Formation*, "formation"); std::string const target = formation->GetTargetName(); /* - // Transport (Zep + Boats) Fix + // Transport (Zep + Boats) Fix // TODO: Smooth out bot boarding on transports (boats, zeppelins, tram). // TODO: Handle bot's pets Player* master = botAI->GetMaster(); From 95c759a36f89c3c9cd7cf75dd9ef7f1cc9e23563 Mon Sep 17 00:00:00 2001 From: Wishmaster117 <140754794+Wishmaster117@users.noreply.github.com> Date: Sun, 14 Dec 2025 23:57:12 +0000 Subject: [PATCH 17/25] Removal of TeleportTo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Removal of TeleportTo: as soon as bots are close enough (≤ 5 yards) to a master who is on a detected transport, they will be attached using AddPassenger and StopMovingOnCurrentPos(). --- src/Ai/Base/Actions/FollowActions.cpp | 116 ++++++++------------------ src/Bot/PlayerbotAI.cpp | 8 +- 2 files changed, 40 insertions(+), 84 deletions(-) diff --git a/src/Ai/Base/Actions/FollowActions.cpp b/src/Ai/Base/Actions/FollowActions.cpp index e60a2ccc853..c7709191fc3 100644 --- a/src/Ai/Base/Actions/FollowActions.cpp +++ b/src/Ai/Base/Actions/FollowActions.cpp @@ -21,69 +21,28 @@ bool FollowAction::Execute(Event event) { Formation* formation = AI_VALUE(Formation*, "formation"); std::string const target = formation->GetTargetName(); - /* - // Transport (Zep + Boats) Fix - // TODO: Smooth out bot boarding on transports (boats, zeppelins, tram). - // TODO: Handle bot's pets - Player* master = botAI->GetMaster(); - if (master && master->GetTransport()) - { - Transport* transport = master->GetTransport(); - - // Vérification de map : le bot doit être sur la même map que le maître - if (bot->GetMap() != master->GetMap()) - return false; - // If the bot is not already a passenger on this transport - if (bot->GetTransport() != transport) - { - // Offset to avoid landing under the floor - float offsetX = 1.0f, offsetY = 0.5f, offsetZ = 0.2f; - float x = master->GetPositionX() + offsetX; - float y = master->GetPositionY() + offsetY; - float z = master->GetPositionZ() + offsetZ; - - // Teleports to a position close to the master (world coordinates) - bot->TeleportTo(transport->GetMapId(), x, y, z, master->GetOrientation()); - - // Add as a passenger (server-side) - transport->AddPassenger(bot, true); - // Force complete cleanup of the movement and flags to avoid - // wrestling between MoveSpline/MotionMaster and the transport driver. - bot->StopMoving(); - // MotionMaster current clear (true to force) then idle to stabilize - bot->GetMotionMaster()->Clear(true); - bot->GetMotionMaster()->MoveIdle(); - - // Ensure that the march/mounted flags are no longer active - bot->m_movementInfo.RemoveMovementFlag(MOVEMENTFLAG_FORWARD); - bot->m_movementInfo.RemoveMovementFlag(MOVEMENTFLAG_WALKING); - - // Allow a slightly longer verification period; during this time - // the server will update the transport status and relative positions. - botAI->SetNextCheckDelay(urand(1000, 2500)); - - LOG_DEBUG("playerbots", "Bot {} boarded transport {} near master {} at {:.2f},{:.2f},{:.2f}", - bot->GetName(), transport->GetGUID().GetCounter(), master->GetName(), x, y, z); - - return true; - } - } // End Transport (Zep + Boats) Fix - */ - // Unified Transport Handling (boats, zeppelins, elevators, platforms) + // Transport Handling (boats, zeppelins, elevators, platforms) + // Let normal follow movement bring the bot close to the master + // Attach the bot as a passenger once it is on (or very close to) the same transport + // Support classic transports (boats, zeppelins, tram) and moving platforms/elevators Player* master = botAI->GetMaster(); - if (master && master->IsInWorld()) + if (master && master->IsInWorld() && bot->IsInWorld()) { - Map* map = master->GetMap(); - if (map && bot->GetMap() == map) + // check master/map + if (bot->GetMapId() == master->GetMapId()) { - // Detect any kind of moving transport the master is currently standing on - Transport* transport = master->GetTransport(); + Map* map = master->GetMap(); + Transport* transport = nullptr; - // Some moving platforms/elevators do not expose a direct Transport* on the master. - // In that case we fall back to a positional lookup on the map while the master - // has the ONTRANSPORT movement flag. - if (!transport && master->m_movementInfo.HasMovementFlag(MOVEMENTFLAG_ONTRANSPORT)) + // Prefer the direct pointer from the master if available + if (master->GetTransport()) + { + transport = master->GetTransport(); + } + // Some elevators & moving platforms set ONTRANSPORT without exposing a direct Transport* on the master. + // In that case use the same helper Map API used in PlayerbotAI::UpdateAI to find the active transport. + else if (map && master->m_movementInfo.HasMovementFlag(MOVEMENTFLAG_ONTRANSPORT)) { transport = map->GetTransportForPos(master->GetPhaseMask(), master->GetPositionX(), @@ -92,33 +51,24 @@ bool FollowAction::Execute(Event event) master); } - // If we found a transport and the bot is not yet attached, board it. + // If the master is on a transport we could identify and the bot is not yet attached: if (transport && bot->GetTransport() != transport) { - float const offsetX = 1.0f; - float const offsetY = 0.5f; - float const offsetZ = 0.2f; - - float const x = master->GetPositionX() + offsetX; - float const y = master->GetPositionY() + offsetY; - float const z = master->GetPositionZ() + offsetZ; - - // Teleport close to the master (world coordinates) and attach as passenger (server-side). - bot->TeleportTo(transport->GetMapId(), x, y, z, master->GetOrientation()); - transport->AddPassenger(bot, true); - - // Reset movement state so the transport driver fully takes over. - bot->StopMoving(); - bot->GetMotionMaster()->Clear(true); - bot->GetMotionMaster()->MoveIdle(); - bot->m_movementInfo.RemoveMovementFlag(MOVEMENTFLAG_FORWARD); - bot->m_movementInfo.RemoveMovementFlag(MOVEMENTFLAG_WALKING); - - botAI->SetNextCheckDelay(urand(1000, 2500)); - LOG_INFO("playerbots", - "Bot {} boarded transport {} near master {} at {:.2f},{:.2f},{:.2f}", - bot->GetName(), transport->GetGUID().GetCounter(), master->GetName(), x, y, z); - return true; + // Attach the bot when it is already close enough to the master. + // Follow movement is responsible for bringing the bot into range. + float const attachDistance = 5.0f; + if (bot->IsWithinDistInMap(master, attachDistance)) + { + transport->AddPassenger(bot, true); + bot->StopMovingOnCurrentPos(); + + LOG_DEBUG("playerbots", "Bot {} attached to master's transport {} at follow time", + bot->GetName(), transport->GetGUID().GetCounter()); + + // Return true to indicate that follow did something this tick. + // Bot is now locked to the transport and will move with it via core logic. + return true; + } } } } diff --git a/src/Bot/PlayerbotAI.cpp b/src/Bot/PlayerbotAI.cpp index 26c76c2e143..1987a4edc3d 100644 --- a/src/Bot/PlayerbotAI.cpp +++ b/src/Bot/PlayerbotAI.cpp @@ -885,7 +885,13 @@ void PlayerbotAI::LeaveOrDisbandGroup() bool PlayerbotAI::IsMasterOnTransport() { - return master && master->GetTransport(); + if (!master || !master->IsInWorld()) + return false; + + if (master->GetTransport()) + return true; + + return master->m_movementInfo.HasMovementFlag(MOVEMENTFLAG_ONTRANSPORT); } bool PlayerbotAI::IsAllowedCommand(std::string const text) From 3fe7a4fbd29e0b6835f6a54d3ed40a8db813fdec Mon Sep 17 00:00:00 2001 From: Wishmaster117 <140754794+Wishmaster117@users.noreply.github.com> Date: Mon, 22 Dec 2025 19:17:15 +0000 Subject: [PATCH 18/25] Last adjustments Boats => Green Undercity Lift => Green Zeplines => Green Thunder Bluff Lifts => Green (so other lifts like this are ok) Thousand Needles => Orange (Bots go to lift but don't stay in platform and reapear when lift arrive to bottom) Stormwind Tram => TODO --- src/Ai/Base/Actions/FollowActions.cpp | 632 ++++++++++++++++++++++++-- 1 file changed, 601 insertions(+), 31 deletions(-) diff --git a/src/Ai/Base/Actions/FollowActions.cpp b/src/Ai/Base/Actions/FollowActions.cpp index c7709191fc3..5c209b2aab6 100644 --- a/src/Ai/Base/Actions/FollowActions.cpp +++ b/src/Ai/Base/Actions/FollowActions.cpp @@ -6,67 +6,637 @@ #include "FollowActions.h" #include +#include +#include #include "Event.h" #include "Formations.h" #include "LastMovementValue.h" +#include "MotionMaster.h" #include "PlayerbotAI.h" #include "Playerbots.h" #include "ServerFacade.h" #include "SharedDefines.h" #include "Transport.h" #include "Map.h" +#include +#include + +namespace +{ + // Static transports (elevators/platforms) need extra care: flags/pointers can desync and MMaps miss their geometry. + // Keep this logic conservative to avoid impacting boats/zeppelins. + constexpr uint32 STATIC_TRANSPORT_REMEMBER_MS = 12 * IN_MILLISECONDS; + constexpr float STATIC_TRANSPORT_REMEMBER_MIN_DZ = 8.0f; + constexpr float STATIC_TRANSPORT_REMEMBER_MAX_MASTER_DIST_2D = 160.0f; + constexpr float STATIC_TRANSPORT_REMEMBER_MAX_BOT_DIST_2D = 120.0f; + + constexpr float STATIC_TRANSPORT_SNAP_Z_THRESHOLD = 2.5f; + constexpr float STATIC_TRANSPORT_WAIT_Z_THRESHOLD = 4.0f; + constexpr float TIGHT_STATIC_TRANSPORT_MAX_SIZE = 1.25f; + + float Distance2D(float ax, float ay, float bx, float by) + { + float const dx = ax - bx; + float const dy = ay - by; + return std::sqrt(dx * dx + dy * dy); + } + + Transport* GetTransportForPosTolerant(Map* map, WorldObject* ref, uint32 phaseMask, float x, float y, float z) + { + if (!map || !ref) + return nullptr; + + std::array const probes = { z, z + 0.5f, z + 1.5f, z - 0.5f }; + for (float const pz : probes) + { + if (Transport* t = map->GetTransportForPos(phaseMask, x, y, pz, ref)) + return t; + } + + return nullptr; + } + + // Attempts to find a point on the leader's transport that is closer to the bot, + // by probing along the segment from master -> bot and returning the last point + // that is still detected as being on the expected transport. + bool FindBoardingPointOnTransport(Map* map, Transport* expectedTransport, WorldObject* ref, + float masterX, float masterY, float masterZ, + float botX, float botY, float botZ, + float& outX, float& outY, float& outZ) + { + if (!map || !expectedTransport || !ref) + return false; + + uint32 const phaseMask = ref->GetPhaseMask(); + + // Ensure master is actually detected on that transport (tolerant). + if (GetTransportForPosTolerant(map, ref, phaseMask, masterX, masterY, masterZ) != expectedTransport) + return false; + + // The raycast in GetTransportForPos starts at (z + 2). Probe with a safe Z. + float const probeZ = std::max(masterZ, botZ); + + // Adaptive step count: small platforms need tighter sampling. + float const dx2 = botX - masterX; + float const dy2 = botY - masterY; + float const dist2d = std::sqrt(dx2 * dx2 + dy2 * dy2); + int32 const steps = std::clamp(static_cast(dist2d / 0.75f), 10, 28); + + float const dx = (botX - masterX) / static_cast(steps); + float const dy = (botY - masterY) / static_cast(steps); + + // Master must actually be on the expected transport for this to work. + if (map->GetTransportForPos(ref->GetPhaseMask(), masterX, masterY, probeZ, ref) != expectedTransport) + return false; + + float lastX = masterX; + float lastY = masterY; + bool found = false; + + for (int32 i = 1; i <= steps; ++i) + { + float const px = masterX + dx * i; + float const py = masterY + dy * i; + + Transport* const t = GetTransportForPosTolerant(map, ref, phaseMask, px, py, probeZ); + if (t != expectedTransport) + break; + + lastX = px; + lastY = py; + found = true; + } + + if (!found) + return false; + + outX = lastX; + outY = lastY; + outZ = masterZ; // keep deck-level Z to encourage stepping onto the platform/boat + return true; + } + + // Select a staging point near the elevator shaft while waiting for a static transport (elevator) to reach the bot's Z. + // The goal is to keep the bot close enough to board quickly, without aiming directly for the platform center (which can be blocked by shaft walls). + void FindStagingPointOutsideTransport(Transport const* transport, float botX, float botY, float botZ, float& outX, float& outY, float& outZ) + { + if (!transport) + { + outX = botX; + outY = botY; + outZ = botZ; + return; + } + + float const centerX = transport->GetPositionX(); + float const centerY = transport->GetPositionY(); + + float vx = botX - centerX; + float vy = botY - centerY; + + float const distSq = vx * vx + vy * vy; + + if (distSq > 0.0001f) + { + float const invDist = 1.0f / std::sqrt(distSq); + vx *= invDist; + vy *= invDist; + } + else + { + vx = 1.0f; + vy = 0.0f; + } + + // Elevator models can be very small. Use a conservative minimum radius. + float const radius = std::max(transport->GetObjectSize() + 0.8f, 1.8f); + + outX = centerX + vx * radius; + outY = centerY + vy * radius; + outZ = botZ; + } + + // Sufficiently small static transports (elevators, tiny platforms) need special handling: + // object size often reflects only model radius and can be extremely small for elevators. + bool IsTightStaticTransport(Transport const* transport) + { + if (!transport || !transport->IsStaticTransport()) + return false; + + float const size = transport->GetObjectSize(); + return size > 0.0f && size <= TIGHT_STATIC_TRANSPORT_MAX_SIZE; + } + + float GetTightTransportClusterDist(Transport const* transport) + { + float const size = std::max(transport ? transport->GetObjectSize() : 0.0f, 0.01f); + return std::clamp(size * 3.0f, 0.8f, 1.8f); + } + + struct RecentStaticTransportInfo + { + uint32 transportLow = 0; + uint32 mapId = 0; + uint32 lastSeenMs = 0; + float x = 0.0f; + float y = 0.0f; + float z = 0.0f; + }; + + // Cache the last static transport the leader was actually riding (e.g. elevator platforms). + // This helps bots keep boarding even if the leader steps off the platform immediately. + std::unordered_map s_recentStaticTransportByMaster; + + void RememberMasterStaticTransport(Player* master, Transport* transport, uint32 nowMs) + { + if (!master || !transport || !transport->IsStaticTransport()) + return; + + uint32 const masterLow = master->GetGUID().GetCounter(); + + RecentStaticTransportInfo& info = s_recentStaticTransportByMaster[masterLow]; + info.transportLow = transport->GetGUID().GetCounter(); + info.mapId = master->GetMapId(); + info.lastSeenMs = nowMs; + info.x = transport->GetPositionX(); + info.y = transport->GetPositionY(); + info.z = transport->GetPositionZ(); + } + + Transport* ResolveRememberedStaticTransport(Player* master, Player* bot, Map* map, uint32 nowMs) + { + if (!master || !bot || !map) + return nullptr; + + uint32 const masterLow = master->GetGUID().GetCounter(); + + auto const it = s_recentStaticTransportByMaster.find(masterLow); + if (it == s_recentStaticTransportByMaster.end()) + return nullptr; + + RecentStaticTransportInfo const& info = it->second; + + // Expire quickly: elevators/platforms are local interactions, not long-term routing hints. + uint32 const elapsed = getMSTimeDiff(info.lastSeenMs, nowMs); + if (elapsed > STATIC_TRANSPORT_REMEMBER_MS) + return nullptr; + + // Must be same map to avoid stale pointers / false positives. + if (info.mapId != master->GetMapId() || info.mapId != bot->GetMapId()) + return nullptr; + + // Only useful when there is a meaningful vertical separation. + float const dz = std::fabs(master->GetPositionZ() - bot->GetPositionZ()); + if (dz < STATIC_TRANSPORT_REMEMBER_MIN_DZ) + return nullptr; + + // Avoid locking bots onto the cache when the group has clearly moved on. + if (Distance2D(master->GetPositionX(), master->GetPositionY(), info.x, info.y) > STATIC_TRANSPORT_REMEMBER_MAX_MASTER_DIST_2D) + return nullptr; + + if (Distance2D(bot->GetPositionX(), bot->GetPositionY(), info.x, info.y) > STATIC_TRANSPORT_REMEMBER_MAX_BOT_DIST_2D) + return nullptr; + + uint32 const phaseMask = master->GetPhaseMask(); + float const zMin = std::min(bot->GetPositionZ(), master->GetPositionZ()) - 2.0f; + float const zMax = std::max(bot->GetPositionZ(), master->GetPositionZ()) + 2.0f; + + // Scan along Z at the elevator X/Y to find the platform wherever it currently is. + // Keep the scan small: this runs only when transport detection already failed. + int32 const steps = 6; + for (int32 i = 0; i <= steps; ++i) + { + float const probeZ = zMin + (zMax - zMin) * (static_cast(i) / static_cast(steps)); + + if (Transport* const t = GetTransportForPosTolerant(map, master, phaseMask, info.x, info.y, probeZ)) + { + if (t->IsStaticTransport() && t->GetGUID().GetCounter() == info.transportLow) + return t; + } + } + + // Also try the last known platform Z as a final cheap probe (covers small oscillations). + if (Transport* const t = GetTransportForPosTolerant(map, master, phaseMask, info.x, info.y, info.z)) + { + if (t->IsStaticTransport() && t->GetGUID().GetCounter() == info.transportLow) + return t; + } + + return nullptr; + } +} bool FollowAction::Execute(Event event) { Formation* formation = AI_VALUE(Formation*, "formation"); std::string const target = formation->GetTargetName(); + uint32 const nowMs = getMSTime(); // Transport Handling (boats, zeppelins, elevators, platforms) - // Let normal follow movement bring the bot close to the master - // Attach the bot as a passenger once it is on (or very close to) the same transport - // Support classic transports (boats, zeppelins, tram) and moving platforms/elevators + // TODO andle Stormwind TRAM Player* master = botAI->GetMaster(); - if (master && master->IsInWorld() && bot->IsInWorld()) + if (master && master->IsInWorld() && bot->IsInWorld() && bot->GetMapId() == master->GetMapId()) { - // check master/map - if (bot->GetMapId() == master->GetMapId()) + Map* map = master->GetMap(); + uint32 const mapId = bot->GetMapId(); + Transport* transport = nullptr; + bool masterOnTransport = false; + + // Prefer the direct pointer from the master if available. + // On elevators, MOVEMENTFLAG_ONTRANSPORT can be briefly desynced; the pointer is still authoritative. + if (master->GetTransport()) { - Map* map = master->GetMap(); - Transport* transport = nullptr; + transport = master->GetTransport(); + masterOnTransport = true; + } + // Fallback: use the same geometry-based detection the core uses (raycast on transport models). + // This is important for some transports/platforms where GetTransport() may lag behind movement updates. + else if (map) + { + transport = GetTransportForPosTolerant(map, master, master->GetPhaseMask(), + master->GetPositionX(), master->GetPositionY(), master->GetPositionZ()); + masterOnTransport = (transport != nullptr); + } - // Prefer the direct pointer from the master if available - if (master->GetTransport()) + // Static transports: the leader can step off instantly (top/bottom platforms), leaving GetTransport() null. + // Keep a short "grace period" so bots still board the elevator instead of pathing around the shaft. + if (!transport && map) + transport = ResolveRememberedStaticTransport(master, bot, map, nowMs); + + if (transport && masterOnTransport && transport->IsStaticTransport()) + RememberMasterStaticTransport(master, transport, nowMs); + + auto const PrepareBotForMove = [&]() + { + if (bot->IsSitState()) + bot->SetStandState(UNIT_STAND_STATE_STAND); + + if (bot->IsNonMeleeSpellCast(true)) { - transport = master->GetTransport(); + bot->CastStop(); + botAI->InterruptSpell(); } - // Some elevators & moving platforms set ONTRANSPORT without exposing a direct Transport* on the master. - // In that case use the same helper Map API used in PlayerbotAI::UpdateAI to find the active transport. - else if (map && master->m_movementInfo.HasMovementFlag(MOVEMENTFLAG_ONTRANSPORT)) + }; + + auto const reseatOnStaticTransportDeck = [&](float deckZ) + { + if (!transport || !transport->IsStaticTransport()) + return; + + // Re-seat: detach then attach again at the correct Z so the transport offset is rebuilt. + if (bot->GetTransport() == transport) + transport->RemovePassenger(bot); + + bot->NearTeleportTo(bot->GetPositionX(), bot->GetPositionY(), deckZ, bot->GetOrientation()); + transport->AddPassenger(bot, true); + }; + + // If both master and bot are already on the same transport, do not try to maintain a tight formation + // on static transports (elevators). Small splines can easily push the bot off the platform and detach. + auto const handleStaticTransportPassenger = [&]() -> bool + { + if (!transport || !map) + return false; + + if (bot->GetTransport() != transport) + return false; + + if (!transport->IsStaticTransport() || !masterOnTransport) + return false; + + float const dist2d = sServerFacade->GetDistance2d(bot, master); + + // Tiny elevators: pack bots near the master and bypass formation offsets while riding. + if (IsTightStaticTransport(transport)) { - transport = map->GetTransportForPos(master->GetPhaseMask(), - master->GetPositionX(), - master->GetPositionY(), - master->GetPositionZ(), - master); + float const clusterDist = GetTightTransportClusterDist(transport); + + // Static transports (elevators): if a bot got attached below the platform, keep its XY but snap it back onto the deck Z, + // otherwise it will stay "glued" underneath while the transport moves. + float const dzDeck = std::fabs(bot->GetPositionZ() - master->GetPositionZ()); + if (dzDeck > STATIC_TRANSPORT_SNAP_Z_THRESHOLD) + { + + reseatOnStaticTransportDeck(master->GetPositionZ()); + } + + if (sServerFacade->IsDistanceLessOrEqualThan(dist2d, clusterDist)) + { + bot->StopMovingOnCurrentPos(); + return true; + } + + float const destX = master->GetPositionX(); + float const destY = master->GetPositionY(); + float const destZ = transport->GetPositionZ(); + + MovementPriority const priority = botAI->GetState() == BOT_STATE_COMBAT + ? MovementPriority::MOVEMENT_COMBAT + : MovementPriority::MOVEMENT_NORMAL; + + bool const movingAllowed = IsMovingAllowed(mapId, destX, destY, destZ); + bool const dupMove = IsDuplicateMove(mapId, destX, destY, destZ); + bool const waiting = IsWaitingForLastMove(priority); + + // Still bypass formation logic on elevators, even if duplicate/waiting. + if (!movingAllowed || dupMove || waiting) + return true; + + PrepareBotForMove(); + + MotionMaster* mm = bot->GetMotionMaster(); + if (!mm) + return false; + + mm->MovePoint( + /*id*/ 0, + /*coords*/ destX, destY, destZ, + /*forcedMovement*/ FORCED_MOVEMENT_NONE, + /*speed*/ 0.0f, + /*orientation*/ 0.0f, + /*generatePath*/ false, // already riding: keep direct movement + /*forceDestination*/ false); + + float delay = 1000.0f * MoveDelay(bot->GetExactDist(destX, destY, destZ)); + delay = std::clamp(delay, 0.0f, static_cast(sPlayerbotAIConfig->maxWaitForMove)); + delay = std::min(delay, 750.0f); + + AI_VALUE(LastMovement&, "last movement") + .Set(mapId, destX, destY, destZ, bot->GetOrientation(), delay, priority); + ClearIdleState(); + + return true; } - // If the master is on a transport we could identify and the bot is not yet attached: - if (transport && bot->GetTransport() != transport) + float const safeDist = std::max(formation ? formation->GetMaxDistance() : 0.0f, 6.0f); + if (!sServerFacade->IsDistanceLessOrEqualThan(dist2d, safeDist)) + return false; + + bot->StopMovingOnCurrentPos(); + + return true; + }; + + if (handleStaticTransportPassenger()) + return true; + + if (transport && map && bot->GetTransport() != transport) + { + // If the bot is already on the transport geometry, attach immediately (no need to be near the master). + float const botProbeZ = std::max(bot->GetPositionZ(), transport->GetPositionZ()); + Transport* botSurfaceTransport = GetTransportForPosTolerant(map, bot, bot->GetPhaseMask(), + bot->GetPositionX(), bot->GetPositionY(), botProbeZ); + + if (botSurfaceTransport == transport) { - // Attach the bot when it is already close enough to the master. - // Follow movement is responsible for bringing the bot into range. - float const attachDistance = 5.0f; - if (bot->IsWithinDistInMap(master, attachDistance)) + transport->AddPassenger(bot, true); + bot->StopMovingOnCurrentPos(); + + return true; + } + + bool const isStaticTransport = transport->IsStaticTransport(); + + // Boarding assistance: within a reasonable distance, use a direct MovePoint (no MMaps) + // so bots don't try to navigate around the moving platform. + float const boardingAssistDistance = 60.0f; + float const dist2d = sServerFacade->GetDistance2d(bot, master); + bool inAssist = sServerFacade->IsDistanceLessOrEqualThan(dist2d, boardingAssistDistance); + + // If the leader already stepped off a static transport (elevator), dist2d(master) can quickly exceed the + // assist radius, causing bots to path around the shaft instead of boarding. When we recovered a static + // transport from cache, allow boarding assistance based on distance to the platform itself. + if (!inAssist && isStaticTransport && !masterOnTransport) + { + float const distToTransport = Distance2D( + bot->GetPositionX(), bot->GetPositionY(), + transport->GetPositionX(), transport->GetPositionY()); + inAssist = sServerFacade->IsDistanceLessOrEqualThan(distToTransport, boardingAssistDistance + 30.0f); + } + + if (inAssist) + { + // Static transports (elevators/platforms) move fast on Z. If the platform is not at the bot's level, + // chasing the leader's Z produces unreachable MovePoint targets and long "waiting" delays. + auto const handleStaticTransportBoardingWindow = [&]() -> bool { - transport->AddPassenger(bot, true); - bot->StopMovingOnCurrentPos(); + if (!isStaticTransport) + return false; + + float const dzToPlatform = std::fabs(transport->GetPositionZ() - bot->GetPositionZ()); + + + // If the leader is already on the platform and the bot is close in XY but far in Z, + // we prefer snapping/attaching onto the deck instead of pushing the bot outside. + if (masterOnTransport) + { + float const safety = 2.0f + bot->GetObjectSize() + transport->GetObjectSize(); + if (sServerFacade->IsDistanceLessOrEqualThan(dist2d, safety) && dzToPlatform > STATIC_TRANSPORT_SNAP_Z_THRESHOLD) + { + + reseatOnStaticTransportDeck(master->GetPositionZ()); + return true; + } + } + // When the platform is far away in Z, do not move into the shaft. + if (dzToPlatform <= STATIC_TRANSPORT_WAIT_Z_THRESHOLD) + return false; + + float const botX = bot->GetPositionX(); + float const botY = bot->GetPositionY(); + float const botZ = bot->GetPositionZ(); + + // When platform is far away in Z, wait at transport X/Y, but keep bot's current. + float waitX = transport->GetPositionX(); + float waitY = transport->GetPositionY(); + float waitZ = botZ; + + // Keep bots just outside the lift footprint while it's not at their Z. + FindStagingPointOutsideTransport(transport, botX, botY, botZ, + waitX, waitY, waitZ); + + MovementPriority const priority = botAI->GetState() == BOT_STATE_COMBAT + ? MovementPriority::MOVEMENT_COMBAT + : MovementPriority::MOVEMENT_NORMAL; + + bool const movingAllowed = IsMovingAllowed(mapId, waitX, waitY, waitZ); + bool const dupMove = IsDuplicateMove(mapId, waitX, waitY, waitZ); + + if (movingAllowed && !dupMove) + { + PrepareBotForMove(); + + if (MotionMaster* mm = bot->GetMotionMaster()) + { + mm->MovePoint( + /*id*/ 0, + /*coords*/ waitX, waitY, waitZ, + /*forcedMovement*/ FORCED_MOVEMENT_NONE, + /*speed*/ 0.0f, + /*orientation*/ 0.0f, + /*generatePath*/ true, + /*forceDestination*/ false); + } + + float delay = 1000.0f * MoveDelay(bot->GetExactDist(waitX, waitY, waitZ)); + delay = std::clamp(delay, 0.0f, 250.0f); + AI_VALUE(LastMovement&, "last movement") + .Set(mapId, waitX, waitY, waitZ, bot->GetOrientation(), delay, priority); + ClearIdleState(); + } + + return true; + }; + + if (handleStaticTransportBoardingWindow()) + return true; + + float destX = 0.0f; + float destY = 0.0f; + float destZ = 0.0f; + + // Always target the platform center to avoid edge collisions, + // and to keep followers clustered where they will remain on the platform when it starts moving quickly. + if (isStaticTransport) + { + destX = transport->GetPositionX(); + destY = transport->GetPositionY(); + destZ = transport->GetPositionZ(); + } + + // If the leader already left the elevator platform, use the transport position as target. + // Otherwise, use the leader position to keep the group clustered while boarding. + else if (masterOnTransport) + { + destX = master->GetPositionX(); + destY = master->GetPositionY(); + destZ = master->GetPositionZ(); + } + else + { + destX = transport->GetPositionX(); + destY = transport->GetPositionY(); + destZ = transport->GetPositionZ(); + } - LOG_DEBUG("playerbots", "Bot {} attached to master's transport {} at follow time", - bot->GetName(), transport->GetGUID().GetCounter()); + float const masterX = master->GetPositionX(); + float const masterY = master->GetPositionY(); + float const masterZ = master->GetPositionZ(); + + float const botX = bot->GetPositionX(); + float const botY = bot->GetPositionY(); + float const botZ = bot->GetPositionZ(); + + // When the leader is already on the transport, moving to their exact position is often unreachable + // from MMaps. Try to move to the nearest "edge" point + // on the same transport along the segment leader -> bot. + float edgeX = 0.0f; + float edgeY = 0.0f; + float edgeZ = 0.0f; + // Boarding-point logic is useful for moving transports (boats/zeppelins), + // but hurts elevators. + if (masterOnTransport && !isStaticTransport && + FindBoardingPointOnTransport(map, transport, master, + masterX, masterY, masterZ, + botX, botY, botZ, + edgeX, edgeY, edgeZ)) + { + destX = edgeX; + destY = edgeY; + destZ = edgeZ; + } + + MovementPriority const priority = botAI->GetState() == BOT_STATE_COMBAT + ? MovementPriority::MOVEMENT_COMBAT + : MovementPriority::MOVEMENT_NORMAL; - // Return true to indicate that follow did something this tick. - // Bot is now locked to the transport and will move with it via core logic. + bool const movingAllowed = IsMovingAllowed(mapId, destX, destY, destZ); + bool const dupMove = IsDuplicateMove(mapId, destX, destY, destZ); + bool waiting = IsWaitingForLastMove(priority); + if (masterOnTransport && isStaticTransport) + waiting = false; + + if (movingAllowed && !dupMove && !waiting) + { + bool const generatePath = isStaticTransport; + + if (bot->IsSitState()) + bot->SetStandState(UNIT_STAND_STATE_STAND); + + if (bot->IsNonMeleeSpellCast(true)) + { + bot->CastStop(); + botAI->InterruptSpell(); + } + + if (MotionMaster* mm = bot->GetMotionMaster()) + { + mm->MovePoint( + /*id*/ 0, + /*coords*/ destX, destY, destZ, + /*forcedMovement*/ FORCED_MOVEMENT_NONE, + /*speed*/ 0.0f, + /*orientation*/ 0.0f, + /*generatePath*/ generatePath, + /*forceDestination*/ false); + } + else + { + return false; + } + + float delay = 1000.0f * MoveDelay(bot->GetExactDist(destX, destY, destZ)); + delay = std::clamp(delay, 0.0f, static_cast(sPlayerbotAIConfig->maxWaitForMove)); + if (isStaticTransport) + { + delay = std::min(delay, 750.0f); + if (masterOnTransport) + delay = std::min(delay, 200.0f); + } + AI_VALUE(LastMovement&, "last movement") + .Set(mapId, destX, destY, destZ, bot->GetOrientation(), delay, priority); + ClearIdleState(); return true; } } From 2a0be8136b8aee439df37a6b709b35557803e2e8 Mon Sep 17 00:00:00 2001 From: Wishmaster117 <140754794+Wishmaster117@users.noreply.github.com> Date: Mon, 22 Dec 2025 19:22:22 +0000 Subject: [PATCH 19/25] Fix codestyle --- src/Ai/Base/Actions/FollowActions.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/Ai/Base/Actions/FollowActions.cpp b/src/Ai/Base/Actions/FollowActions.cpp index 5c209b2aab6..b00f773b4a9 100644 --- a/src/Ai/Base/Actions/FollowActions.cpp +++ b/src/Ai/Base/Actions/FollowActions.cpp @@ -357,7 +357,7 @@ bool FollowAction::Execute(Event event) float const dzDeck = std::fabs(bot->GetPositionZ() - master->GetPositionZ()); if (dzDeck > STATIC_TRANSPORT_SNAP_Z_THRESHOLD) { - + reseatOnStaticTransportDeck(master->GetPositionZ()); } @@ -465,7 +465,6 @@ bool FollowAction::Execute(Event event) return false; float const dzToPlatform = std::fabs(transport->GetPositionZ() - bot->GetPositionZ()); - // If the leader is already on the platform and the bot is close in XY but far in Z, // we prefer snapping/attaching onto the deck instead of pushing the bot outside. @@ -535,7 +534,7 @@ bool FollowAction::Execute(Event event) float destX = 0.0f; float destY = 0.0f; float destZ = 0.0f; - + // Always target the platform center to avoid edge collisions, // and to keep followers clustered where they will remain on the platform when it starts moving quickly. if (isStaticTransport) @@ -544,7 +543,7 @@ bool FollowAction::Execute(Event event) destY = transport->GetPositionY(); destZ = transport->GetPositionZ(); } - + // If the leader already left the elevator platform, use the transport position as target. // Otherwise, use the leader position to keep the group clustered while boarding. else if (masterOnTransport) @@ -563,7 +562,7 @@ bool FollowAction::Execute(Event event) float const masterX = master->GetPositionX(); float const masterY = master->GetPositionY(); float const masterZ = master->GetPositionZ(); - + float const botX = bot->GetPositionX(); float const botY = bot->GetPositionY(); float const botZ = bot->GetPositionZ(); @@ -625,7 +624,7 @@ bool FollowAction::Execute(Event event) { return false; } - + float delay = 1000.0f * MoveDelay(bot->GetExactDist(destX, destY, destZ)); delay = std::clamp(delay, 0.0f, static_cast(sPlayerbotAIConfig->maxWaitForMove)); if (isStaticTransport) From bc31559b6960667933d31b395cc78ecb24d02c5a Mon Sep 17 00:00:00 2001 From: bash Date: Thu, 12 Feb 2026 22:05:10 +0100 Subject: [PATCH 20/25] fixes --- src/Ai/Base/Actions/FollowActions.cpp | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/Ai/Base/Actions/FollowActions.cpp b/src/Ai/Base/Actions/FollowActions.cpp index b00f773b4a9..de4516c7a9a 100644 --- a/src/Ai/Base/Actions/FollowActions.cpp +++ b/src/Ai/Base/Actions/FollowActions.cpp @@ -345,7 +345,7 @@ bool FollowAction::Execute(Event event) if (!transport->IsStaticTransport() || !masterOnTransport) return false; - float const dist2d = sServerFacade->GetDistance2d(bot, master); + float const dist2d = ServerFacade::instance().GetDistance2d(bot, master); // Tiny elevators: pack bots near the master and bypass formation offsets while riding. if (IsTightStaticTransport(transport)) @@ -361,7 +361,7 @@ bool FollowAction::Execute(Event event) reseatOnStaticTransportDeck(master->GetPositionZ()); } - if (sServerFacade->IsDistanceLessOrEqualThan(dist2d, clusterDist)) + if (ServerFacade::instance().IsDistanceLessOrEqualThan(dist2d, clusterDist)) { bot->StopMovingOnCurrentPos(); return true; @@ -399,7 +399,7 @@ bool FollowAction::Execute(Event event) /*forceDestination*/ false); float delay = 1000.0f * MoveDelay(bot->GetExactDist(destX, destY, destZ)); - delay = std::clamp(delay, 0.0f, static_cast(sPlayerbotAIConfig->maxWaitForMove)); + delay = std::clamp(delay, 0.0f, static_cast(sPlayerbotAIConfig.maxWaitForMove)); delay = std::min(delay, 750.0f); AI_VALUE(LastMovement&, "last movement") @@ -410,7 +410,7 @@ bool FollowAction::Execute(Event event) } float const safeDist = std::max(formation ? formation->GetMaxDistance() : 0.0f, 6.0f); - if (!sServerFacade->IsDistanceLessOrEqualThan(dist2d, safeDist)) + if (!ServerFacade::instance().IsDistanceLessOrEqualThan(dist2d, safeDist)) return false; bot->StopMovingOnCurrentPos(); @@ -441,8 +441,8 @@ bool FollowAction::Execute(Event event) // Boarding assistance: within a reasonable distance, use a direct MovePoint (no MMaps) // so bots don't try to navigate around the moving platform. float const boardingAssistDistance = 60.0f; - float const dist2d = sServerFacade->GetDistance2d(bot, master); - bool inAssist = sServerFacade->IsDistanceLessOrEqualThan(dist2d, boardingAssistDistance); + float const dist2d = ServerFacade::instance().GetDistance2d(bot, master); + bool inAssist = ServerFacade::instance().IsDistanceLessOrEqualThan(dist2d, boardingAssistDistance); // If the leader already stepped off a static transport (elevator), dist2d(master) can quickly exceed the // assist radius, causing bots to path around the shaft instead of boarding. When we recovered a static @@ -452,7 +452,7 @@ bool FollowAction::Execute(Event event) float const distToTransport = Distance2D( bot->GetPositionX(), bot->GetPositionY(), transport->GetPositionX(), transport->GetPositionY()); - inAssist = sServerFacade->IsDistanceLessOrEqualThan(distToTransport, boardingAssistDistance + 30.0f); + inAssist = ServerFacade::instance().IsDistanceLessOrEqualThan(distToTransport, boardingAssistDistance + 30.0f); } if (inAssist) @@ -471,7 +471,8 @@ bool FollowAction::Execute(Event event) if (masterOnTransport) { float const safety = 2.0f + bot->GetObjectSize() + transport->GetObjectSize(); - if (sServerFacade->IsDistanceLessOrEqualThan(dist2d, safety) && dzToPlatform > STATIC_TRANSPORT_SNAP_Z_THRESHOLD) + if (ServerFacade::instance().IsDistanceLessOrEqualThan(dist2d, safety) && + dzToPlatform > STATIC_TRANSPORT_SNAP_Z_THRESHOLD) { reseatOnStaticTransportDeck(master->GetPositionZ()); @@ -626,7 +627,7 @@ bool FollowAction::Execute(Event event) } float delay = 1000.0f * MoveDelay(bot->GetExactDist(destX, destY, destZ)); - delay = std::clamp(delay, 0.0f, static_cast(sPlayerbotAIConfig->maxWaitForMove)); + delay = std::clamp(delay, 0.0f, static_cast(sPlayerbotAIConfig.maxWaitForMove)); if (isStaticTransport) { delay = std::min(delay, 750.0f); From c58ba3526b7b2f980c5f10e86d23d55c25c389dc Mon Sep 17 00:00:00 2001 From: Alex Dcnh <140754794+Wishmaster117@users.noreply.github.com> Date: Fri, 13 Feb 2026 11:05:40 +0100 Subject: [PATCH 21/25] Remove Elevators and Trams related code --- src/Mgr/Travel/TravelNode.cpp | 215 ++++++++-------------------------- 1 file changed, 51 insertions(+), 164 deletions(-) diff --git a/src/Mgr/Travel/TravelNode.cpp b/src/Mgr/Travel/TravelNode.cpp index 5d740075daf..d363ee86b23 100644 --- a/src/Mgr/Travel/TravelNode.cpp +++ b/src/Mgr/Travel/TravelNode.cpp @@ -1752,188 +1752,75 @@ void TravelNodeMap::generateTransportNodes() for (auto const& itr : *sObjectMgr->GetGameObjectTemplates()) { GameObjectTemplate const* data = &itr.second; - if (data && (data->type == GAMEOBJECT_TYPE_TRANSPORT || data->type == GAMEOBJECT_TYPE_MO_TRANSPORT)) - { - TransportAnimation const* animation = sTransportMgr->GetTransportAnimInfo(itr.first); + if (!data || (data->type != GAMEOBJECT_TYPE_TRANSPORT && data->type != GAMEOBJECT_TYPE_MO_TRANSPORT)) + continue; - uint32 pathId = data->moTransport.taxiPathId; - float moveSpeed = data->moTransport.moveSpeed; - if (pathId >= sTaxiPathNodesByPath.size()) - continue; + uint32 pathId = data->moTransport.taxiPathId; + float moveSpeed = data->moTransport.moveSpeed; + if (pathId >= sTaxiPathNodesByPath.size()) + continue; - TaxiPathNodeList const& path = sTaxiPathNodesByPath[pathId]; + TaxiPathNodeList const& path = sTaxiPathNodesByPath[pathId]; - std::vector ppath; - TravelNode* prevNode = nullptr; + // Keep only transports with taxi paths (boats/zeppelins). + if (path.empty()) + continue; - // Elevators/Trams - if (path.empty()) - { - if (animation) - { - TransportPathContainer aPath = animation->Path; - float timeStart; + std::vector ppath; + TravelNode* prevNode = nullptr; - for (auto& transport : WorldPosition().getGameObjectsNear(0, itr.first)) - { - prevNode = nullptr; - WorldPosition basePos(transport->mapid, transport->posX, transport->posY, transport->posZ, - transport->orientation); - WorldPosition lPos = WorldPosition(); - - for (auto& p : aPath) - { - float dx = -1 * p.second->X; - float dy = -1 * p.second->Y; - - WorldPosition pos = - WorldPosition(basePos.getMapId(), basePos.getX() + dx, basePos.getY() + dy, - basePos.getZ() + p.second->Z, basePos.getO()); - - if (prevNode) - { - ppath.push_back(pos); - } - - if (pos.distance(&lPos) == 0) - { - TravelNode* node = - TravelNodeMap::instance().addNode(pos, data->name, true, true, true, itr.first); - - if (!prevNode) - { - ppath.push_back(pos); - timeStart = p.second->TimeSeg; - } - else - { - float totalTime = (p.second->TimeSeg - timeStart) / 1000.0f; - - TravelNodePath travelPath(0.1f, totalTime, (uint8)TravelNodePathType::transport, - itr.first, true); - node->setPathTo(prevNode, travelPath); - ppath.clear(); - ppath.push_back(pos); - timeStart = p.second->TimeSeg; - } - - prevNode = node; - } - - lPos = pos; - } - - if (prevNode) - { - for (auto& p : aPath) - { - float dx = -1 * p.second->X; - float dy = -1 * p.second->Y; - WorldPosition pos = - WorldPosition(basePos.getMapId(), basePos.getX() + dx, basePos.getY() + dy, - basePos.getZ() + p.second->Z, basePos.getO()); - - ppath.push_back(pos); - - if (pos.distance(&lPos) == 0) - { - TravelNode* node = - TravelNodeMap::instance().addNode(pos, data->name, true, true, true, itr.first); - if (node != prevNode) - { - if (p.second->TimeSeg < timeStart) - timeStart = 0; - - float totalTime = (p.second->TimeSeg - timeStart) / 1000.0f; - - TravelNodePath travelPath(0.1f, totalTime, (uint8)TravelNodePathType::transport, - itr.first, true); - travelPath.setPath(ppath); - node->setPathTo(prevNode, travelPath); - ppath.clear(); - ppath.push_back(pos); - timeStart = p.second->TimeSeg; - } - } - - lPos = pos; - } - } - - ppath.clear(); - } - } - } - else // Boats/Zepelins - { - // Loop over the path and connect stop locations. - for (auto& p : path) - { - WorldPosition pos = WorldPosition(p->mapid, p->x, p->y, p->z, 0); + // Loop over the path and connect stop locations. + for (auto& p : path) + { + WorldPosition pos = WorldPosition(p->mapid, p->x, p->y, p->z, 0); - // if (data->displayId == 3015) - // pos.setZ(pos.getZ() + 6.0f); - // else if (data->displayId == 3031) - // pos.setZ(pos.getZ() - 17.0f); + if (prevNode) + ppath.push_back(pos); - if (prevNode) - { - ppath.push_back(pos); - } + if (p->delay > 0) + { + TravelNode* node = TravelNodeMap::instance().addNode(pos, data->name, true, true, true, itr.first); - if (p->delay > 0) - { - TravelNode* node = TravelNodeMap::instance().addNode(pos, data->name, true, true, true, itr.first); - - if (!prevNode) - { - ppath.push_back(pos); - } - else - { - TravelNodePath travelPath(0.1f, 0.0, (uint8)TravelNodePathType::transport, itr.first, true); - travelPath.setPathAndCost(ppath, moveSpeed); - node->setPathTo(prevNode, travelPath); - ppath.clear(); - ppath.push_back(pos); - } - - prevNode = node; - } + if (!prevNode) + { + ppath.push_back(pos); } - - if (prevNode) + else { - // Continue from start until first stop and connect to end. - for (auto& p : path) - { - WorldPosition pos = WorldPosition(p->mapid, p->x, p->y, p->z, 0); + TravelNodePath travelPath(0.1f, 0.0, (uint8)TravelNodePathType::transport, itr.first, true); + travelPath.setPathAndCost(ppath, moveSpeed); + node->setPathTo(prevNode, travelPath); + ppath.clear(); + ppath.push_back(pos); + } - // if (data->displayId == 3015) - // pos.setZ(pos.getZ() + 6.0f); - // else if (data->displayId == 3031) - // pos.setZ(pos.getZ() - 17.0f); + prevNode = node; + } + } + + if (!prevNode) + continue; - ppath.push_back(pos); + // Continue from start until first stop and connect to end. + for (auto& p : path) + { + WorldPosition pos = WorldPosition(p->mapid, p->x, p->y, p->z, 0); + ppath.push_back(pos); - if (p->delay > 0) - { - TravelNode* node = TravelNodeMap::instance().getNode(pos, nullptr, 5.0f); + if (p->delay > 0) + { + TravelNode* node = TravelNodeMap::instance().getNode(pos, nullptr, 5.0f); - if (node != prevNode) - { - TravelNodePath travelPath(0.1f, 0.0, (uint8)TravelNodePathType::transport, itr.first, - true); - travelPath.setPathAndCost(ppath, moveSpeed); + if (node != prevNode) + { + TravelNodePath travelPath(0.1f, 0.0, (uint8)TravelNodePathType::transport, itr.first, true); + travelPath.setPathAndCost(ppath, moveSpeed); - node->setPathTo(prevNode, travelPath); - } - } - } + node->setPathTo(prevNode, travelPath); } - ppath.clear(); } } + ppath.clear(); } } From f4778172b712091a715c5a62c63d9e80e888c913 Mon Sep 17 00:00:00 2001 From: Alex Dcnh <140754794+Wishmaster117@users.noreply.github.com> Date: Fri, 13 Feb 2026 13:18:06 +0100 Subject: [PATCH 22/25] Remove remaining platforms code in FollowActions --- src/Ai/Base/Actions/FollowActions.cpp | 459 +------------------------- 1 file changed, 15 insertions(+), 444 deletions(-) diff --git a/src/Ai/Base/Actions/FollowActions.cpp b/src/Ai/Base/Actions/FollowActions.cpp index de4516c7a9a..734444bc701 100644 --- a/src/Ai/Base/Actions/FollowActions.cpp +++ b/src/Ai/Base/Actions/FollowActions.cpp @@ -7,7 +7,6 @@ #include #include -#include #include "Event.h" #include "Formations.h" @@ -24,24 +23,6 @@ namespace { - // Static transports (elevators/platforms) need extra care: flags/pointers can desync and MMaps miss their geometry. - // Keep this logic conservative to avoid impacting boats/zeppelins. - constexpr uint32 STATIC_TRANSPORT_REMEMBER_MS = 12 * IN_MILLISECONDS; - constexpr float STATIC_TRANSPORT_REMEMBER_MIN_DZ = 8.0f; - constexpr float STATIC_TRANSPORT_REMEMBER_MAX_MASTER_DIST_2D = 160.0f; - constexpr float STATIC_TRANSPORT_REMEMBER_MAX_BOT_DIST_2D = 120.0f; - - constexpr float STATIC_TRANSPORT_SNAP_Z_THRESHOLD = 2.5f; - constexpr float STATIC_TRANSPORT_WAIT_Z_THRESHOLD = 4.0f; - constexpr float TIGHT_STATIC_TRANSPORT_MAX_SIZE = 1.25f; - - float Distance2D(float ax, float ay, float bx, float by) - { - float const dx = ax - bx; - float const dy = ay - by; - return std::sqrt(dx * dx + dy * dy); - } - Transport* GetTransportForPosTolerant(Map* map, WorldObject* ref, uint32 phaseMask, float x, float y, float z) { if (!map || !ref) @@ -116,165 +97,14 @@ namespace outZ = masterZ; // keep deck-level Z to encourage stepping onto the platform/boat return true; } - - // Select a staging point near the elevator shaft while waiting for a static transport (elevator) to reach the bot's Z. - // The goal is to keep the bot close enough to board quickly, without aiming directly for the platform center (which can be blocked by shaft walls). - void FindStagingPointOutsideTransport(Transport const* transport, float botX, float botY, float botZ, float& outX, float& outY, float& outZ) - { - if (!transport) - { - outX = botX; - outY = botY; - outZ = botZ; - return; - } - - float const centerX = transport->GetPositionX(); - float const centerY = transport->GetPositionY(); - - float vx = botX - centerX; - float vy = botY - centerY; - - float const distSq = vx * vx + vy * vy; - - if (distSq > 0.0001f) - { - float const invDist = 1.0f / std::sqrt(distSq); - vx *= invDist; - vy *= invDist; - } - else - { - vx = 1.0f; - vy = 0.0f; - } - - // Elevator models can be very small. Use a conservative minimum radius. - float const radius = std::max(transport->GetObjectSize() + 0.8f, 1.8f); - - outX = centerX + vx * radius; - outY = centerY + vy * radius; - outZ = botZ; - } - - // Sufficiently small static transports (elevators, tiny platforms) need special handling: - // object size often reflects only model radius and can be extremely small for elevators. - bool IsTightStaticTransport(Transport const* transport) - { - if (!transport || !transport->IsStaticTransport()) - return false; - - float const size = transport->GetObjectSize(); - return size > 0.0f && size <= TIGHT_STATIC_TRANSPORT_MAX_SIZE; - } - - float GetTightTransportClusterDist(Transport const* transport) - { - float const size = std::max(transport ? transport->GetObjectSize() : 0.0f, 0.01f); - return std::clamp(size * 3.0f, 0.8f, 1.8f); - } - - struct RecentStaticTransportInfo - { - uint32 transportLow = 0; - uint32 mapId = 0; - uint32 lastSeenMs = 0; - float x = 0.0f; - float y = 0.0f; - float z = 0.0f; - }; - - // Cache the last static transport the leader was actually riding (e.g. elevator platforms). - // This helps bots keep boarding even if the leader steps off the platform immediately. - std::unordered_map s_recentStaticTransportByMaster; - - void RememberMasterStaticTransport(Player* master, Transport* transport, uint32 nowMs) - { - if (!master || !transport || !transport->IsStaticTransport()) - return; - - uint32 const masterLow = master->GetGUID().GetCounter(); - - RecentStaticTransportInfo& info = s_recentStaticTransportByMaster[masterLow]; - info.transportLow = transport->GetGUID().GetCounter(); - info.mapId = master->GetMapId(); - info.lastSeenMs = nowMs; - info.x = transport->GetPositionX(); - info.y = transport->GetPositionY(); - info.z = transport->GetPositionZ(); - } - - Transport* ResolveRememberedStaticTransport(Player* master, Player* bot, Map* map, uint32 nowMs) - { - if (!master || !bot || !map) - return nullptr; - - uint32 const masterLow = master->GetGUID().GetCounter(); - - auto const it = s_recentStaticTransportByMaster.find(masterLow); - if (it == s_recentStaticTransportByMaster.end()) - return nullptr; - - RecentStaticTransportInfo const& info = it->second; - - // Expire quickly: elevators/platforms are local interactions, not long-term routing hints. - uint32 const elapsed = getMSTimeDiff(info.lastSeenMs, nowMs); - if (elapsed > STATIC_TRANSPORT_REMEMBER_MS) - return nullptr; - - // Must be same map to avoid stale pointers / false positives. - if (info.mapId != master->GetMapId() || info.mapId != bot->GetMapId()) - return nullptr; - - // Only useful when there is a meaningful vertical separation. - float const dz = std::fabs(master->GetPositionZ() - bot->GetPositionZ()); - if (dz < STATIC_TRANSPORT_REMEMBER_MIN_DZ) - return nullptr; - - // Avoid locking bots onto the cache when the group has clearly moved on. - if (Distance2D(master->GetPositionX(), master->GetPositionY(), info.x, info.y) > STATIC_TRANSPORT_REMEMBER_MAX_MASTER_DIST_2D) - return nullptr; - - if (Distance2D(bot->GetPositionX(), bot->GetPositionY(), info.x, info.y) > STATIC_TRANSPORT_REMEMBER_MAX_BOT_DIST_2D) - return nullptr; - - uint32 const phaseMask = master->GetPhaseMask(); - float const zMin = std::min(bot->GetPositionZ(), master->GetPositionZ()) - 2.0f; - float const zMax = std::max(bot->GetPositionZ(), master->GetPositionZ()) + 2.0f; - - // Scan along Z at the elevator X/Y to find the platform wherever it currently is. - // Keep the scan small: this runs only when transport detection already failed. - int32 const steps = 6; - for (int32 i = 0; i <= steps; ++i) - { - float const probeZ = zMin + (zMax - zMin) * (static_cast(i) / static_cast(steps)); - - if (Transport* const t = GetTransportForPosTolerant(map, master, phaseMask, info.x, info.y, probeZ)) - { - if (t->IsStaticTransport() && t->GetGUID().GetCounter() == info.transportLow) - return t; - } - } - - // Also try the last known platform Z as a final cheap probe (covers small oscillations). - if (Transport* const t = GetTransportForPosTolerant(map, master, phaseMask, info.x, info.y, info.z)) - { - if (t->IsStaticTransport() && t->GetGUID().GetCounter() == info.transportLow) - return t; - } - - return nullptr; - } } bool FollowAction::Execute(Event event) { Formation* formation = AI_VALUE(Formation*, "formation"); std::string const target = formation->GetTargetName(); - uint32 const nowMs = getMSTime(); - // Transport Handling (boats, zeppelins, elevators, platforms) - // TODO andle Stormwind TRAM + // Transport handling for moving transports only (boats/zeppelins). Player* master = botAI->GetMaster(); if (master && master->IsInWorld() && bot->IsInWorld() && bot->GetMapId() == master->GetMapId()) { @@ -283,15 +113,11 @@ bool FollowAction::Execute(Event event) Transport* transport = nullptr; bool masterOnTransport = false; - // Prefer the direct pointer from the master if available. - // On elevators, MOVEMENTFLAG_ONTRANSPORT can be briefly desynced; the pointer is still authoritative. if (master->GetTransport()) { transport = master->GetTransport(); masterOnTransport = true; } - // Fallback: use the same geometry-based detection the core uses (raycast on transport models). - // This is important for some transports/platforms where GetTransport() may lag behind movement updates. else if (map) { transport = GetTransportForPosTolerant(map, master, master->GetPhaseMask(), @@ -299,131 +125,12 @@ bool FollowAction::Execute(Event event) masterOnTransport = (transport != nullptr); } - // Static transports: the leader can step off instantly (top/bottom platforms), leaving GetTransport() null. - // Keep a short "grace period" so bots still board the elevator instead of pathing around the shaft. - if (!transport && map) - transport = ResolveRememberedStaticTransport(master, bot, map, nowMs); - - if (transport && masterOnTransport && transport->IsStaticTransport()) - RememberMasterStaticTransport(master, transport, nowMs); - - auto const PrepareBotForMove = [&]() - { - if (bot->IsSitState()) - bot->SetStandState(UNIT_STAND_STATE_STAND); - - if (bot->IsNonMeleeSpellCast(true)) - { - bot->CastStop(); - botAI->InterruptSpell(); - } - }; - - auto const reseatOnStaticTransportDeck = [&](float deckZ) - { - if (!transport || !transport->IsStaticTransport()) - return; - - // Re-seat: detach then attach again at the correct Z so the transport offset is rebuilt. - if (bot->GetTransport() == transport) - transport->RemovePassenger(bot); - - bot->NearTeleportTo(bot->GetPositionX(), bot->GetPositionY(), deckZ, bot->GetOrientation()); - transport->AddPassenger(bot, true); - }; - - // If both master and bot are already on the same transport, do not try to maintain a tight formation - // on static transports (elevators). Small splines can easily push the bot off the platform and detach. - auto const handleStaticTransportPassenger = [&]() -> bool - { - if (!transport || !map) - return false; - - if (bot->GetTransport() != transport) - return false; - - if (!transport->IsStaticTransport() || !masterOnTransport) - return false; - - float const dist2d = ServerFacade::instance().GetDistance2d(bot, master); - - // Tiny elevators: pack bots near the master and bypass formation offsets while riding. - if (IsTightStaticTransport(transport)) - { - float const clusterDist = GetTightTransportClusterDist(transport); - - // Static transports (elevators): if a bot got attached below the platform, keep its XY but snap it back onto the deck Z, - // otherwise it will stay "glued" underneath while the transport moves. - float const dzDeck = std::fabs(bot->GetPositionZ() - master->GetPositionZ()); - if (dzDeck > STATIC_TRANSPORT_SNAP_Z_THRESHOLD) - { - - reseatOnStaticTransportDeck(master->GetPositionZ()); - } - - if (ServerFacade::instance().IsDistanceLessOrEqualThan(dist2d, clusterDist)) - { - bot->StopMovingOnCurrentPos(); - return true; - } - - float const destX = master->GetPositionX(); - float const destY = master->GetPositionY(); - float const destZ = transport->GetPositionZ(); - - MovementPriority const priority = botAI->GetState() == BOT_STATE_COMBAT - ? MovementPriority::MOVEMENT_COMBAT - : MovementPriority::MOVEMENT_NORMAL; - - bool const movingAllowed = IsMovingAllowed(mapId, destX, destY, destZ); - bool const dupMove = IsDuplicateMove(mapId, destX, destY, destZ); - bool const waiting = IsWaitingForLastMove(priority); - - // Still bypass formation logic on elevators, even if duplicate/waiting. - if (!movingAllowed || dupMove || waiting) - return true; - - PrepareBotForMove(); - - MotionMaster* mm = bot->GetMotionMaster(); - if (!mm) - return false; - - mm->MovePoint( - /*id*/ 0, - /*coords*/ destX, destY, destZ, - /*forcedMovement*/ FORCED_MOVEMENT_NONE, - /*speed*/ 0.0f, - /*orientation*/ 0.0f, - /*generatePath*/ false, // already riding: keep direct movement - /*forceDestination*/ false); - - float delay = 1000.0f * MoveDelay(bot->GetExactDist(destX, destY, destZ)); - delay = std::clamp(delay, 0.0f, static_cast(sPlayerbotAIConfig.maxWaitForMove)); - delay = std::min(delay, 750.0f); - - AI_VALUE(LastMovement&, "last movement") - .Set(mapId, destX, destY, destZ, bot->GetOrientation(), delay, priority); - ClearIdleState(); - - return true; - } - - float const safeDist = std::max(formation ? formation->GetMaxDistance() : 0.0f, 6.0f); - if (!ServerFacade::instance().IsDistanceLessOrEqualThan(dist2d, safeDist)) - return false; - - bot->StopMovingOnCurrentPos(); - - return true; - }; - - if (handleStaticTransportPassenger()) - return true; + // Ignore static transports (elevators/trams): only keep boats/zeppelins here. + if (transport && transport->IsStaticTransport()) + transport = nullptr; if (transport && map && bot->GetTransport() != transport) { - // If the bot is already on the transport geometry, attach immediately (no need to be near the master). float const botProbeZ = std::max(bot->GetPositionZ(), transport->GetPositionZ()); Transport* botSurfaceTransport = GetTransportForPosTolerant(map, bot, bot->GetPhaseMask(), bot->GetPositionX(), bot->GetPositionY(), botProbeZ); @@ -432,154 +139,26 @@ bool FollowAction::Execute(Event event) { transport->AddPassenger(bot, true); bot->StopMovingOnCurrentPos(); - return true; } - bool const isStaticTransport = transport->IsStaticTransport(); - - // Boarding assistance: within a reasonable distance, use a direct MovePoint (no MMaps) - // so bots don't try to navigate around the moving platform. float const boardingAssistDistance = 60.0f; float const dist2d = ServerFacade::instance().GetDistance2d(bot, master); - bool inAssist = ServerFacade::instance().IsDistanceLessOrEqualThan(dist2d, boardingAssistDistance); - - // If the leader already stepped off a static transport (elevator), dist2d(master) can quickly exceed the - // assist radius, causing bots to path around the shaft instead of boarding. When we recovered a static - // transport from cache, allow boarding assistance based on distance to the platform itself. - if (!inAssist && isStaticTransport && !masterOnTransport) - { - float const distToTransport = Distance2D( - bot->GetPositionX(), bot->GetPositionY(), - transport->GetPositionX(), transport->GetPositionY()); - inAssist = ServerFacade::instance().IsDistanceLessOrEqualThan(distToTransport, boardingAssistDistance + 30.0f); - } + bool const inAssist = ServerFacade::instance().IsDistanceLessOrEqualThan(dist2d, boardingAssistDistance); if (inAssist) { - // Static transports (elevators/platforms) move fast on Z. If the platform is not at the bot's level, - // chasing the leader's Z produces unreachable MovePoint targets and long "waiting" delays. - auto const handleStaticTransportBoardingWindow = [&]() -> bool - { - if (!isStaticTransport) - return false; - - float const dzToPlatform = std::fabs(transport->GetPositionZ() - bot->GetPositionZ()); - - // If the leader is already on the platform and the bot is close in XY but far in Z, - // we prefer snapping/attaching onto the deck instead of pushing the bot outside. - if (masterOnTransport) - { - float const safety = 2.0f + bot->GetObjectSize() + transport->GetObjectSize(); - if (ServerFacade::instance().IsDistanceLessOrEqualThan(dist2d, safety) && - dzToPlatform > STATIC_TRANSPORT_SNAP_Z_THRESHOLD) - { - - reseatOnStaticTransportDeck(master->GetPositionZ()); - return true; - } - } - // When the platform is far away in Z, do not move into the shaft. - if (dzToPlatform <= STATIC_TRANSPORT_WAIT_Z_THRESHOLD) - return false; - - float const botX = bot->GetPositionX(); - float const botY = bot->GetPositionY(); - float const botZ = bot->GetPositionZ(); - - // When platform is far away in Z, wait at transport X/Y, but keep bot's current. - float waitX = transport->GetPositionX(); - float waitY = transport->GetPositionY(); - float waitZ = botZ; - - // Keep bots just outside the lift footprint while it's not at their Z. - FindStagingPointOutsideTransport(transport, botX, botY, botZ, - waitX, waitY, waitZ); - - MovementPriority const priority = botAI->GetState() == BOT_STATE_COMBAT - ? MovementPriority::MOVEMENT_COMBAT - : MovementPriority::MOVEMENT_NORMAL; - - bool const movingAllowed = IsMovingAllowed(mapId, waitX, waitY, waitZ); - bool const dupMove = IsDuplicateMove(mapId, waitX, waitY, waitZ); - - if (movingAllowed && !dupMove) - { - PrepareBotForMove(); - - if (MotionMaster* mm = bot->GetMotionMaster()) - { - mm->MovePoint( - /*id*/ 0, - /*coords*/ waitX, waitY, waitZ, - /*forcedMovement*/ FORCED_MOVEMENT_NONE, - /*speed*/ 0.0f, - /*orientation*/ 0.0f, - /*generatePath*/ true, - /*forceDestination*/ false); - } - - float delay = 1000.0f * MoveDelay(bot->GetExactDist(waitX, waitY, waitZ)); - delay = std::clamp(delay, 0.0f, 250.0f); - AI_VALUE(LastMovement&, "last movement") - .Set(mapId, waitX, waitY, waitZ, bot->GetOrientation(), delay, priority); - ClearIdleState(); - } - - return true; - }; - - if (handleStaticTransportBoardingWindow()) - return true; - - float destX = 0.0f; - float destY = 0.0f; - float destZ = 0.0f; - - // Always target the platform center to avoid edge collisions, - // and to keep followers clustered where they will remain on the platform when it starts moving quickly. - if (isStaticTransport) - { - destX = transport->GetPositionX(); - destY = transport->GetPositionY(); - destZ = transport->GetPositionZ(); - } - - // If the leader already left the elevator platform, use the transport position as target. - // Otherwise, use the leader position to keep the group clustered while boarding. - else if (masterOnTransport) - { - destX = master->GetPositionX(); - destY = master->GetPositionY(); - destZ = master->GetPositionZ(); - } - else - { - destX = transport->GetPositionX(); - destY = transport->GetPositionY(); - destZ = transport->GetPositionZ(); - } - - float const masterX = master->GetPositionX(); - float const masterY = master->GetPositionY(); - float const masterZ = master->GetPositionZ(); - - float const botX = bot->GetPositionX(); - float const botY = bot->GetPositionY(); - float const botZ = bot->GetPositionZ(); - - // When the leader is already on the transport, moving to their exact position is often unreachable - // from MMaps. Try to move to the nearest "edge" point - // on the same transport along the segment leader -> bot. + float destX = masterOnTransport ? master->GetPositionX() : transport->GetPositionX(); + float destY = masterOnTransport ? master->GetPositionY() : transport->GetPositionY(); + float destZ = masterOnTransport ? master->GetPositionZ() : transport->GetPositionZ(); float edgeX = 0.0f; float edgeY = 0.0f; float edgeZ = 0.0f; - // Boarding-point logic is useful for moving transports (boats/zeppelins), - // but hurts elevators. - if (masterOnTransport && !isStaticTransport && + + if (masterOnTransport && FindBoardingPointOnTransport(map, transport, master, - masterX, masterY, masterZ, - botX, botY, botZ, + master->GetPositionX(), master->GetPositionY(), master->GetPositionZ(), + bot->GetPositionX(), bot->GetPositionY(), bot->GetPositionZ(), edgeX, edgeY, edgeZ)) { destX = edgeX; @@ -593,13 +172,10 @@ bool FollowAction::Execute(Event event) bool const movingAllowed = IsMovingAllowed(mapId, destX, destY, destZ); bool const dupMove = IsDuplicateMove(mapId, destX, destY, destZ); - bool waiting = IsWaitingForLastMove(priority); - if (masterOnTransport && isStaticTransport) - waiting = false; + bool const waiting = IsWaitingForLastMove(priority); if (movingAllowed && !dupMove && !waiting) { - bool const generatePath = isStaticTransport; if (bot->IsSitState()) bot->SetStandState(UNIT_STAND_STATE_STAND); @@ -618,7 +194,7 @@ bool FollowAction::Execute(Event event) /*forcedMovement*/ FORCED_MOVEMENT_NONE, /*speed*/ 0.0f, /*orientation*/ 0.0f, - /*generatePath*/ generatePath, + /*generatePath*/ false, /*forceDestination*/ false); } else @@ -628,12 +204,7 @@ bool FollowAction::Execute(Event event) float delay = 1000.0f * MoveDelay(bot->GetExactDist(destX, destY, destZ)); delay = std::clamp(delay, 0.0f, static_cast(sPlayerbotAIConfig.maxWaitForMove)); - if (isStaticTransport) - { - delay = std::min(delay, 750.0f); - if (masterOnTransport) - delay = std::min(delay, 200.0f); - } + AI_VALUE(LastMovement&, "last movement") .Set(mapId, destX, destY, destZ, bot->GetOrientation(), delay, priority); ClearIdleState(); From a8f7916e941d77f32427713710977feff4546972 Mon Sep 17 00:00:00 2001 From: bashermens <31279994+hermensbas@users.noreply.github.com> Date: Sun, 15 Feb 2026 22:34:44 +0100 Subject: [PATCH 23/25] Minor style --- src/Ai/Base/Actions/FollowActions.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/Ai/Base/Actions/FollowActions.cpp b/src/Ai/Base/Actions/FollowActions.cpp index 6f00b364954..09a3740d3a0 100644 --- a/src/Ai/Base/Actions/FollowActions.cpp +++ b/src/Ai/Base/Actions/FollowActions.cpp @@ -176,7 +176,6 @@ bool FollowAction::Execute(Event /*event*/) if (movingAllowed && !dupMove && !waiting) { - if (bot->IsSitState()) bot->SetStandState(UNIT_STAND_STATE_STAND); @@ -198,9 +197,7 @@ bool FollowAction::Execute(Event /*event*/) /*forceDestination*/ false); } else - { return false; - } float delay = 1000.0f * MoveDelay(bot->GetExactDist(destX, destY, destZ)); delay = std::clamp(delay, 0.0f, static_cast(sPlayerbotAIConfig.maxWaitForMove)); From 447ee919d3a5e67d05463dd336dbe5ddb2d87d2f Mon Sep 17 00:00:00 2001 From: bash Date: Sun, 15 Feb 2026 22:38:20 +0100 Subject: [PATCH 24/25] not being used --- src/Bot/PlayerbotAI.cpp | 11 ----------- src/Bot/PlayerbotAI.h | 1 - 2 files changed, 12 deletions(-) diff --git a/src/Bot/PlayerbotAI.cpp b/src/Bot/PlayerbotAI.cpp index fa840b05ce0..b6afb1c0a8d 100644 --- a/src/Bot/PlayerbotAI.cpp +++ b/src/Bot/PlayerbotAI.cpp @@ -881,17 +881,6 @@ void PlayerbotAI::LeaveOrDisbandGroup() bot->GetSession()->QueuePacket(packet); } -bool PlayerbotAI::IsMasterOnTransport() -{ - if (!master || !master->IsInWorld()) - return false; - - if (master->GetTransport()) - return true; - - return master->m_movementInfo.HasMovementFlag(MOVEMENTFLAG_ONTRANSPORT); -} - bool PlayerbotAI::IsAllowedCommand(std::string const text) { if (unsecuredCommands.empty()) diff --git a/src/Bot/PlayerbotAI.h b/src/Bot/PlayerbotAI.h index 2dc6c99a4e9..05710548d16 100644 --- a/src/Bot/PlayerbotAI.h +++ b/src/Bot/PlayerbotAI.h @@ -602,7 +602,6 @@ class PlayerbotAI : public PlayerbotAIBase NewRpgStatistic rpgStatistic; std::unordered_set lowPriorityQuest; time_t bgReleaseAttemptTime = 0; - bool IsMasterOnTransport(); // Schedules a callback to run once after milliseconds. void AddTimedEvent(std::function callback, uint32 delayMs); From ad55a0691ad3bd7d323d6fa2dc9222866511ce98 Mon Sep 17 00:00:00 2001 From: bash Date: Sun, 15 Feb 2026 22:45:48 +0100 Subject: [PATCH 25/25] imports update --- src/Ai/Base/Actions/FollowActions.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/Ai/Base/Actions/FollowActions.cpp b/src/Ai/Base/Actions/FollowActions.cpp index 09a3740d3a0..48ce74ad347 100644 --- a/src/Ai/Base/Actions/FollowActions.cpp +++ b/src/Ai/Base/Actions/FollowActions.cpp @@ -5,8 +5,9 @@ #include "FollowActions.h" -#include #include +#include +#include #include "Event.h" #include "Formations.h" @@ -15,11 +16,8 @@ #include "PlayerbotAI.h" #include "Playerbots.h" #include "ServerFacade.h" -#include "SharedDefines.h" #include "Transport.h" #include "Map.h" -#include -#include namespace {