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

UPDATE 13
==========================

Bug fixes — BGBuddy:
--------------

* BGBuddy/SOTA: fix AFK loop, use IsOnTransport instead of nearby
Transport GO. The previous IsOnTransport gate relied on a nearby
transport game object being present in the object manager; on
some SOTA intro phases the GO query returned null even though the
player was already mounted on the transport, so the bot stayed
stuck in the AFK/idle loop. Switched the gate to the local player
IsOnTransport flag (read once per pulse).

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

* LfgManager: dynamic random dungeon lookup by level via LfgDungeons
DBC. QueueForRandomDungeon / QueueForRandomHeroic used to hardcode
IDs 261/262 (WotLK Random Normal/Heroic, level 69-80 and 80-83
respectively), so any character below level 69 queued an ID the
server would reject with "you do not meet the requirements for
the chosen dungeon" (e.g. a level 56 user enabling the bot got
the error on every queue attempt). The new implementation
iterates the already-loaded LfgDungeons DBC, filters on
IsRandomDungeon (TypeId==6) + the requested Difficulty + the
player's level, and feeds the first matching ID to
SetLFGDungeon + JoinLFG. Level 56 now matches TBC/Classic random,
level 80 still gets the WotLK random categories. API surface
(SetLFGDungeon, JoinLFG, ClearAllLFGDungeons) verified against
Wow_12340.exe string table — the same native bindings used by
the previous implementation. Pattern matches HB 6.2.3's
LfgDungeons.Dungeons.Where(...) approach; the underlying DBC
wrapper is itself a port of HB 4.3.4's LfgDungeons.dbc schema.
(commit 80a5d84)

Bug fixes — GatherBuddy:
--------------

* GatherBuddy: spirit healer auto-fallback now accepts the resurrect
properly. When the corpse has no mesh (player died in mid-air,
corpse dropped to an unreachable location) the bot triggers the
spirit healer fallback per HB 4.3.4 GatherbuddyBot.smethod_94
pattern (UseSpiritHealer || (!CanFly && !CanNavigateFully)), but
the inline spirit healer sequence at GatherbuddyBot.cs:535-552
blindly clicked StaticPopup1Button1 after a fixed 1s sleep,
regardless of whether the resurrection popup was actually visible
— when no popup was visible (or another StaticPopup1 had stolen
the slot, e.g. a loot frame), the click went to nothing, the
resurrect was never accepted, and the bot entered an infinite
loop of "interact with spirit healer + try corpse + die again".
Each click now checks `if StaticPopup1 and StaticPopup1:IsVisible()`
first and falls back to the native `AcceptResurrect()` API
(verified in Wow_12340.exe string table at 0x9fdf2c) when no
popup is showing. Same double-click + 1000/500/2000ms timing as
HB 4.3.4 (GatherbuddyBot.smethod_95), only the click target is
conditional. (commit 87115a1)

Bug fixes — GatherBuddy:
--------------

* GatherBuddy: drop (!Mounted||!Flying) gate on the [4] combat
subtree. The gate prevented the combat subtree from running while
mounted, which also blocked combat in ground-mount zones where
engaging mobs from the mount is the intended behaviour (HB 4.3.4
and 6.2.3 do not gate the combat subtree on mount state).

* GatherBuddy: rename Loot checkbox key to ChkLootMobs (ChkXxx
convention). Existing ChkLootMobs key was a leftover from a
partial rename; aligned all Loot* keys to the ChkXxx pattern.

Bug fixes — Settings:
--------------

* fix: persist enabled plugins across restarts. The plugin-enabled
state was being written to the in-memory dictionary but not
flushed to Settings.xml on shutdown, so the next launch reverted
every plugin to its compile-time default. Settings now serialise
the enabled-plugin set on BotEvents.OnBotStopped. (PR #1,
Lofbergio/fix/plugin-enabled-persistence)

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

