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]
keen to have a look thanks very much
 
UPDATE 8
==========================

New:
--------------

* Overlay system (port from HB 6.2.3)
- OverlayManager, OverlayWindowBase, OverlayControl ported from HB 6.2.3
- ToastOverlayWindow and WidgetOverlayWindow implemented; replaces the
old toast-only notification path
- UIOverlay: Overlay_ControlBar and Overlay_StatusDisplay — in-game
overlay displaying bot status, current action and context without
switching focus to the main window
- CapabilityManager / CapabilityFlags / CapabilityState / CapabilityStateChangedArgs
ported from HB 6.2.3; bot capabilities (movement, combat, loot, etc.)
now managed via named flags rather than ad-hoc booleans
- BotEvents start/stop wired to CapabilityManager; TreeRoot.Shutdown
integrated; overlay lifecycle tied to bot start/stop
- Requires the BuddyControlPanel plugin to be active — the overlay is
not created automatically; StyxWoW.IsOverlayActive (safe, non-creating
check) is used throughout the bot to guard all overlay calls when the
plugin is absent

* Unified WoW Data Extractor (standalone tool — separate workspace)
- New standalone C# / WPF application replacing the previous collection
of separate extraction utilities
- Combines Map, Mmap, Vmap and Road extractors in a single pipeline;
all four extraction passes run from one UI without requiring a running
server or build-time dependencies
- MPQ archive reading (StormLib via P/Invoke); ADT, WDT, DBC, WMO,
M2 parsing fully implemented in managed C#
- Navmesh generation via the native RecastBuilderDll (Recast/Detour C++);
outputs .mmap / .map / .vmap / .roadmap files compatible with
Navigation.dll at runtime
- WPF UI with per-map progress reporting, cancellation, and structured
log output
- CLI mode available for scripted / headless batch extraction
- Output format matches the 4×4 sub-tile layout (see Navigation section
below); tileWidth = 133.333 yards (ADT / 4), maxTiles derived from
ADT count × 16

* DataBinImporter utility (Tools/DataBinImporter)
- Standalone CLI tool that supplements data.bin with NPC entries from a
TrinityCore 3.3.5a world database
- Conservative strategy: only inserts entry IDs not already present in
data.bin; preserves all existing HB-sourced data
- data.bin NPC database updated with TrinityCore 3.3.5a world import:

Category Before After Delta
─────────────────────────────────────────────
Vendor 2,016 2,919 +903
Repair 645 1,436 +791
ReagentVendor 118 879 +761
ClassTrainer 308 521 +213
FoodVendor 324 353 +29
ProfTrainer 473 482 +9
Flightmaster 150 156 +6
Innkeeper 123 125 +2
─────────────────────────────────────────────
Total 8,440 9,573 +1,133

* DataBinInspector utility (Tools/DataBinInspector)
- Read-only diagnostic tool; dumps data.bin content with NPC flag
breakdown (vendor, trainer, flight master, repair, etc.)
- Useful for verifying DataBinImporter output without modifying the DB


Navigation — 4×4 sub-tile system:
--------------

* Tile format migrated from 1 ADT = 1 Detour tile → 1 ADT = 4×4 = 16
Detour tiles (MMAP_MULTI_TILE_VERSION = 5, matching original HB and
HB 6.2.3 Tripper)
- Sub-tile size: 133.333 yards (533.333 / 4)
- loadMap(mapId, x, y) loads all 16 sub-tiles for an ADT in a single
call; unload removes all 16
- MeshMapCalculator added (Tripper/Navigation): converts between WoW ADT
coordinates and Detour sub-tile coordinates; origin at ADT [32, 32]
(world 0, 0), formula: detourX = (adtX - 32) × 4 + subX
- TileIdentifier improved: sub-tile awareness, correct bounds calculation
- WorldMeshManager updated for sub-tile load/unload lifecycle
- Navigator query filters refactored into WowQueryFilter helpers —
avoids duplicated filter setup across query sites

* Navigation.dll (C++) — major overhaul
- MAX_POLYS_BUFFER and MAX_PATH_LENGTH raised from 740 → 8192
(matches HB 6.2.3 Tripper values)
- Navmesh query pool size raised from 65 535 → 748 983
(matches HB 6.2.3 WorldMeshManager)
- dtNodeIndex widened from unsigned short → unsigned int to support
meshes with more than 65 535 nodes
- Area costs updated to full HB 6.2.3 set (Ground=1.66, Water=3.33,
Lava=55, Road=1.0, Fall=1.7, Fly=1.0, Swim=2.5) — replaces the
placeholder costs used in prior builds
- NavTerrain enum migrated from bitmask to HB 6.2.3 sequential area IDs
- NavLog callback added (SetNavLogCallback_C): CalculatePathEx reports
FAILED / DT_PARTIAL_RESULT results back to the managed C# logger
- Corridor length exposed in NavStats and surfaced to managed code
- Movemap grid handling updated to match sub-tile layout
- Null guards added after fopen() in loadMapData / loadMap to prevent
crash on missing tile files

* Flightor
- CanFly: explicit map guard added — flying only attempted on Outland
(530) and Northrend (571); prevents aerial path attempts on private
servers where IsFlyableArea() incorrectly returns true in old-world
zones
- Dalaran removed from the hardcoded no-fly zone list in Navigator;
flying was legal in Dalaran in 3.3.5a (restriction introduced in
Cataclysm); IsFlyableArea() via Lua is now the authority
- Ground nav fallback (all three sites in MoveTo): Z-projection removed;
destination passed as-is to Navigator.MoveTo() — projecting to player
Z was causing CalculatePathEx FAILED results on sloped terrain

