What's new
  • NEW: Happy Cataclysm gaming! The fresh 4.3.4 Cataclysm Repack V20.0 is now live - and downloadable from our brand-new Emucoach App.
    Download it now
  • Mists of Pandaria is calling! Heya - did you know that the newest 5.4.8 MoP Repack - version 7.1 - is now live?
    Download now

Copilotbuddy, a bot for WotLK 3.3.5a RELEASED

CopilotBuddy — HonorBuddy for WotLK 3.3.5a

Five months in. Reverse-engineering HB 4.3.4 and adapting it for WoW Wrath of the Lich King 3.3.5a (build 12340).

People have been asking for a working HB on WotLK for years. So I built one.
View attachment 5400
View attachment 5399
What's done:

  • Navigation — based on HB WoD/Legion navigation.
  • Bot API — 98% parity with HB 4.3.4. Some parts had to be adapted or stubbed since they simply don't exist in WotLK.
  • UI — HB WoD version.
  • Singular — ported from HB 4.3.4.

If you know XML and a bit of C#, and you want to help — test, write profiles, report bugs or nav blackspots — DM me.

WotLK original only. Build 12340. No Warmane, no custom servers.



Discord has a dedicated section for discussion and bug reports.

[Hidden content]
.
 
UPDATE 11 on Discord!
==========================

New features — Battlegrounds:
--------------

* BGBuddy: 6 BG map ported (HB 4.3.4 reference parity)
- ArathiBasin (map 529, 5-flag node control)
- WarsongGulch (map 489, flag carrier priority by spec)
- AlteracValley (map 30, NPC flag carriers)
- EyeOfTheStorm (map 566, 4 tower + central flag)
- TwinPeaks (map 726, Cataclysm WSG variant)
- BattleForGilneas (map 761, Cataclysm WSG variant)

* WoWInternals: BG plumbing
- Lua wrappers for GetBattlefieldStatus, AcceptBattlefieldPort,
JoinBattlefield, LeaveBattlefield (HB 4.3.4 BG API)
- DBC/Map: IsBattleground / IsArena fields + map id tables
- WoWLandMark: 6 BG-specific landmark conversion helpers
(ToArathiBasin / EyeOfTheStorm / BattleForGilneas /
AlteracValley / IsleOfConquest / StrandOfTheAncients)
- Battlegrounds: per-slot queue type tracking
- InfoPanel: exposes IsMeasuring / BGsCompleted / BGsPerHour
- BGBuddy: PrioritySelector no longer stuck on the first child
when the BG is in a non-combat phase

* WoWUnit.IsFriendly / IsHostile: now uses a reciprocal
WoWUnitReaction check. Fixes cross-realm ally detection in BGs
that the old IsHorde == IsHorde override was breaking

* BgMeshNavigator: HandleDoors overridden to no-op in BGs
(base MeshNavigator was spam-clicking WSG/IoC/SotA/AV gates
before the server-side open animation reached the client)

New features — DungeonBuddy:
--------------

* LFG: QueueRole enum (Auto / Tank / Healer / Damage) +
DungeonBuddySettings Role/TankInRandomGroups. SetLfgRoles()
implementation (was a stub) is now called before the first queue

* ScriptHelpers (HB 4.3.4 ports, previously stubs)
- CreateCastRangedAbility: class-based ranged pull, faces target,
stops movement, casts, then waits the cast time
- CreateWaitAtLocationUntilTankPulled: follower stays at
waitAtLocation until the tank engages
- GetRangedSpell: per-class ranged pull spell table (DK, Druid,
Hunter, Mage, Paladin, Priest, Rogue, Shaman, Warlock, Warrior)
- CreatePullNpcToLocation: tank drives to pull location, pulls
via ranged ability, waits for NPC to arrive. 4 overloads route
to the full 6-arg version with sensible defaults
- CreateMoveToContinue (WoWObject + WoWPoint overloads): return
Failure on MoveResult.Failed / PathGenerationFailed instead of
looping forever

* DungeonBuddy.cs: CreateLeaderMovementBehavior — leader/tank now
drives the dungeon via Profile.BossEncounters.PathBreadCrumbs
regardless of QueueType (was SoloFarm-only in Update 10).
Followers (DPS/healer) still use CreateFollowBehavior

* LfgManager.QueueForRandomDungeon / QueueForRandomHeroic: switched
from the LFD UI click (LFDQueueFrame_Join) to the direct WotLK
3.3.5a API. Hard-coded dungeon IDs (261 = Random Normal,
262 = Random Heroic) taken from LFGDungeons.dbc. The old UI
approach inherited whatever tab was last open in the LFD frame