* LevelBot: restore 1500ms sleep in OnMobKilled. The original HB
4.3.4 LevelBot.smethod_17 OnMobKilled handler waits 1500ms after
a kill so the server-side UnitDynamicFlags.Lootable update
arrives in the client before the next LootTargeting.Pulse tick.
Commit 5905052 removed this sleep based on a misread of the HB
5.4.8 / 6.2.3 reference (those versions moved the handler into
a different file with timer-reset semantics instead of a
blocking sleep, but CopilotBuddy still uses the original LevelBot
flow). The mid-Pulse emptiness of the loot flag was what was
causing loots to be skipped or to hit the WaitLuaEvent
LOOT_OPENED timeout and trigger the "blacklist for 5-10 min"
fallback. Restored to the HB 4.3.4 ground truth.
(commits 6369037 / 872ec43)

Navigation:
--------------

* Navigation C++: port HB 6.2.3 NavMesh API — 11 methods ported
as thin wrappers around dtNavMesh: GetMaxTiles(mapId),
EncodePolyId(mapId, salt, it, ip), DecodePolyId(mapId, ref, out
salt, out it, out ip), DecodePolyIdSalt/Tile/Poly(mapId, ref),
GetTileAt(mapId, x, y), GetTile(mapId, i), GetTileStateSize,
StoreTileState, RestoreTileState. Tile pointers exposed as
`const void*` for C API compatibility (cast as IntPtr on the
C# side). mapId is added to every signature to support
CopilotBuddy's multi-map context (HB 6.2.3 has a single mesh
via this._mesh). GetTileAt passes layer=0 to match HB 6.2.3's
call shape and V4 mmtiles (single layer per coord).

* Bot-side: P/Invoke declarations + Navigator public wrappers
for the same 11 methods, following the existing GetPolyArea /
GetPolyFlags pattern (no IsLoaded check, no lock) to match
HB 6.2.3's style. Tile handles are IntPtr on the C# side.

* Lib/Navigation.dll: rebuilt to include the 11 new NavMesh
methods.

Localization:
--------------

* LootKilledMobs: new resx key + Globalization.Designer.cs
accessor. Used by GatherBuddy's "Loot killed mobs" toggle label
in the settings window (distinct from the existing ChkLootMobs
"Loot Mobs" label, which is the general loot toggle).

Singular wotlk (not yet pushed to origin):
--------------

* Spell.Buff: update DoubleCastPreventionDict unconditionally.
The dict was only updated when the buff was found in the
active spell list; for passives / short-duration auras the
double-cast guard would never learn the cooldown and re-fire
on the next pulse (WotLK QC).

* Hunter/Common: cast Trueshot Aura for MM in PreCombatBuffs +
CombatBuffs. The aura was missing from the BM/MM/SV buff
rotation; MM hunters were not refreshing Trueshot Aura
during combat (WotLK QC).

* SingularRoutine: drop !IsFlying gate from the Rest wrapper.
The previous Decorator condition `!Me.IsFlying && !Me.IsOnTransport
&& !DisableNonCombatBehaviors` blocked Rest while flying. HB
6.2.3 and Singular 5.4.8 do not gate Rest on flying — the
inner behavior itself handles mount cases.

