12 KiB
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Project Overview
EQ2Go is a Go rewrite of the EverQuest II server emulator from C++ EQ2EMu. Implements core MMO server functionality with authentication, world simulation, and game mechanics using modern Go practices.
Development Commands
Building the Project
# Build login server
go build -o bin/login_server ./cmd/login_server
# Build world server
go build -o bin/world_server ./cmd/world_server
# Build both servers
go build ./cmd/...
Running the Servers
# Run login server (requires login_config.json)
./bin/login_server
# Run world server (creates world_config.json with defaults if missing)
./bin/world_server
# With custom configuration
./bin/world_server -listen-port 9001 -web-port 8081 -log-level debug
Testing
# Run all tests
go test ./...
# Test specific packages
go test ./internal/udp
go test ./internal/packets/parser
# Run tests with verbose output
go test -v ./...
# Test with race detection
go test -race ./...
Development Tools
# Format code
go fmt ./...
# Run linter (if golangci-lint is installed)
golangci-lint run
# Tidy modules
go mod tidy
# Check for vulnerabilities
go run golang.org/x/vuln/cmd/govulncheck@latest ./...
Architecture Overview
Core Components
Login Server - Client authentication, character management, world server coordination
World Server - Game simulation engine, zones, NPCs, combat, quests, web admin interface
Shared Libraries:
common/
- EQ2-specific data types and constantsdatabase/
- SQLite wrapper with simplified query interfaceudp/
- Custom UDP protocol with reliability layerpackets/
- XML-driven packet definition parserachievements/
- Achievement systemspawn/
- Base game entity system (positioning, commands, scripting)entity/
- Combat-capable entities with spell effects, stats, pet managementspells/
- Complete spell system with casting mechanics and processingtitles/
- Character title system with achievement integrationtrade/
- Player trading system with item/coin exchange and validationobject/
- Interactive objects extending spawn system (merchants, transporters, devices, collectors)races/
- Race system with all EQ2 races, alignment classification, stat modifiers, and entity integration
Network Protocol
EverQuest II UDP protocol with reliability layer, RC4 encryption, CRC validation, connection management, packet combining.
Database Layer
SQLite with simplified query interface, transactions, connection pooling, parameter binding.
Packet System
XML-driven packet definitions with version-specific formats, conditional fields, templates, dynamic arrays.
Key Files and Locations
Server Entry Points:
cmd/login_server/main.go
: Login server startup and configurationcmd/world_server/main.go
: World server startup with command-line options
Core Data Structures:
internal/common/types.go
: EQ2-specific types (EQ2Color, EQ2Equipment, AppearanceData, etc.)
Network Implementation:
internal/udp/server.go
: Multi-connection UDP serverinternal/udp/connection.go
: Individual client connection handlinginternal/udp/protocol.go
: Protocol packet types and constants
Database:
internal/database/wrapper.go
: Simplified SQLite interface- Database files:
login.db
,world.db
(created automatically)
Spawn System:
internal/spawn/spawn.go
: Base spawn entity with position, stats, commands, and scriptinginternal/spawn/spawn_lists.go
: Spawn location and entry managementinternal/spawn/README.md
: Comprehensive spawn system documentation
Entity System:
internal/entity/entity.go
: Combat-capable spawn extension with spell casting and pet managementinternal/entity/info_struct.go
: Comprehensive character statistics and information managementinternal/entity/spell_effects.go
: DEPRECATED - now imports from spells packageinternal/entity/README.md
: Complete entity system documentation
Spells System:
- Core:
spell_data.go
,spell.go
,spell_effects.go
,spell_manager.go
,constants.go
- Processing:
process_constants.go
,spell_process.go
,spell_targeting.go
,spell_resources.go
- Docs:
README.md
,SPELL_PROCESS.md
Titles System:
internal/titles/title.go
: Core title data structures and player title managementinternal/titles/constants.go
: Title system constants, categories, and rarity levelsinternal/titles/master_list.go
: Global title registry and management with categorizationinternal/titles/player_titles.go
: Individual player title collections and active title trackinginternal/titles/title_manager.go
: Central title system coordinator with background cleanupinternal/titles/integration.go
: Integration systems for earning titles through achievements, quests, PvP, eventsinternal/titles/README.md
: Complete title system documentation
Trade System:
internal/trade/trade.go
: Core trade mechanics with two-party item/coin exchangeinternal/trade/types.go
: Trade data structures, participants, and validationinternal/trade/constants.go
: Trade constants, error codes, and configurationinternal/trade/utils.go
: Coin calculations, validation helpers, and formattinginternal/trade/manager.go
: Trade service with high-level management and placeholders
Object System:
internal/object/object.go
: Core object mechanics extending spawn functionality with interactioninternal/object/constants.go
: Object constants, spawn types, and interaction typesinternal/object/manager.go
: Object manager with zone-based and type-based indexinginternal/object/integration.go
: Spawn system integration with ObjectSpawn wrapperinternal/object/interfaces.go
: Integration interfaces for trade/spell systems and entity adapters
Race System:
internal/races/races.go
: Core race management with all 21 EQ2 races and alignment mappinginternal/races/constants.go
: Race IDs, names, and display constantsinternal/races/utils.go
: Race utilities with stat modifiers, descriptions, and parsinginternal/races/integration.go
: Entity system integration with RaceAware interfaceinternal/races/manager.go
: High-level race management with statistics and command processing
Packet Definitions:
internal/packets/xml/
: XML packet structure definitionsinternal/packets/PARSER.md
: Packet definition language documentationinternal/packets/parser/
: Parser implementation for XML packet definitions
Configuration
Login Server: Requires login_config.json
with database and server settings
World Server: Creates world_config.json
with defaults:
{
"listen_addr": "0.0.0.0",
"listen_port": 9000,
"max_clients": 1000,
"web_port": 8080,
"database_path": "world.db",
"log_level": "info"
}
Command-line flags override JSON configuration.
Important Dependencies
Core Dependencies:
zombiezen.com/go/sqlite
: Modern SQLite drivergolang.org/x/crypto
: Cryptographic functions
Module Information:
- Go version: 1.24.5
- Module name:
eq2emu
Development Notes
Architecture Transition: This Go implementation is based on the extensive C++ EQ2EMu codebase documented in EQ2EMU_Architecture_White_Paper.md
. The Go version maintains compatibility with the original protocol while modernizing the implementation.
Packet Handling: The XML packet definition system allows for easy addition of new packet types without code changes. See internal/packets/PARSER.md
for syntax reference.
Database Schema: Currently uses SQLite for development/testing. Production deployments may require migration to PostgreSQL or MySQL for better concurrent access.
Spawn System: The spawn system (internal/spawn/
) provides the foundation for all game entities. It's converted from the C++ EQ2EMu codebase with modern Go concurrency patterns.
Entity System: The entity system (internal/entity/
) extends spawns with combat capabilities, implementing the complete EverQuest II character statistics system, spell effect management, and pet systems. Key features include:
- InfoStruct: Complete character statistics (attributes, resistances, experience, currency, equipment data)
- Entity: Combat-capable spawn with spell casting, pet management, and bonus calculations
- Thread Safety: All systems use proper Go concurrency patterns with mutexes and atomic operations
- Stat Calculations: Dynamic stat calculations with bonuses from equipment, spells, and other sources
- Pet Management: Support for multiple pet types (summon, charm, deity, cosmetic) with proper ownership tracking
Spells System: Complete spell management with spell definitions, effect system, and real-time casting engine. Features spell processing (50ms intervals), comprehensive targeting (self/single/group/AOE), resource management (power/health/concentration), cast/recast timers, interrupt handling, heroic opportunities, and thread-safe operations.
Titles System: Character title management with prefix/suffix positioning, categories, rarity levels, achievement integration, and thread-safe operations.
Trade System: Player-to-player trading with item/coin exchange, validation (no-trade, heirloom restrictions), slot management, acceptance workflow, bot trading support, and client version compatibility (6/12 slots).
Object System: Interactive world objects extending spawn system with merchants, transporters, devices, and collectors. Features clickable interaction, command handling, device IDs, size randomization, transport/teleport support, and complete spawn integration with entity/item adapters for trade/spell system compatibility.
Race System: Complete EverQuest II race management with all 21 races (Human through Aerakyn), alignment classification (good/evil/neutral), racial stat modifiers, starting locations, lore descriptions, and full entity system integration. Features randomization by alignment, compatibility checking, usage statistics, and RaceAware interface for seamless integration with existing systems.
All systems are converted from C++ with TODO comments marking areas for future implementation (LUA integration, advanced mechanics, etc.).
Testing: Focus testing on the UDP protocol layer and packet parsing, as these are critical for client compatibility.
Code Documentation Standards
Function Documentation: All functions must have thorough documentation explaining their purpose, parameters, return values, and any important behavior. Do NOT follow the standard Go convention of starting comments with the function name - instead, write clear explanations of what the function does.
Examples:
Good:
// Creates a new UDP server instance with the specified address and packet handler.
// The server will listen on the given address and route incoming packets to the handler.
// Returns an error if the address is invalid or the socket cannot be bound.
func NewServer(addr string, handler PacketHandler, config ...Config) (*Server, error) {
Poor (standard Go convention - avoid this):
// NewServer creates a new UDP server instance with the specified address and packet handler.
func NewServer(addr string, handler PacketHandler, config ...Config) (*Server, error) {
Additional Documentation Requirements:
- Document all public types, constants, and variables
- Include examples in documentation for complex functions
- Explain any non-obvious algorithms or business logic
- Document error conditions and edge cases
- For packet-related code, reference the relevant XML definitions or protocol specifications