* SpellDb: HasSpellByName() — fallback lookup against the full
Spells.bin for talents/passives the player hasn't actively cast
(Vengeance, Meditation, etc.). Used by role identification

New features — Extractor (MaNGOS vmap/mmap tools):
--------------

* vmap-extractor: extract WMO doodads (M2 placed inside WMO root
+ group chunks).
* All mesh regenerated in addition to sirius
--------------

New features — Core plumbing:
--------------

* WoWPulsator: port from HB 6.2.3. Pulse order is now Objects ->
ObjectManager.Update + Blacklist.Flush -> Lua.ProcessEvents ->
InfoPanel.Update -> Looting -> Targeting + HealTargeting ->
BotEvents -> Plugins -> Routine. WoWChat, WoWMovement.Pulse and
Mount.Pulse removed (not in HB 6.2.3)

* PartyBot IPC: RemotingClient / RemotingServer include public
fields in JSON (de)serialization

* TreeSharp.Switch: yield Failure instead of throwing on no match

* LocalPlayer: fixed Specialization spec detection (was returning
0 on some client builds because of a wrong field offset)

* ClientDb: dropped a few HB 4.3.4-only DBC entries that don't
exist in the 3.3.5a client (was throwing on startup in some
locales)

* SourceCompiler: pre-load + reference WCF assemblies so
plugins / quest behaviors touching System.ServiceModel can be
compiled at runtime. csproj ships the WCF reference set +
CopyLocalLockFileAssemblies

* UI/MainWindow: process lookup also matches the Luacct.exe
variant used by some private-server clients chinese.

Bug fixes — Singular wotlk:
--------------

* Warrior Protection (PvP + Normal Pull): damage spells (Heroic
Throw and friends) now gated by !Spell.IsGlobalCooldown +
Spell.WaitForCastOrChannel. The 4.3.4 reference port had no
gating so Heroic Throw fired on every pulse while on its 1.5s
CD, producing 40+ log lines in 2.4s

* Helpers/Spell: IsGlobalCooldown() (reads
SpellManager.GlobalCooldown — Spell.FixGlobalCooldown is not
exposed in 3.3.5a CopilotBuddy) + WaitForCastOrChannel(). Port
of Singular 5.4.8 Helpers/Spell.cs:512 and :622

Version numbering:
--------------

This release: v1.4.2 (Update 11).
Previous: v1.4.1 (Update 10).
 
UPDATE 12
==========================

New features — Localization & UI:
--------------

* Localization: HB-style i18n with 15 languages wired across the
entire UI (en, fr-FR, zh-Hans, zh-Hant, ru-RU, de-DE, es-ES, it-IT,
ko-KR, tr-TR, pt-PT, pl-PL, ja-JP, nl-NL, cs-CZ). Pattern follows
HB 6.2.3 strict: per-culture .resx files in Styx/Localization/,
MSBuild PostBuild target moves satellites into Languages/{culture}/
(HB folder pattern), ResxExtension markup extension
{loc:Resx Key=...} (HB Infralution pattern, simplified), App.config
with <probing privatePath="Languages"/> for runtime satellite
lookup. fr/zh/ru fully translated, others use EN fallback.
597 new resx keys, Globalization.Designer.cs generated,
gen_resx.py generator tool committed. Language picker GroupBox in
Settings (HB 6.2.3 CultureSelectWindow pattern),
Globalization.ApplyLanguage() hooked in App.xaml.cs OnStartup,
Language field in StyxSettings persisted to Settings.xml.

* Settings window: remove obsolete 'Meshes' GroupBox
(the bot reads its own DLL path via Navigation::GetMmapsPath() —
the setting was unused dead code).

New features — Navigation:
--------------

* nav: HB 6.2.3 4x4 sub-tile port. TileIdentifier.GetByPosition
inverted-convention bug fixed (worldX->tileX, worldY->tileY to
match Navigation::WorldToTile + MaNGOS file naming).
Navigator.EnsureTiles now actually calls EnsureTiles_C (was just
logging). Managed UnloadTile surface added (fail-soft if DLL
export missing). GetLoadedAdtCount for V5 4x4 ADT-level
diagnostic. MeshNavigator.OnPulse per-pulse tile streaming
(HB-faithful, no guard) with directional prefetch via
position-delta velocity. dtPathCorridor runtime exports/wrappers
removed (HB never uses it, 4 versions verified 2009-2017) —
PathFinder keeps internal usage only. BGBuddy.ChangeMap uses
MapId.ToString() instead of MapName. IMeshManager /
GarrisonMeshManager get UnloadTile interface method. 1x1 comments
updated to V5 4x4 references.

