Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
0af8788
commit #1 for PR
brighton-chi Dec 23, 2025
373ee5c
initialize variable
brighton-chi Dec 23, 2025
2d51da0
Fix Al'ar error
brighton-chi Dec 26, 2025
ab11f86
Merge remote-tracking branch 'upstream/master' into tempest-keep-the-…
brighton-chi Dec 26, 2025
376d290
Some streamlining + fix Warlock strategy swap
brighton-chi Dec 30, 2025
6497790
bunch of tweaks
brighton-chi Jan 2, 2026
0760aa1
Merge remote-tracking branch 'upstream/master' into tempest-keep-the-…
brighton-chi Jan 2, 2026
8ad10b2
Merge remote-tracking branch 'upstream/master' into tempest-keep-the-…
brighton-chi Jan 6, 2026
2702860
update to reflect PR #1923 and change vector to pair
brighton-chi Jan 6, 2026
cdb9336
address merge conflicts
brighton-chi Jan 6, 2026
6f992e4
minor performance improvement
brighton-chi Jan 8, 2026
20f57ea
switch to out of combat map clearing & split some triggers
brighton-chi Jan 12, 2026
7e6798c
Merge remote-tracking branch 'upstream/master' into tempest-keep-the-…
brighton-chi Jan 12, 2026
29eb193
fixed a bunch of stupid crap
brighton-chi Jan 15, 2026
05a385a
Merge remote-tracking branch 'upstream/master' into tempest-keep-the-…
brighton-chi Jan 15, 2026
1efba4f
oops
brighton-chi Jan 15, 2026
ad4a812
timer fix
brighton-chi Jan 16, 2026
c18085a
clean up some triggers
brighton-chi Jan 17, 2026
c597680
Merge remote-tracking branch 'upstream/master' into tempest-keep-the-…
brighton-chi Jan 17, 2026
5b50a65
Merge remote-tracking branch 'upstream/master' into tempest-keep-the-…
brighton-chi Jan 18, 2026
61d0b7f
Update to reflect new module structure
brighton-chi Jan 18, 2026
268516a
Merge remote-tracking branch 'upstream/master' into tempest-keep-the-…
brighton-chi Jan 21, 2026
8cee1dc
update to reflect new module structure and make several fixes
brighton-chi Jan 21, 2026
6fcccf6
Merge remote-tracking branch 'upstream/master' into tempest-keep-the-…
brighton-chi Jan 24, 2026
23270ef
Update for assistant function commit
brighton-chi Jan 24, 2026
bebac60
test-staging alignment (#2121)
kadeshar Feb 6, 2026
b31bda8
Refactor raid strategy framework (#2069)
brighton-chi Feb 6, 2026
026df0d
Chilton wand fix (#2115)
kadeshar Feb 6, 2026
76b6df9
Extend SummonWhenGroup to auto-added bots (#2034)
Wishmaster117 Feb 6, 2026
da9fd39
Merge remote-tracking branch 'upstream/master' into tempest-keep-the-…
brighton-chi Feb 7, 2026
65368a1
majorish updates to KT and some to other bosses
brighton-chi Feb 7, 2026
6ed3f24
Enforce test fix (#2122)
kadeshar Feb 7, 2026
79fb3a5
- Fixed Oculus drake mounting
kadeshar Feb 7, 2026
a1b939f
comment out/remove unused parameters
brighton-chi Feb 8, 2026
8585f10
Implement Serpentshrine Cavern Strategies (#1888)
brighton-chi Feb 8, 2026
3db2a5a
Refactor of EquipActions (#1994)
Celandriel Feb 8, 2026
e9e79ad
Fix LootRollLevel=1 to match documented 'greed' behavior (#2068)
Hokken Feb 8, 2026
cfb2ed4
Merge pull request #2124 from kadeshar/oculus-drake-fix
kadeshar Feb 8, 2026
c9c936d
Add Unending Breath to Warlock NonCombat Strat (#2074)
dillyns Feb 8, 2026
610fdc1
Fix bug with GetCreature + GetGameObject = use ObjectAccessor's metho…
privatecore Feb 8, 2026
c307f26
Merge branch 'test-staging' into tempest-keep-the-eye-PR
brighton-chi Feb 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .github/workflows/check_pr_source.yml
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
name: Enforce test-staging → main
name: Enforce test-staging → master

on:
pull_request:
branches:
- master
- test-staging

jobs:
require-test-staging:
runs-on: ubuntu-22.04
if: github.event.pull_request.base.ref == 'master'
steps:
- name: Ensure PR source is test-staging
run: |
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/code_style.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ name: Codestyle

on:
push:
branches: [ "master" ]
branches: [ "master", "test-staging" ]
pull_request:
branches: [ "master" ]
branches: [ "master", "test-staging" ]

concurrency:
group: "codestyle-${{ github.event.pull_request.number }}"
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/core_build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ name: ubuntu-build

on:
push:
branches: [ "master" ]
branches: [ "master", "test-staging" ]
pull_request:
branches: [ "master" ]
branches: [ "master", "test-staging" ]

concurrency:
group: "core-build-${{ github.event.pull_request.number }}"
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/macos_build.yml
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
name: macos-build
on:
push:
branches: [ "master" ]
branches: [ "master", "test-staging" ]
pull_request:
branches: [ "master" ]
branches: [ "master", "test-staging" ]

concurrency:
group: "macos-build-${{ github.event.pull_request.number }}"
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/windows_build.yml
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
name: windows-build
on:
push:
branches: [ "master" ]
branches: [ "master", "test-staging" ]
pull_request:
branches: [ "master" ]
branches: [ "master", "test-staging" ]

concurrency:
group: "windows-build-${{ github.event.pull_request.number }}"
Expand Down
4 changes: 2 additions & 2 deletions conf/playerbots.conf.dist
Original file line number Diff line number Diff line change
Expand Up @@ -558,7 +558,7 @@ AiPlayerbot.AutoGearScoreLimit = 0
# "mana" (bots have infinite mana)
# "power" (bots have infinite energy, rage, and runic power)
# "taxi" (bots may use all flight paths, though they will not actually learn them)
# "raid" (bots use cheats implemented into raid strategies (currently only for Ulduar))
# "raid" (bots use cheats implemented into raid strategies (currently only for SSC and Ulduar))
# To use multiple cheats, separate them by commas below (e.g., to enable all, use "gold,health,mana,power,raid,taxi")
# Default: food, taxi, and raid are enabled
AiPlayerbot.BotCheats = "food,taxi,raid"
Expand Down Expand Up @@ -2182,4 +2182,4 @@ AiPlayerbot.SummonAtInnkeepersEnabled = 1
# 30% more damage, 40% damage reduction (tank bots), increased all resistances, reduced threat for non tank bots, increased threat for tank bots.
# Buffs will be applied on PP, Sindragosa and Lich King

AiPlayerbot.EnableICCBuffs = 1
AiPlayerbot.EnableICCBuffs = 1
98 changes: 40 additions & 58 deletions src/Ai/Base/Actions/EquipAction.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -328,7 +328,43 @@ void EquipAction::EquipItem(Item* item)
botAI->TellMaster(out);
}

bool EquipUpgradesAction::Execute(Event event)
ItemIds EquipAction::SelectInventoryItemsToEquip()
{
CollectItemsVisitor visitor;
IterateItems(&visitor, ITERATE_ITEMS_IN_BAGS);

ItemIds items;
for (auto i = visitor.items.begin(); i != visitor.items.end(); ++i)
{
Item* item = *i;
if (!item)
continue;

ItemTemplate const* itemTemplate = item->GetTemplate();
if (!itemTemplate)
continue;

//TODO Expand to Glyphs and Gems, that can be placed in equipment
//Pre-filter non-equipable items
if (itemTemplate->InventoryType == INVTYPE_NON_EQUIP)
continue;

int32 randomProperty = item->GetItemRandomPropertyId();
uint32 itemId = item->GetTemplate()->ItemId;
std::string itemUsageParam;
if (randomProperty != 0)
itemUsageParam = std::to_string(itemId) + "," + std::to_string(randomProperty);
else
itemUsageParam = std::to_string(itemId);

ItemUsage usage = AI_VALUE2(ItemUsage, "item upgrade", itemUsageParam);
if (usage == ITEM_USAGE_EQUIP || usage == ITEM_USAGE_REPLACE || usage == ITEM_USAGE_BAD_EQUIP)
items.insert(itemId);
}
return items;
}

bool EquipUpgradesTriggeredAction::Execute(Event event)
{
if (!sPlayerbotAIConfig.autoEquipUpgradeLoot && !sRandomPlayerbotMgr.IsRandomBot(bot))
return false;
Expand Down Expand Up @@ -361,72 +397,18 @@ bool EquipUpgradesAction::Execute(Event event)
p >> itemId;

ItemTemplate const* item = sObjectMgr->GetItemTemplate(itemId);
if (item->Class == ITEM_CLASS_TRADE_GOODS && item->SubClass == ITEM_SUBCLASS_MEAT)
if (item->InventoryType == INVTYPE_NON_EQUIP)
return false;
}

CollectItemsVisitor visitor;
IterateItems(&visitor, ITERATE_ITEMS_IN_BAGS);

ItemIds items;
for (auto i = visitor.items.begin(); i != visitor.items.end(); ++i)
{
Item* item = *i;
if (!item)
break;
int32 randomProperty = item->GetItemRandomPropertyId();
uint32 itemId = item->GetTemplate()->ItemId;
std::string itemUsageParam;
if (randomProperty != 0)
{
itemUsageParam = std::to_string(itemId) + "," + std::to_string(randomProperty);
}
else
{
itemUsageParam = std::to_string(itemId);
}
ItemUsage usage = AI_VALUE2(ItemUsage, "item usage", itemUsageParam);

if (usage == ITEM_USAGE_EQUIP || usage == ITEM_USAGE_REPLACE || usage == ITEM_USAGE_BAD_EQUIP)
{
items.insert(itemId);
}
}

ItemIds items = SelectInventoryItemsToEquip();
EquipItems(items);
return true;
}

bool EquipUpgradeAction::Execute(Event event)
{
CollectItemsVisitor visitor;
IterateItems(&visitor, ITERATE_ITEMS_IN_BAGS);

ItemIds items;
for (auto i = visitor.items.begin(); i != visitor.items.end(); ++i)
{
Item* item = *i;
if (!item)
break;
int32 randomProperty = item->GetItemRandomPropertyId();
uint32 itemId = item->GetTemplate()->ItemId;
std::string itemUsageParam;
if (randomProperty != 0)
{
itemUsageParam = std::to_string(itemId) + "," + std::to_string(randomProperty);
}
else
{
itemUsageParam = std::to_string(itemId);
}
ItemUsage usage = AI_VALUE2(ItemUsage, "item usage", itemUsageParam);

if (usage == ITEM_USAGE_EQUIP || usage == ITEM_USAGE_REPLACE || usage == ITEM_USAGE_BAD_EQUIP)
{
items.insert(itemId);
}
}

ItemIds items = SelectInventoryItemsToEquip();
EquipItems(items);
return true;
}
8 changes: 5 additions & 3 deletions src/Ai/Base/Actions/EquipAction.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

#include "ChatHelper.h"
#include "InventoryAction.h"
#include "Item.h"

class FindItemVisitor;
class Item;
Expand All @@ -20,25 +21,26 @@ class EquipAction : public InventoryAction

bool Execute(Event event) override;
void EquipItems(ItemIds ids);
ItemIds SelectInventoryItemsToEquip();

private:
void EquipItem(FindItemVisitor* visitor);
uint8 GetSmallestBagSlot();
void EquipItem(Item* item);
};

class EquipUpgradesAction : public EquipAction
class EquipUpgradesTriggeredAction : public EquipAction
{
public:
EquipUpgradesAction(PlayerbotAI* botAI, std::string const name = "equip upgrades") : EquipAction(botAI, name) {}
explicit EquipUpgradesTriggeredAction(PlayerbotAI* botAI, std::string const name = "equip upgrades") : EquipAction(botAI, name) {}

bool Execute(Event event) override;
};

class EquipUpgradeAction : public EquipAction
{
public:
EquipUpgradeAction(PlayerbotAI* botAI, std::string const name = "equip upgrade") : EquipAction(botAI, name) {}
explicit EquipUpgradeAction(PlayerbotAI* botAI, std::string const name = "equip upgrade") : EquipAction(botAI, name) {}

bool Execute(Event event) override;
};
Expand Down
6 changes: 2 additions & 4 deletions src/Ai/Base/Actions/LootRollAction.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,8 @@ bool LootRollAction::Execute(Event event)
}
else if (sPlayerbotAIConfig.lootRollLevel == 1)
{
// Level 1 = "greed" mode: bots greed on useful items but never need
// Only downgrade NEED to GREED, preserve GREED votes as-is
if (vote == NEED)
{
if (RollUniqueCheck(proto, bot))
Expand All @@ -101,10 +103,6 @@ bool LootRollAction::Execute(Event event)
vote = GREED;
}
}
else if (vote == GREED)
{
vote = PASS;
}
}
switch (group->GetLootMethod())
{
Expand Down
2 changes: 1 addition & 1 deletion src/Ai/Base/Actions/UseMeetingStoneAction.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,9 @@ class SummonAction : public MovementAction
SummonAction(PlayerbotAI* botAI, std::string const name = "summon") : MovementAction(botAI, name) {}

bool Execute(Event event) override;
bool Teleport(Player* summoner, Player* player, bool preserveAuras);

protected:
bool Teleport(Player* summoner, Player* player, bool preserveAuras);
bool SummonUsingGos(Player* summoner, Player* player, bool preserveAuras);
bool SummonUsingNpcs(Player* summoner, Player* player, bool preserveAuras);
};
Expand Down
3 changes: 1 addition & 2 deletions src/Ai/Base/ChatActionContext.h
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ class ChatActionContext : public NamedObjectContext<Action>
creators["use"] = &ChatActionContext::use;
creators["item count"] = &ChatActionContext::item_count;
creators["equip"] = &ChatActionContext::equip;
creators["equip upgrades"] = &ChatActionContext::equip_upgrades;
creators["equip upgrades"] = &ChatActionContext::equip_upgrade;
creators["unequip"] = &ChatActionContext::unequip;
creators["sell"] = &ChatActionContext::sell;
creators["buy"] = &ChatActionContext::buy;
Expand Down Expand Up @@ -258,7 +258,6 @@ class ChatActionContext : public NamedObjectContext<Action>
static Action* talents(PlayerbotAI* botAI) { return new ChangeTalentsAction(botAI); }

static Action* equip(PlayerbotAI* botAI) { return new EquipAction(botAI); }
static Action* equip_upgrades(PlayerbotAI* botAI) { return new EquipUpgradesAction(botAI); }
static Action* unequip(PlayerbotAI* botAI) { return new UnequipAction(botAI); }
static Action* sell(PlayerbotAI* botAI) { return new SellAction(botAI); }
static Action* buy(PlayerbotAI* botAI) { return new BuyAction(botAI); }
Expand Down
1 change: 1 addition & 0 deletions src/Ai/Base/Strategy/WorldPacketHandlerStrategy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ void WorldPacketHandlerStrategy::InitTriggers(std::vector<TriggerNode*>& trigger
NextAction("query item usage", relevance),
NextAction("equip upgrades", relevance) }));
triggers.push_back(new TriggerNode("item push result", { NextAction("quest item push result", relevance) }));
triggers.push_back(new TriggerNode("loot roll won", { NextAction("equip upgrades", relevance) }));
triggers.push_back(new TriggerNode("ready check finished", { NextAction("finish ready check", relevance) }));
// triggers.push_back(new TriggerNode("often", { NextAction("security check", relevance), NextAction("check mail", relevance) }));
triggers.push_back(new TriggerNode("guild invite", { NextAction("guild accept", relevance) }));
Expand Down
Loading