An experimental server-side implementation of a 25-slot quest log for a Turtle/VMaNGOS-derived 1.12.1 server. It keeps the original 20 quest fields in place and maps slots 21-25 to 15 reserved player update fields.
Caution
This is not a universal one-line 20 -> 25 tweak. The server patch requires
a matching client-side hook for the exact WoW 1.12.1.5875 executable. With an
unpatched client, slots 21-25 are invisible and unsafe. Use a cloned test
realm first.
- Server patch: implemented and
git apply --checkverified. - Protocol mapping: verified against the local Octo client mapper.
- Runtime/production testing: not completed.
- Client executable or copyrighted game files: intentionally not included.
The patch was apply-checked on 15 August 2026 against the Turtle/VMaNGOS- derived source snapshot documented below. Treat this repository as an experimental candidate, not a production-ready release.
- Raises the logical quest capacity from 20 to 25.
- Routes all quest-slot reads and writes through one mapping helper.
- Keeps every canonical 1.12.1 update-field index unchanged.
- Uses 15 otherwise-unused combat-rating fields for slots 21-25.
- Adds the five extended quest-ID fields to cross-player visibility.
No database migration is required: active quests are already stored as rows
keyed by character and quest. No update fields are inserted or shifted, and
PLAYER_END remains unchanged.
The included patch targets a source tree with these paths:
src/game/QuestDef.h
src/game/Objects/Player.h
src/game/Objects/Player.cpp
src/game/Objects/UpdateFields.h
Known compatibility expectations:
| Core | Status |
|---|---|
| Local Turtle/VMaNGOS-derived fork | Patch applies to the verified snapshot |
| VMaNGOS | Likely portable for build 5875 after source review |
| CMaNGOS Classic | Same protocol idea, different source paths; port required |
| MangosZero | Same protocol idea, visibility adapter required |
| Other cores/client builds | Unsupported until independently verified |
Before porting, confirm that PLAYER_FIELD_COMBAT_RATING_1 through +14 are
not used by runtime code in your fork.
Clone or download this repository, then run the read-only preflight check:
git clone https://github.com/fredeborg1996/questlog25.git
cd questlog25
./scripts/preflight.ps1 -SourceRoot 'C:\path\to\your\server-source'If preflight succeeds, back up your source and apply the patch:
cd 'C:\path\to\your\server-source'
git apply --check 'C:\path\to\questlog25\quest-log-25-server.patch'
git apply 'C:\path\to\questlog25\quest-log-25-server.patch'Rebuild the world server under a separate candidate tag or binary name. Do not replace a live build until the matching client hook and the full test matrix below have passed.
To reverse the source change:
git apply --check --reverse 'C:\path\to\questlog25\quest-log-25-server.patch'
git apply --reverse 'C:\path\to\questlog25\quest-log-25-server.patch'The first 20 slots stay where the stock 1.12.1 client expects them. Slots 21-25 use the first 15 reserved combat-rating fields:
slot < 20
? PLAYER_QUEST_LOG_1_1 + slot * 3 + component
: PLAYER_FIELD_COMBAT_RATING_1 + (slot - 20) * 3 + component
| UI slot | Zero-based slot | Quest ID | Count/state | Timer |
|---|---|---|---|---|
| 21 | 20 | 0x4EE |
0x4EF |
0x4F0 |
| 22 | 21 | 0x4F1 |
0x4F2 |
0x4F3 |
| 23 | 22 | 0x4F4 |
0x4F5 |
0x4F6 |
| 24 | 23 | 0x4F7 |
0x4F8 |
0x4F9 |
| 25 | 24 | 0x4FA |
0x4FB |
0x4FC |
Five tail fields (0x4FD-0x501) remain unused. The complete machine-readable
contract is in protocol/q25-octo-cr-v1.yaml.
The client hook is specific to the exact 1.12.1.5875 executable. A safe client patcher must verify the executable SHA-256 and every expected instruction, create an atomic backup, and fail closed on unknown builds.
The UI may be implemented as a normal addon that sets the quest-limit globals
to 25 and polls GetNumQuestLogEntries() approximately every 0.2 seconds.
Polling is necessary because changes arriving through the reserved fields do
not emit the stock quest-log event.
This repository does not redistribute WoW.exe, Turtle/Octo MPQs, or modified
Blizzard FrameXML.
Use a cloned database and test realm:
- Accept quests 20, 21, 25, and attempt 26.
- Relog and restart the server; verify all 25 remain visible.
- Test kill, item, cast/speak, exploration, and timed objectives in slots 21-25.
- Complete, reward, abandon, and swap slots across the 20/21 boundary.
- Share quests and inspect party quest visibility.
- Regression-test equipment appearance, inventory, bank, buyback, stats, inspect, combat, custom haste/transmog systems, PlayerBots, and anti-cheat.
- Verify unpatched clients are capped at 20 or rejected.
Useful database audit:
SELECT c.guid, c.name, COUNT(*) AS active_quests
FROM characters AS c
JOIN character_queststatus AS q ON q.guid = c.guid
WHERE q.status <> 0 AND q.rewarded = 0
GROUP BY c.guid, c.name
HAVING COUNT(*) >= 20
ORDER BY active_quests DESC, c.name;Characters with quests in slots 21-25 retain those database rows after a server rollback. A 20-slot build exposes only 20 and leaves the extra quests hidden. Before rollback, reduce test characters to 20 active quests or restore the pre-deployment character-database backup.
The patch was prepared against files with these SHA-256 hashes:
| File | SHA-256 |
|---|---|
src/game/QuestDef.h |
40E990FD4F6D5C3B4D6BAB10B6694450E221E3AF58C758F27D267FE92C58E1E0 |
src/game/Objects/Player.h |
6D90341F9E7B59A75045B481E8A6E2F3953A00A0E398BFA506370FC3ABD04F24 |
src/game/Objects/Player.cpp |
3AE1DEE839F8C19FD8F0A6F2402D20D8580096BFDFC2D45B0ED1DC446C13B75D |
src/game/Objects/UpdateFields.h |
3CCAFFB25A4598A6E3B6B59DCCDD5434B9F6B882E5A56F44889BD9297A5AD82D |
The patch is distributed under the GNU Affero General Public License v3.0 to match the verified server source. World of Warcraft and related names are property of their respective owners. This project is not affiliated with or endorsed by Blizzard Entertainment or Turtle WoW.