Compare commits

...

2 Commits

Author SHA1 Message Date
Keleborn
441f9f7552
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>
2026-02-14 20:55:10 +01:00
bashermens
80aeeda0e8
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.
2026-02-14 11:31:45 -08:00
185 changed files with 693 additions and 1102 deletions

View File

@ -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;
}

View File

@ -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;

View File

@ -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<LastMovement&>("last area trigger")->Get();

View File

@ -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;
}

View File

@ -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();
;

View File

@ -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())
{

View File

@ -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);

View File

@ -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;
}

View File

@ -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<Item*> items =
AI_VALUE2(std::vector<Item*>, "inventory items", "usage " + std::to_string(ITEM_USAGE_DISENCHANT));

View File

@ -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)

View File

@ -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)

View File

@ -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);

View File

@ -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))
{

View File

@ -6,7 +6,6 @@
#include <random>
#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();

View File

@ -30,7 +30,7 @@ bool AttackEnemyFlagCarrierAction::isUseful()
PlayerHasFlag::IsCapturingFlag(bot);
}
bool DropTargetAction::Execute(Event event)
bool DropTargetAction::Execute(Event /*event*/)
{
Unit* target = context->GetValue<Unit*>("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");

View File

@ -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.

View File

@ -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)
{

View File

@ -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);
}

View File

@ -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");

View File

@ -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)

View File

@ -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);

View File

@ -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;

View File

@ -5,17 +5,14 @@
#include "FollowActions.h"
#include <cstddef>
#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);

View File

@ -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 <vector>
@ -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)

View File

@ -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<Unit*>* BuffOnPartyAction::GetTargetValue()
return context->GetValue<Unit*>("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<Unit*>* CastSnareSpellAction::GetTargetValue() { return context->GetValue<
Value<Unit*>* CastCrowdControlSpellAction::GetTargetValue() { return context->GetValue<Unit*>("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);

View File

@ -11,7 +11,7 @@
std::vector<std::string> split(std::string const s, char delim);
bool GiveItemAction::Execute(Event event)
bool GiveItemAction::Execute(Event /*event*/)
{
Unit* target = GetTarget();
if (!target)

View File

@ -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())

View File

@ -6,7 +6,8 @@
#include "GuildBankAction.h"
#include "GuildMgr.h"
#include "Playerbots.h"
#include "PlayerbotAI.h"
#include "AiObjectContext.h"
bool GuildBankAction::Execute(Event event)
{

View File

@ -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<GuidVector>("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<GuidVector>("nearest npcs")->Get();
bool vendored = false, result = false;
@ -297,7 +297,7 @@ bool PetitionTurnInAction::isUseful()
!context->GetValue<TravelTarget*>("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)))

View File

@ -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)

View File

@ -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();

View File

@ -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());

View File

@ -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))

View File

@ -351,9 +351,7 @@ uint32 InventoryAction::GetItemCount(FindItemVisitor* visitor, IterateItemsMask
std::vector<Item*>& items = visitor->GetResult();
for (Item* item : items)
{
count += item->GetCount();
}
return count;
}

View File

@ -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<GuidVector>("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<std::string, std::string> 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<Player*> 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);
}

View File

@ -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();

View File

@ -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<uint32> selected;
std::vector<uint32> dungeons = sRandomPlayerbotMgr.LfgDungeons[bot->GetTeamId()];
std::vector<uint32> 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();

View File

@ -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)

View File

@ -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)

View File

@ -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");

View File

@ -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();
@ -954,67 +947,69 @@ 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();
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,10 +1017,11 @@ 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();
}
@ -1813,12 +1809,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();
@ -1844,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);
}
@ -1852,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;
@ -1862,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"));
}
@ -1875,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())
@ -2307,17 +2298,15 @@ bool MovementAction::CheckLastFlee(float curAngle, std::list<FleeInfo>& 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)) ||
@ -2448,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)
@ -2532,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)
@ -2643,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))
@ -2654,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)
@ -2665,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)
@ -2691,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)
@ -2751,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;
@ -2769,7 +2758,7 @@ bool MoveOutOfCollisionAction::isUseful()
botAI->GetAiObjectContext()->GetValue<GuidVector>("nearest friendly players")->Get().size() < 15;
}
bool MoveRandomAction::Execute(Event event)
bool MoveRandomAction::Execute(Event /*event*/)
{
float distance = sPlayerbotAIConfig.tooCloseDistance + urand(10, 30);
@ -2801,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,
@ -2823,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<Unit*> creatures;
@ -2904,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<Player*> debuffedPlayers;

View File

@ -7,7 +7,7 @@
#include "LootObjectStack.h"
#include "AiObjectContext.h"
bool OpenItemAction::Execute(Event event)
bool OpenItemAction::Execute(Event /*event*/)
{
bool foundOpenable = false;

View File

@ -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()))