* MeshNavigator
- EnsureTiles timing probe: Stopwatch around EnsureTilesAroundPosition;
logs to diagnostic channel if > 2 ms
- PathRegen: diagnostic log at regen trigger (destChanged / needsRegen /
destination)
- GeneratePath: Stopwatch added; logs map, distance and elapsed ms to
diagnostic channel when path generation exceeds 5 ms
- Intermediate diagnostics (EnsureTiles probe, PathRegen trigger) removed
in final pathing adjust pass — only the GeneratePath timing kept

* Navigator (Styx)
- No-fly zone list corrected: Dalaran (4395) removed (was wrongly listed);
only true indoor dungeon areas retained (Pit of Saron 4613, Halls of
Reflection 4820)


Bug fixes — Core:
--------------

* Flight path system
- TaxiNodeInfo: new class reading current taxi node from CGTaxiMap memory
(dword_C0D7EC); used to correlate the player's current taxi position
with the DBC node table
- FlightPaths: rewritten to use TaxiNodeInfo DBC for node and connection
discovery; previously relied on incomplete static data
- GlobalOffsets: taxi node base and count offsets added

* LevelBot
- Flight master blacklisted if TaxiFrame fails to open after approach;
prevents the bot from approaching the same flight master repeatedly
when the NPC is not responding
- Vendor and mailbox interaction log messages corrected (wrong NPC type
was printed in several paths)

* TreeRoot
- Frame lock removed from the no-lock execution path; was acquiring the
lock unnecessarily when LockType.None was selected
- HonorbuddyUnableToStartException used consistently at startup failure
sites instead of plain Exception

* WoWPulsator
- Per-stage timing diagnostics removed from the pulse loop; the overhead
was measurable on lower-end hardware and the data was not acted on

* KillBetweenHotspots
- Ignored when bot was unmounted — mobs between hotspots were skipped
even with KillBetweenHotspots=true; now evaluated regardless of mount
state

* Blackspot
- Marking a blackspot in Eastern Kingdoms (MapId = 0) failed silently
due to an integer zero-check treating MapId=0 as "not set"; fixed

* WoWUnit
- Attackable: flag changed from UnitFlags.NotAttackable → UnitFlags.ImmuneToPC
(0x100); matches HB 4.3.4 flag_6 — critters and immune mobs were
incorrectly considered attackable with the old flag

* StyxWoW
- IsOverlayActive property added: returns true only if the overlay has
already been created by a plugin; does not trigger lazy creation,
safe to call when BuddyControlPanel is not loaded

* ProfileManager
- LoadProfileForLevel: logs selected sub-profile name and level range
at debug level
- GetProfileForLevel: logs each skipped sub-profile (name, level range,
continent, current level/map) at debug level — aids profile debugging
- LoadProfile: logs the file path being loaded at debug level

* Profile
- ProfileException during XML parse: was silently written to debug log;
now written to the main log at error level with "Profile parse error:"
prefix

* Blacklist
- Add(): logs the GUID (hex) and duration at debug level every time an
entry is blacklisted

* Settings
- Save/Load: XElement root name now encoded via XmlConvert.EncodeName;
fixes crash when the settings class name contains characters invalid
in XML element names

* ToastNotifier
- OnLevelUp / OnPlayerDied: replaced direct StyxWoW.Overlay access with
StyxWoW.IsOverlayActive guard — the old code lazily created and
activated the overlay even when BuddyControlPanel was not loaded

* GameStats
- Stale comment referencing ToastNotifier initialization removed

* BotManager
- Logs bot switch ("Changing current bot to: {name}") before assigning
the new current bot

* ActionMoveToPoi
- Movement delegated to Flightor.MoveTo() (HB 6.2.3 pattern); removed
the duplicate Mount.ShouldMount / Navigator.MoveTo path — Flightor
already dispatches to Navigator internally for ground navigation

* MainWindow
- Log dispatch uses DispatcherPriority.Background; heavy navigation
debug logging no longer starves UI input events (clicks, keyboard)

* Mount
- CancelShapeshift: logs the form being cancelled at debug level before
calling CancelShapeshiftForm()


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

* Druid
- Feral: rotation priority order corrected; several edge cases in cat
form energy management fixed
- Lowbie: WaitForCast guard added (was missing for Druid; introduced in
Update 7 for Priest only)

* Paladin
- Retribution: rotation updated, priority order corrected
- Common: shared paladin logic updated (seals, aura management)

* Priest
- Shadow: DoT refresh logic corrected; Mind Flay clipping fixed

* Warlock
- Demonology: rotation updated
- Common: shared warlock helpers updated (pet management, shard handling)
- Destruction / Affliction: minor fixes carried forward from Update 7
Shaman pass

* Hunter
- Beast Mastery, Marksmanship, Survival: all three specs refreshed;
pet ability usage and trap timing corrected
- Common: ranged attack range guards unified across specs

* Mage
- Common: shared mage logic updated (polymorph targeting, blink safety)

* Warrior
- Lowbie: melee chase logic added when target kites out of melee range
(same fix applied to Paladin/Hunter lowbie in Update 7; Warrior was
missed)

* Helpers
- CompositeBuilder: minor improvements to composite construction helpers
- Spell.cs: minor corrections


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

This release: v1.3.0 (Update 8).
Previous: v1.2.0 (Update 7).


==========================
 
Back
Top