wip vanilla private server written in elixir
i've had a lot of fun hacking on this and it would be neat if you did too
hop in the discord if you're interested in helping out
# the devenv shell provides elixir, a C++ toolchain, and namigator (NAMIGATOR_SRC);
# outside devenv, point NAMIGATOR_SRC at a pikdum/namigator checkout (rev in flake.lock)
git clone https://github.com/pikdum/thistle_tea.git
cd thistle_tea
mix deps.get
mix deps.compile
# need npm or bun or similar
cd assets && npm install && cd ../
# generate db/vmangos.sqlite (mobs, items, etc.)
cachix use thistle-tea
nix run .#vmangos-db -- ./db
# path to vanilla client, the directory with WoW.exe
# you'll want version 1.12.1 build 5875
# this is only for generating dbc.sqlite + maps
export WOW_DIR="/path/to/vanilla/client"
# generate db/dbc.sqlite (spell info, etc.) from the client
nix run .#dbc-db -- "$WOW_DIR" ./db
# generate navigation meshes from the client (takes a while)
nix run .#maps -- "$WOW_DIR"
# if not localhost, set GAME_SERVER:
# GAME_SERVER=192.168.1.110 iex -S mix
iex -S mix
# change server to localhost in realmlist.wtf
# default logins are in application.ex (test:test)
# also, there's a test server at 150.230.28.221More documentation, like platform-specific setup guides, can be found in the Wiki.
Existing navigation bakes need WMO metadata for indoor and outdoor queries, WMO lava, and spell-bearing liquids. New bakes include it automatically.
Naxxramas uses the client map name Stratholme Raid. It is included in new
.#maps bakes; existing installations need to generate that map before testing
liquid spells.
Ocean fatigue and outdoor lava also need terrain liquid data. New map bakes include it; existing bakes can add it without rebuilding navigation:
nix run .#terrain-data -- "$WOW_DIR" ./maps/terrainRestart the server after generating terrain data.
- vmangos.sqlite
nix run .#vmangos-db -- ./db- generated from the pinned VMangos SQLite snapshot in
flake.nix - this has mobs, items, etc.
- generated from the pinned VMangos SQLite snapshot in
- dbc.sqlite
nix run .#dbc-db -- "$WOW_DIR" ./db- generated from your local wow 1.12 client, since it can't be distributed
- this has spell info and similar
upstreams (VMangos/core, mangoszero/server, gtker/wow_dbc, vdechef/mysql2sqlite,
pikdum/namigator) are pinned in flake.lock; bump them with nix flake update.
individual targets if you just want the tools on PATH:
nix build .#mangos-map-extractor # map-extractor, vmap-extractor, mmap-extractor
nix build .#wow-dbc-converter # wow_dbc_converter
nix build .#namigator-mapbuilder # MapBuilder (navmesh generation)
nix develop .#wow-tools # shell with all of the above + sqlite + mariadb- logging in + creating characters
- entering world + seeing other players
- chatting, channels, and parties
- Meeting Stones, with class-based matchmaking, partial-party refills, innkeeper queues, native status messages, and retained solo queues across reconnect
- Spoken languages, with learned comprehension, racial languages, Curse of Tongues, readable whispers, and immediate skill updates
- Friends and ignore lists, with offline contacts, live presence, reconnect retention, chat filtering, and invitation restrictions
- Raid groups, with 40-member rosters, assistants, subgroups, target markers, ready checks, raid chat, subgroup buffs, and quest eligibility
- AFK and DND status, with public tags, whisper echoes and automatic replies, reconnect cleanup, and AFK battleground departure
- Emotes and posture, with DBC animations, persistent poses, movement and channel interruption, and Feign Death and pet-control cleanup
- mob spawns, combat, navigation, and respawns
- auto-attacks + class abilities
- Chained spells, with per-jump attenuation, spell modifiers, line of sight, injured-friendly selection, and caster bounces
- Spell radius modifiers, with area targeting, persistent ground effects, totem inheritance, talent reset, and reconnect acceptance
- Spell range modifiers, with unit casts, channel grace, Auto Shot, pet inheritance, and live bonus removal
- Database-selected creature targets, with living and corpse selectors, per-effect delivery, and native quest-item acceptance
- Scripted spell areas and configured cones, with source and destination areas, per-effect selectors, narrow and rear arcs, and native Steam Tonk acceptance
- Scripted spell destinations, with nearby creature, corpse, and object locations, triggered delivery, and native summon placement and expiry
- Database spell destinations, with fixed summon and ground-effect locations, world-copy isolation, and configured teleport arrival facing
- Game-object spell targeting, with per-effect trap and quest-object recipients, owner attribution, and native linked-trap and combat lifecycle acceptance
- Combo point builders, with Premeditation expiry, talent-generated points, finisher consumption, and single melee proc delivery
- Avoided ability power refunds, using paid energy and rage costs across charged discounts, immunity, and queued melee attacks
- Ownerless summoned objects, with shared loot, caster-independent lifetimes, linked objects, and environmental trap activation
- Owned summoned objects, with independent spell slots, Hunter trap replacement, death retention, and cleanup on expiry, logout, and world departure
- creature-specific melee and ranged attack power from slaying gear and consumables, with weapon-speed scaling and live target debuffs
- Armor and spell penetration, with school masks, stacking, equipment bonuses, and periodic damage
- Armor and resistance modifiers, with agility armor, base and total modifier layers, multiplicative percentages, and form and talent lifecycles
- school-based spell cost reductions, with stacking, client cost displays, and free casts
- percentage base-stat bonuses and penalties, including world buffs and Resurrection Sickness, with layered stacking and death-persistent aura expiry
- independent mana and energy regeneration across Druid forms, with the five-second rule, Reflection, and Innervate
- Shapeshift cleansing, with root and snare removal, daze exceptions, buff interruption, target restrictions, and movement acknowledgements
- Transformation appearance, with disguise priority, model geometry, form scales, creature weapons, reconnect restoration, and Polymorph regeneration
- ground mounts, mounted speed bonuses, and dismounting on cancellation or swimming
- Indoor and outdoor spell rules, with WMO interiors, cast-completion checks, automatic dismounting, and terrain-sensitive form and equipment passives
- parry haste for player and mob melee swings, including dual-wield timing
- shield block value from equipment, enchants, and percentage talents, shared by defensive blocks and Shield Slam
- learned parry and block capabilities, weapon and shield requirements, sheath restrictions, and defense-skill avoidance on the character sheet
- Combat skill progression, with shared weapon bonuses, off-hand and ranged training, resolved outcome checks, and launch-time weapon attribution
- Weapon attack accuracy, with dual-wield miss penalties, queued-attack suppression, hit scaling, PvP defense, and capped glancing adjustments
- Weapon-dependent offensive bonuses, with per-hand hit, weapon talents and enchants, skill-derived crit displays, and filtered white-attack damage
- Extra attacks, with pending melee batches, proc recursion guards, swing timing, combat-log feedback, and lifecycle cleanup
- Melee readiness, with shared facing and control checks, per-hand retries, dual-wield swing separation, and native error feedback
- Blocked-hit procs, with combined block and absorb outcomes, Retaliation, damage-shield contact rules, and incoming proc cooldowns
- Cast-completion procs, with Elemental Focus, separate cast and hit phases, spell/ability classification, and caster-proc suppression
- Stacking spell trinkets, with temporary spell-power snapshots, Unstable Power's diminishing bonus, Ascendance's increasing bonus, and linked aura cleanup
- Direct damage aura procs, with Flameblade, Holy Shield, carrier attribution, inherited rank rules, and charge exhaustion
- main-hand disarm: unarmed player combat, armed-creature damage reduction, weapon ability checks, and off-hand preservation
- rear-hit daze from uncontrolled creatures, with level and defense-skill scaling
- mechanic resistance for spells and melee abilities, including Orc Hardiness
- aura-state and spell-effect immunities, with partial spell blocking, control purges, and expiry cleanup
- school-specific damage immunity, with melee and periodic immune feedback and spell bypass attributes
- Binary spell resistance, with all-or-nothing control spells, school penetration, full-hit damage, triggered casts, and resistance lifecycle updates
- Triggered spell hits, with per-target hit rolls, original-caster modifiers, saved impact outcomes, channel target retention, and cancellation
- Wounded creature movement, with low-health running penalties, pet and boss exemptions, active path retiming, snare composition, and recovery
- periodic mana drains and life leech, with transfers limited by available mana and actual health lost
- healing suppression and amplification across direct heals and HoTs, with strongest-effect stacking and live expiry updates
- Absorb shield scaling, with caster healing and school power, low-rank penalties, talent ordering, depletion, and retained capacity across reconnect
- stack-aware dispels, with partial cures, Dispel All categories, and client combat-log feedback
- talent-based dispel resistance, including Vile Poisons, per-stack attempts, and failed-dispel feedback
- general and school-specific spell reflection, including Sheen of Zanza's guaranteed first reflection and charge consumption
- Grounding Totem and spell magnets, with shared interception charges, periodic protection, and totem immunity and destruction cleanup
- spell modifiers use VMangos family masks, including all 64 bits, to affect only the intended abilities
- stacked damage-over-time effects scale with remaining stacks after partial cures
- exclusive resistance buffs use the strongest effect per school, with weaker protection resuming on removal
- crowd-control diminishing returns, shared across casters with recovery after control ends
- Slow exclusivity, with strength and duration replacement, preserved direct damage, daze coexistence, and expiry and death cleanup
- Pacification and silence, including combined controls, attack suppression, channel interruption, and overlapping-source cleanup
- creature and pet fear movement, with bounded panic runs, control cleanup, and Curse of Recklessness suppression
- Critter escape behavior, with damage and debuff reactions, timed panic movement, combat recovery, and death cleanup
- Creature combat defaults, with template immunity, invincibility, defense rules, stationary behavior, and script overrides
- Creature-group combat, with shared aggro, evade, respawn, death notifications, scripted membership, and group conditions
- Creature formations, with coordinated patrol movement, temporary leaders, inherited waypoint routes, and return-to-formation behavior
- Shared creature leashes, with combat origins, assistance clocks, hostile-contact extensions, and return-home cleanup
- Creature-owned summon clocks, with owner inheritance, idle-owner links, lethal-hit extensions, and independent lifecycle cleanup
- Creature-owned combat pets, with a single monitored pet slot, aggressive combat, dead-pet replacement, and cleanup alongside independent guardians
- Player fear and confusion, with forced movement, client control restoration, bounded wandering, teleport recovery, and death cleanup
- Spell knockback, with acknowledged launches, observer movement, cast interruption, possession routing, and landing cleanup
- Spell-driven player pulls, with ballistic trajectories, height compensation, cast interruption, acknowledged movement, and observer playback
- Spell-driven taxi flights, with validated routes, form cleanup, accurate landing points, protected passengers, and native flight and relog acceptance
- Taxi flight resumption, with stationary offline checkpoints, reconnect continuation, stale callback rejection, and pet restoration on landing
- Priest Fade: temporary threat reduction with target switching and restoration on expiry
- Rogue Distract: ground-targeted facing and timed patrol pauses, preserving stealth
- Hunter Beast Lore: caster-specific beast damage, armor, and resistance information, with expiry and death cleanup
- Detect Magic, with enemy buff revelation, live buff updates, and dispel, expiry, and death cleanup
- pets
- Hunter trap procs, with Entrapment, Frost Trap's periodic root checks, diminishing returns, talent reset, and trap activation restrictions
- Trap detection and disarming, with hostile trap visibility, Detect Traps, safe Disarm Trap completion, and static trap respawn
- Noncombat critter companions, with separate ownership, following, item toggles, replacement, creation passives, and lifecycle cleanup alongside combat pets
- Autonomous guardians, with multiple summons, Engineering scaling, combat and following, creature stat buffs, and monitored lifetime cleanup alongside combat pets
- Wild creature summons, with independent lifetimes, Target Dummy taunts and salvage, timed death and corpse cleanup, and usable Field Repair Bots
- Hunter pet happiness: feeding, timed decay, damage tiers, death penalties, and retained state across dismissal and reconnect
- Hunter pet experience: kill rewards, level growth, owner-level caps, and retained progress, learned abilities, and reaction stance
- Hunter pet loyalty: happiness-based bonding, training-point earnings, rank loss, and runaway cleanup, retained through dismissal and reconnect
- Hunter pet training: ability purchases, rank-upgrade credits, passive stat bonuses, family and level checks, and retained learned spells
- Hunter pet stables: two purchased slots, storage and swaps, persistent pet identity, and retained health and progression
- Hunter pet naming: one-time names, observer updates, retained identity across pet lifecycles, and abandonment cleanup
- typed invisibility and detection, with observer visibility, creature aggro, and action interruption
- observer-specific stealth detection, with Perception, Paranoia, Track Hidden, facing, line of sight, and caster-specific Hunter's Mark
- items, bags, equipment, and vendors
- Spell item transformation, with atomic same-slot replacement, retained enchants and wear, shared cooldowns, and full-inventory support
- Vendor buyback, with 12 session slots, partial-stack sales, preserved item state, charge and durability pricing, paused timers, and logout cleanup
- Limited vendor stock, shared between buyers at each merchant, with timed restocking, template inventories, sold-out feedback, and recoverable purchases
- Ammunition, with client selection, compatible projectile costs, Auto Shot depletion, and thrown-stack or durability consumption
- Wand attacks, with weapon-school damage, Wand Specialization, and shared auto-repeat timing and cancellation
- Creature and pet attack power, with damage scaling, buff and debuff cleanup, percentage modifiers, and ranged equipment bonuses
- Passive on-equip item spells, with crit, hit, dodge, mana regeneration, item procs, durability and reconnect lifecycles, and form restrictions
- Learned defensive capabilities, with Shaman Parry talent learning and reset, defense skill projection, weapon requirements, sheath restrictions, and reconnect validation
- equipment durability, combat and death wear, broken-gear penalties, and vendor repairs with reputation discounts
- Spell-driven durability, with exact-slot and carried-gear wear, percentage damage, negative-point repairs, execution logs, and restored equipment effects
- alcohol intoxication, client drunkenness effects, gradual sobering, and death cleanup
- looting + group loot
- Rogue Pick Pocket, with private loot, quest drops, and failed-attempt retaliation
- Skinning, with corpse loot prerequisites, profession skill checks and gains, and private leather loot
- Gathering and object locks, with Mining, Herbalism, shared key and skill requirements, repeated vein harvests, and per-spawn skill gains
- Spell focus requirements, with forges, anvils, cooking fires, alchemy labs, native errors, and revalidation before casting costs
- Spell-granted skill ranks, with profession starter recipes, preserved progress on rank upgrades, riding values, and abandonment cleanup
- Teaching spells and recipe books, with recipe learning, Expert profession books, atomic consumption, cancellation, and specialization requirements
- First Aid, with healing channels, recipient lockouts, interruption, rejected-use item preservation, and reconnect retention
- Consumable stacking, with separate food and drink recovery, combined meals, Well Fed replacement, and exclusive vanilla flasks
- Explicit spell stacking groups, with ordered scroll and elixir upgrades, preserved costs on rejection, named food exclusivity, and synchronized spell-damage fields
- Inventory containers and lockboxes, with retained private loot, Pick Lock, consumable keys, atomic claims, and full-bag recovery
- Trade-slot unlocking, with paid lockpicking, consumable keys, final requirement checks, and retry without closing the trade
- Wrapped gifts, with atomic paper consumption, creator labels, and retained item identity, charges, and enchants through trade and opening
- Timed items, with client countdowns, offline lifetime rules, conjured-item cleanup, and expiration across equipment, bags, and bank storage
- Disenchanting, with exact-item consumption, private material loot, Enchanting skill gains, and recovery when bags are full
- Permanent equipment enchants, with atomic material costs, profession skill gains, independent equipment bonuses, and weapon procs
- Charged weapon coatings, with finite poison charges, proc chance talents, atomic application, and depletion cleanup
- Creature-specific flat damage, including Beastslayer and Elemental Slayer enchants across weapon attacks, spells, and periodic damage
- quests
- Quest dependencies, with signed and alternative prerequisites, exclusive groups, chains, breadcrumbs, profession requirements, and live NPC marker refreshes
- Seasonal quests, with world-event eligibility, live questgiver markers, stale-dialog rejection, and retained progress across event changes
- Quest reward spells, with caster selection, hidden automatic quest rewards, and native Naxxramas attunement
- Quest sharing, with party confirmations, eligibility feedback, inherited timers, source-item lifecycle, and stale-offer cleanup
- Item-started quests, with owned starter validation, atomic item exchanges, retained objectives, full-bag rejection, and party confirmation
- Quest tool targets, with creature entry and life-state restrictions, rejected-use recovery, corpse capture, and separate caster rewards
- Game-object questgivers, with per-player activation, native quest chains, conditioned gossip, and scripted player casts
- xp, leveling, and exploration
- Rested experience and logout, with offline inn and wilderness gains, idle rest updates, native logout countdowns, and cancellation cleanup
- Dungeon and raid admission, with isolated copies, raid-group requirements, map player caps, account-wide hourly entry limits, and safe login recovery
- Instance group membership, with group copy adoption, removal countdowns, reinvite cancellation, home transfers, and safe regrouping
- Deadmines boss doors and gunpowder cannon breach, with Smite's alarms and pirate response
- dying + resurrecting
- Corpse recovery, with escalating repeat-death delays, reconnect countdowns, server-enforced reclaim checks, and battleground recovery rules
- Dungeon corpse return, with outdoor entrance markers, ghost portal restrictions, recovery into the original copy, and faction-aware graveyard selection
- Spell resurrection, with owned-corpse targeting, cross-map offers, instance admission, recovery after travel acknowledgement, and Rebirth countdown bypass
- Soulstones and Reincarnation, with reagent consumption, cooldowns, and talent modifiers
- Deferred spell cooldowns, with aura and owned-object events, retained item overrides, ritual cancellation, and reconnect restoration
- Cannibalize, with nearby corpse eligibility, triggered healing channels, damage interruption, and animation cleanup
- Spell interrupts, with channel cleanup, school lockouts, native cooldowns and combat logs, reconnect restoration, and creature mechanic immunity
- Creature elemental combat, with template school immunity, elemental melee, resistance and wards, Dampen Magic, and native damage-school feedback
- Buff and debuff capacity, with priority-based replacement, separate 32-buff and 16-debuff limits, hidden aura exemptions, and shared lifecycle cleanup
- fall damage, Safe Fall, and Slow Fall protection
- Environmental fire damage, with world campfires, resistance, shield depletion, combat-log feedback, and death durability loss
- underwater breath timers, drowning, water-breathing effects, and extended breath reserves
- ocean fatigue, coastal recovery, exhaustion damage, transport protection, and graveyard rescue for ghosts
- Lava exposure, with outdoor and WMO liquids, contact grace, fire resistance, shield depletion, and death cleanup
- Liquid spells, with Naxxramas slime, periodic nature damage, stat penalties, exit recovery, and reconnect restoration
- swimming speed bonuses and snare updates, synchronized with the player and nearby observers
- gossip + trainers
- Innkeeper home binding, with confirmation, retained home locations, Hearthstones, Astral Recall, and replacement Hearthstones
- chests, fishing, and chairs
- resource tracking for herbs, minerals, and treasure, with exclusive tracking modes
- Auction houses, with linked faction markets, neutral auctions, bids, buyout, cancellation, expiry, exact-item escrow, and recoverable mail settlement
- idewave - reference implementation
- mangos - reference implementation
- VMangos - world database
- mysql2sqlite - convert world database to sqlite
- shadowburn - auth crypto + reference implementation
- wow_dbc_converter - convert dbc to sqlite
- wow_messages - packet structure
- wowdev - documentation