* Druid/Balance: add configurable Barkskin to Normal combat
(matches Singular 4.3.4). New setting `Druid.BalanceBarkskinHealth`
(default 40%) drives a Barkskin trigger with the same
`IsCrowdControlled() || HealthPercent <= threshold` condition
as 4.3.4 `Balance.cs:153`. Restricted to Normal combat (Instance
combat unchanged). (merge commit 710c71b / PR commit eec170a,
contributor ReiDyx, PR #9)

* Movement + Spell: off-target hostile casts now switch target
and face before the cast. Adds `Movement.NeedsOffTargetCastSetup`
(gated on `unit.IsMe`, `unit.IsFriendly`, `IsCasting`, and
`CurrentTarget != unit`) and `Movement.CreateEnsureTargetAndFaceBehavior`.
Integrated into `Spell.Cast` (string and int overloads) inside
a `DecoratorContinue` so heals, self casts, friendly targets,
and CurrentTarget casts all bypass the check. Targets the
multi-dot spread case (Balance Moonfire on a mob behind the
player, Seed of Corruption, etc.). (merge commit 215ab10 /
PR commit a9001ca, contributor ReiDyx, PR #10)

Offmesh connections (extractor-csharp):
--------------

Unstaged changes in
Navigation View3D/Extractor_projects-master/extractor-csharp/offmesh.txt.

* offmesh.txt: bump existing jump radii from 0.4y to 2.0y
(commit 9dd7e9c). New entries for Map 607 (Strand of the
Ancients) — 16 entries covering the defender-side start jumps,
the four coloured gate teleporter landings (Red Sun / Purple
Amethyst / Green Emerald / Blue Sapphire), the Yellow Moon
teleporter, and the per-gate left/right descent jumps. New
entries for Map 628 (Isle of Conquest) — 12 entries: Alliance
Right/Left/Center in-out pairs (gate crossings) and the
matching Horde Right/Center/Left in-out pairs. All new entries
use the 2.0y radius.

Extractor (Navigation View3D/Extractor_projects-master/extractor-csharp):
--------------

* DoodadExtractor: apply WMO worldspawn fix before FixCoords
(commit b930a17). Mirrors the C++ wmo.cpp worldspawn rule
(pos.x and pos.z set to 533.33333*32 when both are zero) so
ADT WMOs whose raw pos is (0, y, 0) on the X/Z axes land at
(32G, 32G, y) instead of (0, 0, y).

* BuildWmoSpawn: mirror wmo.cpp worldspawn fix for ADT WMOs
(commit e471e01). Same root cause as the DoodadExtractor fix —
applies the worldspawn transformation so non-worldspawn WMOs
on terrain maps land at the correct world coordinates.

* M2 winding flip: emit (I1,I2,I0) cyclic permutation, not the
previous (I0,I2,I1) transposition (commit 267f318). The old
order flipped the M2 winding — Recast then saw M2 top faces as
ceilings and the bot walked on the wrong side.

* AppendGameObjectGeometry: align M2 winding with the vmtile M2
path (commit ed99629). GameObjectM2 path loaded raw (A,B,C)
indices from MPQ but emitted a different winding; aligned with
the corrected cyclic permutation.

* Tests: regression for M2 winding flip ordering with a
cross-product check (commit d05c9b1). A unit triangle in Z=+5
is computed for both orders (old vs new); the cross product
must yield +Z for the new winding.

* Tests: add PathfindTest for 1- and 2-mmtile path queries
(commit 9af6341). Standalone helper that loads one or two
.mmtile files and runs TestPathfinding / TestPathfindingTwoFiles
on them. Mirrors the C++ side.

* CLI: route 'pathfind' argv to PathfindTest for ad-hoc nav
diffing (commit 1940abb). Lets a developer drop into the
Release exe with two .mmtile paths and get a side-by-side path
query without rebuilding — no flags, no GUI.

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

Previous: v1.5.0 (Update 12).
Current: v1.5.2 (minor bump).
 
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]
Thank you!
 
UPDATE 14
==========================

Bug fixes — GatherBuddy:
--------------

* GatherBuddy: spirit healer gossip and popup confirm fix (PR #4).
Spirit healer resurrection now correctly opens the gossip window,
selects the resurrect option, and confirms the popup (commit
ab74be1 / merge 1522059). Previous flow skipped the gossip step
on some WotLK clients, leaving the corpse unrevived.

* GatherBuddy: align spirit healer flow with HB 6.2.3 Sequence
(commit a424a35). HB 6.2.3 wraps the spirit healer resurrection
in a Sequence (interact → wait for gossip → select resurrect →
confirm popup). The WotLK port had the actions ordered as a flat
PrioritySelector which could race the gossip frame opening.

* GatherBuddy: restructure vendor/repair as HB 6.2.3 Sequence
(commit 0559a26). The previous PrioritySelector let sell and
repair branches race each other; HB 6.2.3 uses a Sequence so the
bot always finishes one transaction before starting the next.

Bug fixes — Consumable / Inventory:
--------------

* Consumable: fix GetBestFood/GetBestDrink to actually pick the
best consumable (commit e4f6214). HB 4.3.4 had a broken
`StackCount > num && RequiredLevel > num2` strict-greater
condition that only ever accepted the very first item. Replaced
with `RequiredLevel` primary, `StackCount` tie-break.

* Consumable: include Refreshment in IsBasicFoodOrDrink (commit
ccabef2). HB 4.3.4 smethod_4 includes "Refreshment" in the
basic-food/drink gate; the WotLK port had stripped it, which
filtered out Conjured Mana Strudel / Conjured Crystal Water
even though those are the mage's primary food/water buffs.

Bug fixes — VendorManager:
--------------

* VendorManager: skip GetClosestVendor while player is on transport
(commit a881046). Fixes bot breakage during boat/zeppelin/tram
when the vendor lookup returns a vendor at the wrong map coord.
(Reverted in e6123f6 — left as reverted in master pending
re-port against the 1.5.2 navigator API.)

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

* DungeonBuddy: click LFDRoleCheckPopupAcceptButton +
StaticPopup1Button1 on role check (commit 7ab6d1d). The previous
call to `CompleteLFGRoleCheck()` silently fails on private
servers (popup stays open, server times out the queue, kicks
the player). HB 4.3.4 (DungeonBot.cs:7335) and HB 6.2.3
(DungeonBot.cs:5345) both click the role-check button plus the
generic static-popup button. DiscoBot.cs:702 in the same project
already used this pattern.

Bug fixes — BGBuddy:
--------------

* BGBuddy SOTA: gate on-boat check with !HasAura("Preparation")
(commit 3e29fc7). Stops "Waiting for boat" spam during the 60s
Preparation phase. HB 4.3.4 smethod_59 and HB 6.2.3 method_2
both gate the on-transport check with !HasAura("Preparation");
the WotLK port had dropped the guard, so attacker spawn
(directly on the boat) made `IsOnTransport = true` immediately
and the spam branch fired from BG entry through 60s prep.

Singular wotlk:
--------------

* EventHandlers.cs: fix SPELL_MISSED missType index Args[14]→Args[11]
for WotLK 3.3.5a (commit c403c2d). WotLK SPELL_MISSED has a
shorter payload than Cata — the missType "EVADE"/"IMMUNE"
sits at Args[11], not Args[14]. Without this, the EVADE
blacklist path in EventHandlers never fires and mobs stuck in
evade are never cleared from the POI.

* Retribution.cs: gate Crusader Strike on 5y melee range in
BG/Instance rotations (commit 3c332a0). The Normal rotation
already had the guard; BG and Instance dropped it, so CS was
cast out of range and the bot stayed stuck. HB 3.3.5a
ns13/Class129.cs:1053 gates via `Distance < 6.0` before
CastSpell("Crusader Strike").

* HealerManager: remove hard faction filter (commit fb5a232).
The filter blocked cross-faction BGs and groups; matches
Singular Legion behaviour.

* Druid: add Gift of the Wild to MoW HasAnyAura check
(commit c3f7652). Stops instance spam when Gift of the Wild
was applied by a party member.

* Warrior Arms: switch Bladestorm from Spell.Cast to Spell.BuffSelf
(commit 5173073). Singular 5.4.8 / 6.x.x pattern; the WotLK
Spell.Cast call was rejected by the 3.3.5a Bladestorm spell
requirement (channeled AOE self-buff).

* Generic: revert uncomment of Flasks/Trinket/Racial behaviors
(commit 6216fcf). Restores the Singular 4.3.4 reference state
for Flasks/Trinket/Racial; the uncomment introduced a Warrior
Rest food regression (Rest looped while Flasks was checked
ahead of Eat/Drink).

* Paladin: revert "share seal selection via CreatePaladinSealBehavior"
and the "add None value to PaladinSeal enum" commits (1296d42,
da008d2). The Singular 5.4.8 pattern didn't port cleanly to
WotLK (GetBestSeal sentinel lookup was wrong when no seal
was usable).

* Protection Warrior PvP/Normal Pull: wrap damage spells in
Spell.WaitForCastOrChannel + !Spell.IsGlobalCooldown gate
(commit fa667c3). Port of Singular 5.4.8/6.x.x CreateProtection
NormalPull. The 4.3.4 reference had no gating which produced
40+ Heroic Throw log lines in 2.4s when the spell is on its
1.5s CD.

* Spell: add IsGlobalCooldown() + WaitForCastOrChannel()
(commit 358392e). Port of Singular 5.4.8 Helpers/Spell.cs:512, 622.
IsGlobalCooldown reads SpellManager.GlobalCooldown since
Spell.FixGlobalCooldown is not exposed in 3.3.5a CopilotBuddy.

* Affliction Warlock: Pull now has low-level opener (commit
170f08f, merge PR #12 from GiftedWoW). Adds a Corruption/
Shadow Bolt pull rotation for low-level warlocks.

* Lifeblood (commit e990975) — re-applied after Generic revert.

Documentation / meta:
--------------

* readme: refresh mirror download links (commit 029078d).

extractor-csharp (WMO / offmesh / navmesh):
--------------

* MmapExtractor: filter Y bounds by sub-tile XZ bbox (commit
9119e2e). Darnassus branches no longer pull the navmesh
down through the terrain.

* offmesh.txt: drop Stormwind cave tunnel (commit 1c69573).
The tunnel entry caused the bot to teleport mid-pathing.

* Merge: bring optimisation branch into master (commit 1ca13b1).
Adds worldspawn fallback + spatial filter + road sub-zones.

* fix(mmap): use pmesh->bmin/pmesh->bmax for Detour tile origin
(commit b3baf66). WMO worldspawn navmesh corruption fix —
tiles that have a single WMO without terrain were getting
their origin shifted by the Detour tile-header bmin/bmax
instead of the underlying pmesh bounds.

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

Previous: v1.5.2 (Update 13).
Current: v1.5.3 (Update 14, no version bump — bugfix-only batch).
 
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]
nice i will try it now
 
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]
nice
 
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]
nice one really
 
