chore(repo): move fork docs and logs under contrib/fractured-dev-extras
Stock AzerothCore does not ship CLAUDE.md, BUILD-NATIVE.md, or local build logs at repo root. Park them under contrib/fractured-dev-extras/ so the repo root stays close to upstream and dev clutter is contained. - mv CLAUDE.md, BUILD-NATIVE.md -> contrib/fractured-dev-extras/ - mv build-worldserver.log + _build_paragon_*.log there (untracked / ignored) - add contrib/fractured-dev-extras/README.txt explaining the layout - gitignore: contrib/fractured-dev-extras/*.log Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,292 @@
|
||||
# Fractured — Native Build Guide
|
||||
|
||||
This is a fork of [AzerothCore](https://www.azerothcore.org/) with a custom
|
||||
`CLASS_PARAGON` (id 12), the `mod-paragon` server module, and `mod-ale`
|
||||
(LuaJIT scripting) vendored in-tree. This document covers building the
|
||||
server **natively** (no Docker). For the Docker workflow, see
|
||||
`docker-compose.yml` plus `docker-compose.override.yml` at the repo root.
|
||||
|
||||
The upstream AzerothCore wiki is the authoritative reference for OS
|
||||
prerequisites; everything here is just the deltas you need on top of it.
|
||||
|
||||
- Linux: <https://www.azerothcore.org/wiki/linux-requirements>
|
||||
- Windows: <https://www.azerothcore.org/wiki/windows-requirements>
|
||||
- macOS: <https://www.azerothcore.org/wiki/macos-requirements>
|
||||
|
||||
---
|
||||
|
||||
## Fractured client + network defaults
|
||||
|
||||
Production Fractured uses a non-default **auth** port so the client realmlist can be:
|
||||
|
||||
```text
|
||||
set realmlist hsrwow.net:47497
|
||||
```
|
||||
|
||||
(Patched 3.3.5 clients that support `host:port`; otherwise use port forwarding to **3724**.)
|
||||
|
||||
- **`authserver.conf` → `RealmServerPort`** must be **`47497`** (matches `authserver.conf.dist` in this repo).
|
||||
- **`realmlist` table → `port`** is the **world** port (default **8085**, same as `WorldServerPort` in `worldserver.conf.dist`), **not** 47497.
|
||||
- **`realmlist` → `address`** defaults to **`hsrwow.net`** in base SQL; change if your public hostname differs.
|
||||
|
||||
---
|
||||
|
||||
## What you get when you build this fork
|
||||
|
||||
- Worldserver with `CLASS_PARAGON` and Paragon-aware DK rune / sticky
|
||||
combo-point logic linked into core.
|
||||
- `modules/mod-paragon` (statically linked): Paragon player hooks, AE/TE
|
||||
currency, gametables, `.paragon` chat commands.
|
||||
- `modules/mod-ale` (statically linked): the ALE Lua scripting engine,
|
||||
which fetches LuaJIT at configure time. **Requires `-DLUA_VERSION`.**
|
||||
- Tools (`mapextractor`, `vmap4_*`, `mmaps_generator`) for client data.
|
||||
|
||||
---
|
||||
|
||||
## 1. Install prerequisites
|
||||
|
||||
### Linux (Ubuntu 22.04 / Debian 12)
|
||||
|
||||
```bash
|
||||
sudo apt update
|
||||
sudo apt install -y \
|
||||
git cmake make gcc g++ clang \
|
||||
libmariadb-dev-compat libmariadb-dev default-libmysqlclient-dev \
|
||||
libssl-dev libbz2-dev libreadline-dev libncurses-dev \
|
||||
libboost-all-dev \
|
||||
mariadb-server p7zip-full
|
||||
```
|
||||
|
||||
If you prefer MySQL 8 over MariaDB, install `mysql-server` instead and
|
||||
keep `default-libmysqlclient-dev`.
|
||||
|
||||
### Windows 10 / 11
|
||||
|
||||
Install (any recent versions):
|
||||
|
||||
- **Visual Studio 2022** with the *Desktop development with C++*
|
||||
workload (MSVC v143 toolset, Windows 10/11 SDK).
|
||||
- **Git for Windows**.
|
||||
- **CMake 3.16+** (the GUI is fine).
|
||||
- **MySQL Server 8** *or* **MariaDB 10.x** with the C connector
|
||||
development headers (the MySQL Installer's "Connector C" component).
|
||||
- **OpenSSL 3.x** (e.g. the [Shining Light](https://slproweb.com/products/Win32OpenSSL.html)
|
||||
Win64 build — pick the *full* installer, not "Light"). Set the
|
||||
`OPENSSL_ROOT_DIR` env var to its install path if CMake can't find it.
|
||||
- **Boost ≥ 1.74** prebuilt for MSVC (e.g. from
|
||||
<https://sourceforge.net/projects/boost/files/boost-binaries/>). Set
|
||||
`BOOST_ROOT` to its install path so CMake can locate it.
|
||||
- **7-Zip** for extracting client data archives.
|
||||
|
||||
### macOS
|
||||
|
||||
Use Homebrew:
|
||||
|
||||
```bash
|
||||
brew install cmake boost openssl@3 mysql readline ncurses p7zip
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 2. Clone the repo
|
||||
|
||||
```bash
|
||||
git clone https://github.com/Dawnforger/Fractured.git
|
||||
cd Fractured
|
||||
```
|
||||
|
||||
The `mod-paragon` and `mod-ale` modules are already in `modules/`; no
|
||||
extra `git clone` needed.
|
||||
|
||||
---
|
||||
|
||||
## 3. Configure with CMake
|
||||
|
||||
`mod-ale` requires you to pick a Lua version at configure time. Use
|
||||
**LuaJIT** to match what the team's Docker image uses:
|
||||
|
||||
### Linux / macOS
|
||||
|
||||
```bash
|
||||
mkdir -p build
|
||||
cd build
|
||||
|
||||
cmake .. \
|
||||
-DCMAKE_INSTALL_PREFIX=$HOME/azeroth-server \
|
||||
-DCMAKE_C_COMPILER=clang \
|
||||
-DCMAKE_CXX_COMPILER=clang++ \
|
||||
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
|
||||
-DLUA_VERSION=luajit \
|
||||
-DTOOLS_BUILD=all \
|
||||
-DSCRIPTS=static \
|
||||
-DMODULES=static \
|
||||
-DWITH_WARNINGS=ON
|
||||
```
|
||||
|
||||
GCC works too (drop the `CMAKE_*_COMPILER` lines or set them to `gcc`/`g++`).
|
||||
|
||||
### Windows (CMake GUI)
|
||||
|
||||
1. **Source code** → repo root (`Fractured/`).
|
||||
2. **Build the binaries** → `Fractured/build`.
|
||||
3. *Configure* → choose **Visual Studio 17 2022** generator, **x64**.
|
||||
4. After the first configure pass fails or warns about Lua, set:
|
||||
- `LUA_VERSION` = `luajit`
|
||||
- `CMAKE_INSTALL_PREFIX` = e.g. `C:/azeroth-server`
|
||||
- `BOOST_ROOT` (if not already detected)
|
||||
- `OPENSSL_ROOT_DIR` (if not already detected)
|
||||
- `MYSQL_INCLUDE_DIR` / `MYSQL_LIBRARY` if MySQL wasn't auto-found
|
||||
5. *Configure* until clean, then *Generate*, then *Open Project*.
|
||||
|
||||
### Important flags
|
||||
|
||||
| Flag | Recommended | Why |
|
||||
|------|-------------|-----|
|
||||
| `LUA_VERSION` | `luajit` | Required by `mod-ale`; matches team Docker image. |
|
||||
| `MODULES` | `static` | Statically links `mod-paragon` and `mod-ale` into the worldserver. |
|
||||
| `SCRIPTS` | `static` | Default; static script linkage. |
|
||||
| `TOOLS_BUILD` | `all` | Builds map/mmap/vmap extractors. Set to `none` once you have client data. |
|
||||
| `CMAKE_BUILD_TYPE` | `RelWithDebInfo` | Default for production-quality builds with usable backtraces. Use `Debug` only when stepping through code. |
|
||||
|
||||
---
|
||||
|
||||
## 4. Compile
|
||||
|
||||
### Linux / macOS
|
||||
|
||||
```bash
|
||||
make -j$(nproc) # or: -j$(sysctl -n hw.ncpu) on macOS
|
||||
make install
|
||||
```
|
||||
|
||||
### Windows
|
||||
|
||||
In Visual Studio, set the configuration to **RelWithDebInfo / x64**, then:
|
||||
|
||||
1. Build `ALL_BUILD`.
|
||||
2. Build `INSTALL`.
|
||||
|
||||
Or from a *Developer PowerShell for VS 2022* in the `build` directory:
|
||||
|
||||
```powershell
|
||||
cmake --build . --config RelWithDebInfo
|
||||
cmake --install . --config RelWithDebInfo
|
||||
```
|
||||
|
||||
> If the build OOMs on a low-RAM machine, pass `-j 4` (or fewer) to
|
||||
> `make` / `cmake --build`. The Docker image hard-caps `-j 4` for the
|
||||
> same reason.
|
||||
|
||||
---
|
||||
|
||||
## 5. Set up databases
|
||||
|
||||
The standard AzerothCore three-database layout (`acore_auth`,
|
||||
`acore_world`, `acore_characters`) applies unchanged. Follow:
|
||||
|
||||
<https://www.azerothcore.org/wiki/database-installation>
|
||||
|
||||
Easiest path: run the worldserver once with empty databases and let
|
||||
`AC_FORCE_CREATE_DB=1` populate them, **or** use `dbimport` from the
|
||||
install dir.
|
||||
|
||||
The Fractured-specific SQL (mod-paragon) lives under
|
||||
`modules/mod-paragon/data/sql/db-{world,characters}/base/` — that's the
|
||||
**AzerothCore-standard module layout**, which means AC's built-in
|
||||
DBUpdater picks it up automatically on every `worldserver` /
|
||||
`dbimport` start. New SQL files are applied; previously-applied ones
|
||||
are skipped via the hash recorded in `acore_world.updates` /
|
||||
`acore_characters.updates`. No manual `mysql < ...` steps required for
|
||||
deploys.
|
||||
|
||||
Modify-and-redeploy works the same way: change the file, push, pull on
|
||||
the VPS, and the next `dbimport` run sees the new hash and re-applies.
|
||||
|
||||
---
|
||||
|
||||
## 6. Configure the server
|
||||
|
||||
After `make install`, your install prefix has the layout:
|
||||
|
||||
```
|
||||
<INSTALL_PREFIX>/
|
||||
bin/ worldserver, authserver, *extractor tools
|
||||
etc/ worldserver.conf.dist, modules/*.conf.dist
|
||||
data/ client data (you provide)
|
||||
logs/
|
||||
```
|
||||
|
||||
1. Copy each `*.conf.dist` to `*.conf` next to it (or in
|
||||
`etc/modules/`).
|
||||
2. Set the `*DatabaseInfo` lines in `worldserver.conf` and
|
||||
`authserver.conf` to point at your DB.
|
||||
3. In `etc/modules/mod_paragon.conf`, review the Paragon-specific
|
||||
options (sticky combo points, multi-resource, Ability/Talent Essence
|
||||
settings).
|
||||
4. In `etc/modules/mod_ale.conf`, set `ALE.Enabled = 1` and (optionally)
|
||||
`ALE.ScriptPath` if you want a custom Lua scripts folder.
|
||||
|
||||
---
|
||||
|
||||
## 7. Extract client data
|
||||
|
||||
Same as upstream AzerothCore. Run the extractors against your 3.3.5a
|
||||
client directory once and copy the results into `<INSTALL_PREFIX>/data/`:
|
||||
|
||||
```bash
|
||||
cd <wow-3.3.5a-client>/
|
||||
<INSTALL_PREFIX>/bin/mapextractor
|
||||
<INSTALL_PREFIX>/bin/vmap4_extractor
|
||||
<INSTALL_PREFIX>/bin/vmap4_assembler Buildings vmaps
|
||||
<INSTALL_PREFIX>/bin/mmaps_generator
|
||||
mv dbc maps vmaps mmaps Cameras <INSTALL_PREFIX>/data/
|
||||
```
|
||||
|
||||
You can also share data between teammates — these directories are
|
||||
client-only and don't depend on the build.
|
||||
|
||||
---
|
||||
|
||||
## 8. Run
|
||||
|
||||
```bash
|
||||
cd <INSTALL_PREFIX>/bin
|
||||
./authserver &
|
||||
./worldserver
|
||||
```
|
||||
|
||||
On Windows, run `authserver.exe` and `worldserver.exe` from a console
|
||||
window so you can see startup output.
|
||||
|
||||
---
|
||||
|
||||
## 9. Updating from `origin`
|
||||
|
||||
```bash
|
||||
cd Fractured
|
||||
git pull
|
||||
cd build
|
||||
cmake .. # only needed if CMakeLists.txt changed
|
||||
make -j$(nproc)
|
||||
make install
|
||||
```
|
||||
|
||||
If a pull touches `modules/*/sql/`, re-apply those SQL files against
|
||||
the relevant database.
|
||||
|
||||
---
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
- **`Could NOT find Lua`** at CMake time: you forgot `-DLUA_VERSION=luajit`.
|
||||
- **`fatal error: 'mysql.h' file not found`** on Linux: install
|
||||
`default-libmysqlclient-dev` (or `libmariadb-dev`).
|
||||
- **`Could NOT find Boost`** on Windows: set the `BOOST_ROOT` env var (or
|
||||
the `BOOST_ROOT` CMake cache var) to your prebuilt Boost install.
|
||||
- **Worldserver crashes on a Paragon character**: confirm the
|
||||
`mod-paragon` SQL has been applied to both `acore_world` and
|
||||
`acore_characters`. Missing `character_paragon_currency` is the most
|
||||
common cause.
|
||||
- **Action buttons grey out for rune spells on Paragon**: this fork
|
||||
expects the matching client UI patch (`patch-enUS-5.MPQ`). The server
|
||||
build is correct as-is; the visual issue is client-side.
|
||||
@@ -0,0 +1,126 @@
|
||||
# CLAUDE.md
|
||||
|
||||
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
||||
|
||||
## Project Overview
|
||||
|
||||
AzerothCore is an open-source MMORPG server emulator for World of Warcraft patch 3.3.5a (Wrath of the Lich King). It's a C++ project built with CMake, using MySQL for data storage. Licensed under GNU GPL v2.
|
||||
|
||||
## Build Commands
|
||||
|
||||
### Configure and build (out-of-source build required)
|
||||
|
||||
- Skip building unless explicitly requested.
|
||||
|
||||
```bash
|
||||
# Create build directory and configure
|
||||
mkdir -p build && cd build
|
||||
cmake .. -DCMAKE_INSTALL_PREFIX=$HOME/azeroth-server -DCMAKE_BUILD_TYPE=RelWithDebInfo \
|
||||
-DSCRIPTS=static -DMODULES=static
|
||||
|
||||
# Build (use appropriate core count)
|
||||
make -j$(nproc)
|
||||
make install
|
||||
```
|
||||
|
||||
### Key CMake options
|
||||
|
||||
- `SCRIPTS`: none, static, dynamic, minimal-static, minimal-dynamic (default: static)
|
||||
- `MODULES`: none, static, dynamic (default: static)
|
||||
- `APPS_BUILD`: none, all, auth-only, world-only (default: all)
|
||||
- `TOOLS_BUILD`: none, all, db-only, maps-only (default: none)
|
||||
- `BUILD_TESTING`: Enable unit tests (default: OFF)
|
||||
- `USE_COREPCH` / `USE_SCRIPTPCH`: Precompiled headers (default: ON)
|
||||
|
||||
### Unit tests
|
||||
|
||||
```bash
|
||||
# Configure with testing enabled
|
||||
cmake .. -DBUILD_TESTING=ON
|
||||
make -j$(nproc)
|
||||
|
||||
# Run tests
|
||||
./src/test/unit_tests
|
||||
# or
|
||||
ctest
|
||||
```
|
||||
|
||||
Tests use Google Test and live in `src/test/`. The test binary links against the `game` library.
|
||||
|
||||
## Architecture
|
||||
|
||||
### Two server executables
|
||||
- **authserver** (`src/server/apps/authserver/`): Handles authentication and realm selection (port 3724)
|
||||
- **worldserver** (`src/server/apps/worldserver/`): Main game server handling all gameplay (port 8085)
|
||||
|
||||
### Source layout (`src/`)
|
||||
|
||||
- **`src/common/`** - Shared libraries: networking (Asio), cryptography, configuration, logging, threading, collision detection, utilities
|
||||
- **`src/server/game/`** - Core game logic (~52 subsystems), the heart of the worldserver
|
||||
- **`src/server/scripts/`** - Content scripts (bosses, spells, commands, instances)
|
||||
- **`src/server/database/`** - Database abstraction layer and schema updater
|
||||
- **`src/server/shared/`** - Code shared between auth and world servers (packets, network, realm definitions)
|
||||
- **`src/test/`** - Unit tests (Google Test)
|
||||
|
||||
### Key game subsystems (`src/server/game/`)
|
||||
|
||||
- **Entities/** - Core game objects: `Player`, `Creature`, `Unit`, `Item`, `GameObject`
|
||||
- **Spells/** - Spell mechanics, aura system, spell effects
|
||||
- **Maps/** - Map management, grid system, instancing
|
||||
- **Handlers/** - Client packet handlers (one file per system: `MovementHandler.cpp`, `SpellHandler.cpp`, etc.). These are methods on `WorldSession`
|
||||
- **AI/** - Creature AI framework
|
||||
- **Scripting/** - Script system with typed base classes (`ScriptObject` subclasses: `CreatureScript`, `SpellScript`, `InstanceMapScript`, `GameObjectScript`, `CommandScript`, etc.)
|
||||
- **Server/** - `WorldSession` (per-player connection), `World` (global state), opcode definitions
|
||||
|
||||
### Scripting system
|
||||
|
||||
Scripts follow a registration pattern:
|
||||
1. Define a class inheriting from `SpellScript`, `CreatureScript`, etc.
|
||||
2. Implement an `AddSC_*()` function that calls `RegisterSpellScript(ClassName)` (or similar)
|
||||
3. The `AddSC_*()` is declared and called from the regional `*_script_loader.cpp`
|
||||
4. Script loaders per region: `spells_script_loader.cpp`, `eastern_kingdoms_script_loader.cpp`, `northrend_script_loader.cpp`, etc.
|
||||
5. Spell script files are organized by class: `spell_dk.cpp`, `spell_mage.cpp`, `spell_generic.cpp`, etc.
|
||||
|
||||
### Three databases
|
||||
- **acore_auth** - Accounts, realm list, bans (`data/sql/base/db_auth/`)
|
||||
- **acore_characters** - Character data, inventories, progress (`data/sql/base/db_characters/`)
|
||||
- **acore_world** - Game content: creatures, items, quests, spells, loot (`data/sql/base/db_world/`)
|
||||
|
||||
- SQL updates go in `data/sql/updates/pending_*` with separate subdirectories per database until pull request is merged. Pending SQL files are assigned random names.
|
||||
- SQL updates go in `data/sql/updates/` with separate subdirectories per database after their pull request is merged.
|
||||
- SQL files outside the `data/sql/updates/pending_*` folders should never be updated.
|
||||
|
||||
### Module system
|
||||
|
||||
External modules are loaded from the `modules/` directory. Each module is a subdirectory with its own `CMakeLists.txt`. Disable specific modules with `-DDISABLED_AC_MODULES="mod1;mod2"`. Module skeleton: https://github.com/azerothcore/skeleton-module/
|
||||
|
||||
### Dependencies
|
||||
|
||||
Bundled in `deps/`: boost, MySQL client, OpenSSL, zlib, recastnavigation (pathfinding), g3dlite (geometry), fmt, argon2, jemalloc, and others.
|
||||
|
||||
## Commit Message Format
|
||||
|
||||
Uses Conventional Commits:
|
||||
```
|
||||
Type(Scope/Subscope): Short description (max 50 chars)
|
||||
```
|
||||
|
||||
- **Types**: feat, fix, refactor, style, docs, test, chore
|
||||
- **Scopes**: Core (C++ changes), DB (SQL changes)
|
||||
- **Examples**: `fix(Core/Spells): Fix damage calculation for Fireball`, `fix(DB/SAI): Missing spell to NPC Hogger`
|
||||
|
||||
## Code Style
|
||||
|
||||
- 4-space indentation for C++ (no tabs)
|
||||
- 2-space indentation for JSON, YAML, shell scripts
|
||||
- UTF-8 encoding, LF line endings
|
||||
- Max 80 character line length
|
||||
- No braces around single-line statements
|
||||
- Use {} to parse variables into output instead of %u etc.
|
||||
- CI enforces code style checks and compiles with `-Werror`
|
||||
|
||||
## PR Requirements
|
||||
|
||||
- AI tool usage must be disclosed in PRs
|
||||
- In-game testing expected
|
||||
- Changes to generic code require regression testing of related systems
|
||||
@@ -0,0 +1,13 @@
|
||||
Fractured / Paragon — non-runtime repo extras
|
||||
==============================================
|
||||
|
||||
This folder holds material that is not required to configure, build, or run
|
||||
AzerothCore. Upstream AzerothCore does not ship these paths.
|
||||
|
||||
Contents:
|
||||
- BUILD-NATIVE.md — fork-specific native build notes (moved from repo root).
|
||||
- CLAUDE.md — optional AI assistant context (moved from repo root).
|
||||
- *.log — local build logs (moved from repo root when present).
|
||||
|
||||
Operational files (docker-compose.override.yml, env/dist, modules/mod-paragon,
|
||||
etc.) stay at their normal locations.
|
||||
Reference in New Issue
Block a user