* Navigation: update movemap grid handling and API wiring
(Navigation::WorldToTile / MaNGOS file naming alignment).

Bug fixes — LevelBot:
--------------

* LevelBot: drop 1.5s blocking Sleep on OnMobKilled. StyxWoW.Sleep
on the main bot thread pauses EVERYTHING — targeting pulse, loot
pulse, move, combat. A 1.5s pause per kill is the entire reaction
window where LootTargeting could re-scan and pick up the corpse.

* LevelBot: spirit healer Sequence — fix ShouldUseSpiritHealer
never reset. The inner PrioritySelector in CreateSpiritHealerBehavior
had three children: (a) GossipFrame decorator -> select Healer
gossip, (b) Sequence(Lua.DoString('StaticPopup1Button1:Click()'))
-> always Success, (c) TreeSharp.Action -> AcceptXPLoss +
ShouldUseSpiritHealer = false. Child (b) always returned Success
before (c) could run, so the flag never reset.

* LevelBot: drop ConfirmLootSlot — Cataclysm+ API not present in
3.3.5a. ConfirmLootSlot() was introduced in Cataclysm for the
multi-loot window (multiple corpses in a single frame). WotLK
3.3.5a has only LootSlot() per single-corpse frame. The Lua call
was a silent no-op (or chat-error spam) and served no purpose
in our target client.

Bug fixes — DungeonBuddy:
--------------

* DungeonBuddy: ungate leader-movement behavior from SoloFarm mode.
CreateLeaderMovementBehavior now drives the dungeon via
Profile.BossEncounters.PathBreadCrumbs regardless of QueueType
(was SoloFarm-only in Update 11). Followers (DPS/healer) still
use CreateFollowBehavior.

Bug fixes — Combat / Styx:
--------------

* LocalPlayer.IsActuallyInCombat — drop FirstUnit guard, match HB
4.3.4. The FirstUnit guard was masking the actual combat flag
when the target list was momentarily empty during target swap.

* WeightSetEx: GetTalentTabInfo needs groupIndex + armor-class
guard. Talent lookup was returning the wrong tab for cross-armor
specs that share a class (e.g. Priest Holy/Disc/Shadow all map
to the same tab without the armor class filter).

* WoWGameObject: gather skill check — add skill.Bonus to effective
value. The gather check was comparing the base skill against
the required skill without including passive +skill bonuses
from gear / enchants / buffs, so nodes the character could
actually gather were flagged as "skill too low".

* SpellDb: add HasSpellByName — fallback for passive talent
detection (Vengeance, Meditation, etc.) by full name match against
the Spells.bin table for talents / passives the player hasn't
actively cast yet. Used by role identification in DungeonBuddy.

Minor:
--------------

* UI/SettingsWindow: update Discord invite link.

Version numbering:
--------------

This release: v1.5.0 (Update 12).
Previous: v1.4.2 (Update 11).

Minor-version bump because the release contains two major
user-facing additions (HB-style 15-language localization and the
4x4 sub-tile navigation port) plus a packaging restructure
(output/ runtime tree). Per HB / SemVer convention, additive
changes of this scope warrant a minor bump rather than a patch.
 
Big one this time: CopilotBuddy is going open source. 🎉🎉🎉
We've hit a point where the bot is solid enough — botbases, navigation, questing, dungeons, BGs, gathering, combat routines, all running in-game — that it makes more sense to open the source than to keep gatekeeping it. So that's what's happening: full source goes public, anyone can read it, fork it, fix it, build botbases or plugins on top of it.
This doesn't mean development stops. I'll keep pushing fixes and updates like always, but from now on it's not just me — anyone who wants to dig in, send a PR, write a dungeon script, or fix a routine can actually do it. That's the whole point of taking it this far.
None of this would exist without the people who stuck around through the rough early builds — the bug reports, the log dumps, the reproduction steps, the patience when things were falling over every other patch. That feedback is the reason the bot works as well as it does today. Genuinely, thank you.
Repo's up, contributing guidelines are in the README (botbase/plugin patterns, how to structure PRs). Jump in, break things, tell me what you find.
 
Back
Top