UPDATE 15
==========================

Bug fixes — Offsets / Memory:
--------------

* GlobalOffsets: fix MapId offset 0xAB63BC -> 0xBD088C (commit
9dba6d1, Styx/Offsets/GlobalOffsets.cs + LocalPlayer.cs).
Matches HB 3.3.5a reference. Previous offset read garbage after
boat/zeppelin/tram rides, breaking pathing until the next zone
change forced a reload of the Map.dbc row.

* WoWUnit: remove bad ContestedPvPFlagged check + fix cross-realm
group detection (commit ba20385, Styx/WoWInternals/WoWObjects/
WoWUnit.cs). The GetReactionTowards ContestedPvPFlagged branch
was an invention not present in HB 4.3.4 / HB 6.2.3; the
equivalent logic lives in WoWFactionTemplate with the correct
FactionFlags & 4096 condition. Added GroupInfo.RaidMemberGuids
to IsInMyPartyOrRaid (HB 3.0.904 / MoP+ Singular pattern) so
cross-realm BG group members are correctly recognized as
friendly instead of being attacked due to faction mismatch.

Bug fixes — BGBuddy:
--------------

* fix BGBuddy spam-clicking BG gates (commit b9e19ae,
Bots/BGBuddy/BgMeshNavigator.cs + Styx/Logic/Pathing/
MeshNavigator.cs). HandleDoors was removed from base
MeshNavigator to match HB 4.3.4 (no door handling in original
BgMeshNavigator); removed the BgMeshNavigator.HandleDoors
override that was spam-clicking WSG/IoC/SotA/AV gates before
the server-side open animation reached the WoW client. Bots
now wait for the gate to actually open instead of clicking it
40+ times per second.