View File

@ -9,8 +9,6 @@
#include <string>
#include "Action.h"
#include "PlayerbotFactory.h"
#include "Unit.h"
class PlayerbotAI;

View File

@ -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<PositionMap&>("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<PositionMap&>("position")->Get();
PositionInfo returnPos = posMap["return"];

View File

@ -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)
{

View File

@ -5,6 +5,7 @@
#include "QuestAction.h"
#include <sstream>
#include <algorithm>
#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;

View File

@ -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;

View File

@ -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()
{

View File

@ -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))
{

View File

@ -7,7 +7,7 @@
#include "Event.h"
#include "LastMovementValue.h"
#include "Playerbots.h"
#include "AiObjectContext.h"
bool RememberTaxiAction::Execute(Event event)
{

View File

@ -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)

View File

@ -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;
}

View File

@ -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;

View File

@ -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)

View File

@ -7,7 +7,6 @@
#include <random>
#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())

View File

@ -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<Item*> 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);

View File

@ -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)

View File

@ -9,9 +9,7 @@
#include <regex>
#include <string>
#include "ChannelMgr.h"
#include "Event.h"
#include "GuildMgr.h"
#include "PlayerbotTextMgr.h"
#include "Playerbots.h"
@ -56,7 +54,7 @@ static const std::unordered_set<std::string> 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<std::string, std::string> 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<time_t>("last said", qualifier)->Set(nextTime);

View File

@ -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())
{

View File

@ -7,7 +7,6 @@
#include "Event.h"
#include "Formations.h"
#include "PathGenerator.h"
#include "Playerbots.h"
#include "RTSCValues.h"
#include "RtscAction.h"

View File

@ -49,10 +49,8 @@ bool SetCraftAction::Execute(Event event)
if (skillSpells.empty())
{
for (SkillLineAbilityEntry const* skillLine : sSkillLineAbilityStore)
{
skillSpells[skillLine->Spell] = skillLine;
}
}
data.required.clear();
data.obtained.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,11 +137,9 @@ void SetCraftAction::TellCraft()
uint32 given = data.obtained[item];
if (given)
{
out << "|cffffff00(x" << given << " given)|r ";
}
}
}
out << " (craft fee: " << chat->formatMoney(GetCraftFee(data)) << ")";
botAI->TellMaster(out.str());

View File

@ -8,7 +8,7 @@
#include "Event.h"
#include "Playerbots.h"
bool SetHomeAction::Execute(Event event)
bool SetHomeAction::Execute(Event /*event*/)
{
Player* master = GetMaster();

View File

@ -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;

View File

@ -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,10 +49,8 @@ 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
// (without removing/adding stay)
@ -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;

View File

@ -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 @@ private:
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)

View File

@ -6,12 +6,10 @@
#include "TameAction.h"
#include <algorithm>
#include <cctype>
#include <iomanip>
#include <random>
#include <set>
#include <sstream>
#include "DBCStructure.h"
#include "Log.h"
#include "ObjectMgr.h"
#include "Pet.h"
#include "Player.h"

View File

@ -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;

View File

@ -4,11 +4,9 @@
*/
#include "TellLosAction.h"
#include <istream>
#include <sstream>
#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));

View File

@ -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;

View File

@ -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)

View File

@ -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<Unit*>("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 ---");

View File

@ -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,11 +106,9 @@ 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;
}
}
}
if (tradeSlot == -1)
return false;

View File

@ -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;

View File

@ -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)
{

View File

@ -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");

View File

@ -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.");
}
}

View File

@ -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)

View File

@ -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<Item*> recipes = AI_VALUE2(std::vector<Item*>, "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;

View File

@ -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)
{

View File

@ -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)

View File