* fix SotA defense bot going to boat pier (commit 565779a,
Bots/BGBuddy/Logic/Battlegrounds/StrandOfTheAncients.cs).
Reverted [0] in CreateBeforePrepBehavior to HB 4.3.4 (just
reset timer, no pier ClickToMove). Defense-side bots were
being teleported to the boat pier every 60s prep because the
previous port added a hardcoded pier move that doesn't
differentiate offense/defense. Mirrors HB 4.3.4 Class55 —
just reset timer, no pier movement on defense.

Bug fixes — GatherBuddy:
--------------

* GatherBuddy: fix spirit healer gossip loop (commit 9fa332e,
Bots/Gatherbuddy/GatherbuddyBot.cs). WotLK 3.3.5a spirit healer
opens a GossipFrame with the "Resurrect" option BEFORE any
StaticPopup1 confirmation. Ported HB 6.2.3 LevelBot spirit
healer pattern — wait for GossipFrame OR StaticPopup1, select
the Healer option, then click the popup + accept XP loss. Stops
the bot from spam-clicking the visible popup button while the
gossip frame is still opening.

Bug fixes — QuestBot / LevelBot:
--------------

* LevelBot: port LevelBotIncludeTargetsFilter from HB 6.2.3
(commit a727e2e, Bots/Grind/LevelBot.cs). Adds critter / pet /
tagged / level-range / MobIDs filters and an aggro-fallback
for mounted travel, so the bot doesn't attack friendly/neutral
NPCs like Marvon Rivetseeker that share a faction with grind
targets.

* QuestBot: use LevelBot.LevelBotIncludeTargetsFilter (commit
367cdda, Bots/Quest/QuestBot.cs). Profile AvoidMobs / MobIDs /
level-range now respected. AvoidMobs alone didn't work before
because QuestBot had its own filter that didn't check the
list.

UI / HBRelog integration:
--------------

* README: document HBRelog integration in Ecosystem section
(commit 6f9b290, README.md). Added HBRelog to the ecosystem
table as the launcher + WCF relay for unattended multi-account
runs, plus a new "HBRelog integration" subsection explaining:
the bot-side contract CopilotBuddy already satisfies
(Plugins/HBRelogHelper.cs compiled at runtime, IRemotingApi
WCF channel, /pid /autostart /customclass /loadprofile /botname
cmdline args consumed by ApplyAutoStartConfig from commit
e8d46d3), g_ClientConnectionState 0xBD0792 detection,
net.pipe://localhost/HBRelog/Server pipe, watchdog for hangs/
crashes/logouts, profile configuration (one row per account)
and build instructions. Repo: https://github.com/Likon69/
HBRelog (.NET 4.8 desktop tool, fork of HighVoltz adapted for
WotLK 3.3.5a build 12340).

* README: bump mirrors to v1.5.3 (commit f9612ee,
README.md). Refresh Mega + fast-file download links for the
v1.5.3 release.

* MainWindow: add HBRelog AfterInitOnAuthSuccess equivalent
(commit e8d46d3, UI/MainWindow.xaml.cs). New
ApplyAutoStartConfig() mirrors Honorbuddy 4.3.4
MainWindow.xaml.cs:419-437 (AfterInitOnAuthSuccess) and
Start():847-866. Consumes command-line arguments forwarded by
HBRelog (and any other external launcher):
/loadprofile=<absolute path> load this profile before
starting
/botname=<name fragment> substring-match a BotBase
key, case-insensitive (use
the bot.Name display value,
e.g. "Questing" — NOT the
class name "QuestBot")
/autostart start the bot without waiting
for user click (implicit when
either of the two above is
present).
CommandLine.AutoLoadProfile / AutoStartBotName were already
parsed in Styx/Helpers/CommandLine.cs but never consumed prior
to this commit. Also updates Lib/Navigation.dll binary
(167424 bytes, no functional change in the dll blob).

Singular wotlk:
--------------

* No new commits since v1.5.3 (Update 14). Last Singular wotlk
commit on master is 3c332a0 (2026-07-12, Retribution CS range
gate) which was already in Update 14. Branches unchanged:
reidyx/master, reidyx/fix/balance-barkskin-pve,
reidyx/fix/balance-eclipse-dps-reset,
reidyx/fix/off-target-cast-facing — all already merged into
master prior to v1.5.3.

extractor-csharp (WMO / offmesh / navmesh):
--------------

* Branch: test/whitelist-json-config (WIP — not yet merged to
master). Master branch has no new commits since v1.5.3.