@ -5,8 +5,6 @@
#include "ChatCommandHandlerStrategy.h"
#include "Playerbots.h"
class ChatCommandActionNodeFactoryInternal : public NamedObjectFactory<ActionNode>
{
public:

View File

@ -5,7 +5,6 @@
#include "CombatStrategy.h"
#include "Playerbots.h"
#include "Strategy.h"
void CombatStrategy::InitTriggers(std::vector<TriggerNode*>& triggers)

View File

@ -5,8 +5,6 @@
#include "DuelStrategy.h"
#include "Playerbots.h"
void DuelStrategy::InitTriggers(std::vector<TriggerNode*>& triggers)
{
PassTroughStrategy::InitTriggers(triggers);

View File

@ -5,8 +5,6 @@
#include "FollowMasterStrategy.h"
#include "Playerbots.h"
std::vector<NextAction> FollowMasterStrategy::getDefaultActions()
{
return {

View File

@ -5,8 +5,6 @@
#include "GuardStrategy.h"
#include "Playerbots.h"
std::vector<NextAction> GuardStrategy::getDefaultActions()
{
return {

View File

@ -5,8 +5,6 @@
#include "NonCombatStrategy.h"
#include "Playerbots.h"
void NonCombatStrategy::InitTriggers(std::vector<TriggerNode*>& triggers)
{
triggers.push_back(new TriggerNode("random", { NextAction("clean quest log", 1.0f) }));

View File

@ -5,8 +5,6 @@
#include "RTSCStrategy.h"
#include "Playerbots.h"
RTSCStrategy::RTSCStrategy(PlayerbotAI* botAI) : Strategy(botAI) {}
void RTSCStrategy::InitTriggers(std::vector<TriggerNode*>& triggers) {}

View File

@ -5,8 +5,6 @@
#include "RacialsStrategy.h"
#include "Playerbots.h"
class RacialsStrategyActionNodeFactory : public NamedObjectFactory<ActionNode>
{
public:

View File

@ -5,8 +5,6 @@
#include "UsePotionsStrategy.h"
#include "Playerbots.h"
class UsePotionsStrategyActionNodeFactory : public NamedObjectFactory<ActionNode>
{
public:

View File

@ -7,9 +7,7 @@
#include <string>
#include "BattlegroundWS.h"
#include "CreatureAI.h"
#include "GameTime.h"
#include "ItemVisitors.h"
#include "LastSpellCastValue.h"
#include "ObjectGuid.h"

View File

@ -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));
}

View File

@ -6,7 +6,8 @@
#include "Arrow.h"
#include "Map.h"
#include "Playerbots.h"
#include "PlayerbotAI.h"
#include "Group.h"
WorldLocation ArrowFormation::GetLocationInternal()
{

View File

@ -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

View File

@ -4,8 +4,7 @@
*/
#include "CurrentCcTargetValue.h"
#include "Playerbots.h"
#include "PlayerbotAI.h"
class FindCurrentCcTargetStrategy : public FindTargetStrategy
{

View File

@ -29,7 +29,6 @@ public:
foundHighPriority = true;
return;
}
Unit* victim = attacker->GetVictim();
if (!result || CalcThreatGap(attacker, threatMgr) > CalcThreatGap(result, &result->GetThreatMgr()))
result = attacker;
}
@ -144,7 +143,7 @@ public:
{
}
void CheckAttacker(Unit* attacker, ThreatMgr* threatMgr) override
void CheckAttacker(Unit* attacker, ThreatMgr*) override
{
if (Group* group = botAI->GetBot()->GetGroup())
{
@ -195,7 +194,6 @@ public:
}
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 @@ public:
{
}
void CheckAttacker(Unit* attacker, ThreatMgr* threatMgr) override
void CheckAttacker(Unit* attacker, ThreatMgr*) override
{
if (Group* group = botAI->GetBot()->GetGroup())
{
@ -276,7 +274,6 @@ public:
}
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())
{

View File

@ -5,7 +5,7 @@
#include "ItemCountValue.h"
#include "Playerbots.h"
#include "PlayerbotAI.h"
std::vector<Item*> InventoryItemValueBase::Find(std::string const qualifier)
{
@ -25,9 +25,7 @@ uint32 ItemCountValue::Calculate()
uint32 count = 0;
std::vector<Item*> items = Find(qualifier);
for (Item* item : items)
{
count += item->GetCount();
}
return count;
}

View File

@ -5,7 +5,6 @@
#include "LastMovementValue.h"
#include "Playerbots.h"
#include "Timer.h"
LastMovement::LastMovement() { clear(); }

View File

@ -6,7 +6,7 @@
#include "LeastHpTargetValue.h"
#include "AttackersValue.h"
#include "Playerbots.h"
#include "PlayerbotAI.h"
class FindLeastHpTargetStrategy : public FindNonCcTargetStrategy
{

View File

@ -6,6 +6,7 @@
#ifndef _PLAYERBOT_LOGLEVELVALUE_H
#define _PLAYERBOT_LOGLEVELVALUE_H
#include "LogCommon.h"
#include "Value.h"
class PlayerbotAI;

Some files were not shown because too many files have changed in this diff Show More