* fix(vmtile): dedup by (tileId, spawnId) composite key
(commit 2b2cf53, src/VmapExtractor/MangosTileAssembler.cs).
The C++ TileAssembler dedupes uniqueEntries by spawn.Id only
(works because of per-tile scope). The C# pipeline runs once
per map (within a single ExtractMapAsync), so the same doodad
spawn.Id legitimately appears once per tile it touches with
DISTINCT world positions. The single-Id dedup silently
collapsed the 2nd+ tile's spawn onto the 1st's position, which
is what made WMO doodad M2 records (candelabras, lanterns,
crates, etc.) appear at the wrong place in cities on the
continent build. The composite (tileId, spawnId) key restores
the C++ implicit per-tile semantics — restores M2 placement
for cities like Orgrimmar and Stormwind on a continent build.

* Fix WMO doodad extraction: parse MODN/MODS/MODD correctly,
skip corrupt groups, match Mangos count (commit a88eb0c,
src/Formats/Wmo/Parsing/WmoParser.cs +
src/VmapExtractor/MangosVmapExtractorService.cs). WotLK WMO
root files place a 0-size MOVV separator before MODS/MODN/MODD;
reading past it and breaking on missing groups (matching
wmo.cpp:758-763) restores Stormwind candelabras/lanternes/
crates, nsabbey shelves/busts, westfall barrels, cave-mine cars,
gnoll tents, and other WMO doodads in the vmtile. Azeroth tile
32_48 now matches the 627 records of the Mangos C++ reference.

* fix(m2): collision_box is at offset 188 (0xBC), not 336/352/368
(commit d35f7f3, src/Formats/M2/M2Parser.cs). Per wowdev.wiki/
M2 and verifiable from existing offset arithmetic in
TryBuildHeaderBoundingBoxProxy. Previous heuristic scanned
candidate offsets 336/352/368/232/384/400; the canonical
WotLK position is 188 (0xBC), 24 bytes inside the M2 header's
CAaBox field block.

* fix(m2): use collision_box AABB as fallback when no detailed
collision mesh (commit fa9e5b2, src/Formats/M2/M2Parser.cs).
Many WotLK M2 models (street furniture, wagons, stalls,
planters, banners) have no detailed boundingTriangles/
boundingVertices collision mesh in their header — only a CAaBox
collision_box AABB. Without this fallback, these objects were
silently dropped during vmap-extract (TryParseBoundingMesh
returned success-but-empty), so trees, wagons, etc. in
Stormwind appeared without navmesh collision. Faithful to
mangos/tc — probes the canonical offsets and picks the first
finite AABB.

* feat(whitelist): auto-discover known-physical-displayids.json
next to exe when --displayids not given (commit 4fd3263,
src/CLI/Program.cs + src/MmapExtractor/MmapExtractorService.cs).
Drops the mandatory --displayids CLI arg — the extractor now
finds the JSON next to the binary if no explicit path was
passed.

* feat(whitelist): add importAll flag for single-config
import-everything mode (commit 522bb69, known-physical-displayids
.json + src/MmapExtractor/KnownPhysicalDisplayIds.cs). When set
in the JSON config, all listed display IDs are imported as
physical (collidable) without per-entry override.

* test: whitelist JSON config + M2Parser/vmap/offmesh WIP
changes (commit e4ea143). Adds GAMEOBJECT_WHITELIST_GUIDE.md,
displayids_found.txt (87k lines from a fresh continent scan),
gameobject_spawns.bin (3.5 MB), updates
known-physical-displayids.json, offmesh.txt, and rewrites
M2Parser.cs (286 lines), KnownPhysicalDisplayIds.cs
(141 lines), MmapExtractorService.cs (105 lines).


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

Previous: v1.5.3 (Update 14).
Current: v1.5.4 (Update 15, bugfix-only batch — no new
features).

Notes:
--------------

* extractor-csharp test/whitelist-json-config branch is WIP
(M2 collision work + whitelist JSON config). Once stabilized,
a future update will merge it into master and bump the
extractor shipped with the bot.
 
Back
Top