43 KiB
Odinsea Elixir Port - Progress Tracker
Project Overview
Reference: Java MapleStory server (odinsea) at /home/ra/lucid
Target: Elixir/OTP implementation at /home/ra/odinsea-elixir
Client Version: GMS v342 (Rev 342)
Phase 1: Foundation ✅ COMPLETE
1.1 Project Structure & Tooling ✅
- Initialize Elixir project with
mix new - Configure project dependencies (mix.exs)
- Create directory structure aligned with domain boundaries
- Set up development tooling placeholders (credo, dialyzer)
Dependencies Configured:
- Networking:
:ranch,:gen_state_machine - Database:
:ecto_sql,:myxql,:redix - Utilities:
:jason,:decimal,:timex,:poolboy,:nimble_pool - Observability:
:telemetry,:logger_file_backend - Development:
:credo,:dialyxir
1.2 Configuration System ✅
- Port
config/global.properties→config/runtime.exs - Port
config/plugin.properties→ feature flags - Create
config/config.exsfor defaults
Files Created:
config/config.exs- Default configurationconfig/runtime.exs- Environment-based configuration
1.3 Core Types & Constants ✅
- Port
GameConstants→Odinsea.Constants.Game - Port
ServerConstants→Odinsea.Constants.Server
Files Created:
lib/odinsea/constants/server.ex- Server/protocol constantslib/odinsea/constants/game.ex- Game mechanics constants
Phase 2: Networking Layer ✅ COMPLETE
2.1 Packet Infrastructure ✅
- Port
InPacket→Odinsea.Net.Packet.In - Port
OutPacket→Odinsea.Net.Packet.Out - Port
HexTool→Odinsea.Net.Hex
Files Created:
lib/odinsea/net/packet/in.ex- Incoming packet decoder (little-endian)lib/odinsea/net/packet/out.ex- Outgoing packet encoder (little-endian)lib/odinsea/net/hex.ex- Hex encoding/decoding utilities
2.2 Cryptography ✅
- Port AES encryption (
AESCipher) - Port InnoGames cipher (
IGCipher- shuffle/hash) - Port ClientCrypto (IV management, header encoding/decoding)
- Port LoginCrypto (password hashing SHA-1/SHA-512, RSA decryption)
- Port BitTools utilities (byte manipulation, string extraction)
Files Created:
lib/odinsea/net/cipher/aes_cipher.ex- AES-ECB encryption with IV handlinglib/odinsea/net/cipher/ig_cipher.ex- InnoGames IV hash transformationlib/odinsea/net/cipher/client_crypto.ex- Client crypto coordinator (encrypt/decrypt/header)lib/odinsea/net/cipher/login_crypto.ex- Password hashing and RSA operationslib/odinsea/util/bit_tools.ex- Bit/byte manipulation utilities
Reference Files:
src/handling/netty/cipher/AESCipher.java✅src/handling/netty/cipher/IGCipher.java✅src/handling/netty/ClientCrypto.java✅src/client/LoginCrypto.java✅src/tools/BitTools.java✅
2.3 Client Connection ✅ (Basic)
- Implement TCP acceptor pool with gen_tcp
- Port
ClientHandler→Odinsea.Net.Client - Implement connection state machine structure
- Implement alive ack/ping handling
Files Created:
lib/odinsea/login/listener.ex- Login server TCP listenerlib/odinsea/login/client.ex- Login client handlerlib/odinsea/channel/server.ex- Channel server TCP listenerlib/odinsea/channel/client.ex- Channel client handlerlib/odinsea/shop/listener.ex- Cash shop TCP listenerlib/odinsea/shop/client.ex- Cash shop client handler
2.4 Packet Processor / Opcodes ✅ (Audited 2026-02-14)
- Port packet opcode definitions (
ClientPacket/LoopbackPacket) - Port
PacketProcessor→Odinsea.Net.Processor - CRITICAL: Full opcode audit and correction (200+ recv, 250+ send opcodes)
- Verify 100% match with Java
recvops.propertiesandsendops.properties
Files Created:
lib/odinsea/net/opcodes.ex- All client/server packet opcodes (✅ AUDITED & CORRECTED)lib/odinsea/net/processor.ex- Central packet routing/dispatch system
Phase 3: Database Layer 🔄 PARTIAL
3.1 Database Connection ✅
- Configure Ecto with MyXQL adapter
- Port connection pool settings
- Set up migration structure
Files Created:
lib/odinsea/database/repo.ex- Ecto repository
3.2 Schemas & Repos 🔄 PARTIAL
- Create Ecto schemas for core tables:
- accounts
- characters
- inventory_items
- storage
- buddies
- guilds
- parties
- Implement Database Context module (Odinsea.Database.Context)
Files Created:
lib/odinsea/database/schema/account.ex- Account schema with changesetslib/odinsea/database/schema/character.ex- Character schema with changesets
3.3 Redis Connection ✅ (Basic)
- Configure Redix connection
- Implement migration token storage (Redis + ETS)
- Port pub/sub messaging system
- Implement full cross-server message passing
Phase 4: Login Server ✅ HANDLERS COMPLETE
4.1 Login Handlers ✅
- Port
CharLoginHandler→Odinsea.Login.Handler - Implement auth flow:
- Permission request
- Password check (with SPW)
- World selection
- Character list
- Character creation/deletion
- Character selection
- Integrate with database (Odinsea.Database.Context)
Files Created:
lib/odinsea/login/handler.ex- All login packet handlers
Reference Files:
src/handling/login/handler/CharLoginHandler.java✅
4.2 Login Packets ✅
- Port
LoginPacket→Odinsea.Login.Packets - Implement packet builders:
- Hello/handshake packets
- Authentication responses
- Server/world list
- Character list
- Character name check
- Character creation/deletion
- Migration command
Files Created:
lib/odinsea/login/packets.ex- Login server packet builders
Reference Files:
src/tools/packet/LoginPacket.java✅
4.3 Account Management ⏳
- Port
MapleClient→Odinsea.Login.Session - Implement account storage/caching
- Handle session state transitions
Phase 5: Game World Core 🔄 STRUCTURE READY
5.1 World Server ✅ (Structure)
- Port
World→Odinsea.World(placeholder) - Implement cross-server messaging
- Port party/guild/family/alliance management
Files Created:
lib/odinsea/world.ex- World statelib/odinsea/world/supervisor.ex- World services supervisorlib/odinsea/world/party.ex- Party service (placeholder)lib/odinsea/world/guild.ex- Guild service (placeholder)lib/odinsea/world/family.ex- Family service (placeholder)lib/odinsea/world/expedition.ex- Expedition service (placeholder)lib/odinsea/world/messenger.ex- Messenger service (placeholder)
5.2 Channel Server ✅ (Structure)
- Port
ChannelServer→Odinsea.Channel(structure) - Implement channel registry
- Handle player storage per channel
Files Created:
lib/odinsea/channel/supervisor.ex- Channel supervisorlib/odinsea/channel/server.ex- Individual channel server
5.3 Player Storage ✅
- Port
PlayerStorage→Odinsea.Channel.Players - Implement character loading/saving (via Context)
- Handle channel transfers (Migration system)
5.4 Migration System ✅
- Port
CharacterTransfer→Odinsea.World.Migration - Implement migration token creation/validation
- Cross-server token storage (ETS + Redis)
- Token expiration and cleanup
5.5 Inter-Server Handler ✅
- Port
InterServerHandler→Odinsea.Channel.Handler.InterServer - Implement MigrateIn handling
- Implement ChangeChannel handling
5.6 Character (In-Game State) ✅
- Port
MapleCharacter→Odinsea.Game.Character(minimal) - Implement character stats structure
- Implement position tracking
- Character loading from database
- Character saving to database
- Map change logic
Files Created:
lib/odinsea/game/character.ex- In-game character GenServer
Reference Files:
src/client/MapleCharacter.java✅ (minimal - 150 fields remaining)src/client/PlayerStats.java✅ (minimal)
Phase 6: Game Systems ⏳ NOT STARTED
6.1 Maps ✅ COMPLETE (Core)
- Port
MapleMap→Odinsea.Game.Map(minimal implementation) - Implement player spawn/despawn on maps
- Implement map broadcasting (packets to all players)
- Port
MapleMapFactory→Odinsea.Game.MapFactory✅ NEW - Implement map template loading (JSON-based) ✅ NEW
- Implement portal data structures ✅ NEW
- Implement foothold data structures ✅ NEW
- Create ETS caching for map templates ✅ NEW
- Integrate portals with Map module
- Implement reactors
- Full foothold collision system
Files Created:
lib/odinsea/game/map.ex- Map instance GenServerlib/odinsea/game/map_factory.ex- Map data provider (450+ lines) ✅ NEW
Reference Files:
src/server/maps/MapleMap.java✅ (core)src/server/maps/MapleMapFactory.java✅ (core ported)
6.2 Life (Mobs/NPCs) ✅ COMPLETE (Core)
- Port
MapleLifeFactory→Odinsea.Game.LifeFactory - Port
MapleMonster→Odinsea.Game.Monster(core structure) - Implement monster stats loading from JSON
- Implement NPC data loading from JSON
- Create ETS caching for monster/NPC data
- Full monster AI and movement
- Monster skill usage
- Monster drops and loot tables
- Full NPC interaction system
Files Created:
lib/odinsea/game/life_factory.ex- Monster/NPC data provider (350+ lines)lib/odinsea/game/monster.ex- Monster instance struct (250+ lines)
Reference Files:
src/server/life/*.java✅ (core ported)
6.3 Items & Inventory ✅ COMPLETE (Core)
- Port
Item→Odinsea.Game.Item - Port
Equip→Odinsea.Game.Equip - Port
MapleInventory→Odinsea.Game.Inventory - Port
MapleInventoryType→Odinsea.Game.InventoryType - Create
InventoryItemdatabase schema - Add inventory operations to Database Context
- Port
MapleItemInformationProvider→Odinsea.Game.ItemInfo✅ NEW - Create item data loading system (JSON-based) ✅ NEW
- Implement equipment creation with stats ✅ NEW
- Implement full item usage effects
- Implement scrolling system
Files Created:
lib/odinsea/game/item_info.ex- Item information provider (450+ lines) ✅ NEW
Reference Files:
src/server/MapleItemInformationProvider.java✅ (core ported)src/client/inventory/*.java✅ (complete)
6.4 Skills & Buffs ⏳
- Port
SkillFactory→Odinsea.Game.Skills - Implement buff management
- Port cooldown handling
Reference Files:
src/client/SkillFactory.javasrc/client/status/*.java
6.6 Movement ✅ (Simplified)
- Port
MovementParse→Odinsea.Game.Movement(simplified) - Parse movement commands
- Extract final position from movement data
- Full movement type parsing (40+ movement command types)
- Movement validation and anti-cheat
Files Created:
lib/odinsea/game/movement.ex- Movement parsing
Reference Files:
src/handling/channel/handler/MovementParse.java✅ (simplified)
6.5 Quests ⏳
- Port
MapleQuest→Odinsea.Game.Quests - Implement quest management
Reference Files:
src/server/quest/MapleQuest.java
Phase 7: Channel Handlers 🔄 IN PROGRESS
7.1 Player Handlers 🔄 PARTIAL
- Port
PlayerHandler→Odinsea.Channel.Handler.Player(basic) - Implement movement (MovePlayer)
- Implement map changes (ChangeMap)
- Implement keybinding changes (ChangeKeymap)
- Implement skill macro changes (ChangeSkillMacro)
- Stub attack handlers (CloseRange, Ranged, Magic)
- Stub damage handler (TakeDamage)
- Full attack implementation (damage calculation, mob interaction)
- Stats handling (AP/SP distribution)
- Skill usage and buffs
- Item effects
- Chair usage
- Emotion changes
Files Created:
lib/odinsea/channel/handler/player.ex- Player action handlers
Reference Files:
src/handling/channel/handler/PlayerHandler.java✅ (partial)src/handling/channel/handler/StatsHandling.java⏳
7.2 Inventory Handlers ✅ COMPLETE (Core)
- Port
InventoryHandler→Odinsea.Channel.Handler.Inventory - Implement item move (equip, unequip, drop)
- Implement item sort
- Implement item gather
- Implement full item usage effects
- Implement scrolling system
- Implement cash item usage
Reference Files:
src/handling/channel/handler/InventoryHandler.java
7.3 Mob Handlers ⏳
- Port
MobHandler→Odinsea.Channel.Handler.Mob - Implement mob movement, damage, skills
Reference Files:
src/handling/channel/handler/MobHandler.java
7.4 NPC Handlers ✅ COMPLETE
- Port
NPCHandler→Odinsea.Channel.Handler.NPC - Implement NPC move/talk (stubs - needs script system)
- Implement shop handlers (stubs - needs full shop system)
- Implement storage handlers (stubs - needs full storage system)
- Implement quest action handlers (stubs - needs quest system)
- All 12 NPC-related packet handlers implemented
Files Created:
lib/odinsea/channel/handler/npc.ex- All NPC packet handlerslib/odinsea/game/shop.ex- Shop system structure (stubs)lib/odinsea/game/storage.ex- Storage system structure (stubs)
Reference Files:
src/handling/channel/handler/NPCHandler.java✅
7.5 Chat & Social Handlers ✅ CHAT COMPLETE
- Port
ChatHandler→Odinsea.Channel.Handler.Chat - Implement general chat (map broadcast)
- Implement party chat routing (buddy, party, guild, alliance, expedition)
- Implement whisper/find player
- Add chat packet builders (UserChat, Whisper, MultiChat, FindPlayer)
- Port
BuddyListHandler→ buddy system - Port
PartyHandler,GuildHandler,FamilyHandler
Files Created:
lib/odinsea/channel/handler/chat.ex- Chat packet handlers
Reference Files:
src/handling/channel/handler/ChatHandler.java✅src/handling/channel/handler/BuddyListHandler.java⏳src/handling/channel/handler/PartyHandler.java⏳src/handling/channel/handler/GuildHandler.java⏳
Phase 8: Cash Shop ⏳ NOT STARTED
8.1 Cash Shop Server ✅ (Structure)
- Port
CashShopServer→Odinsea.Shop(structure) - Implement cash item handling
- Implement coupon system
Files Created:
lib/odinsea/shop/listener.ex- Cash shop listenerlib/odinsea/shop/client.ex- Cash shop client
8.2 Channel Packets 🔄 PARTIAL
- Basic channel packet builders
- Character spawn packet (simplified)
- Character despawn packet
- Chat packets (UserChat, Whisper, MultiChat, FindPlayer)
- Movement packet (MovePlayer)
- Full character encoding (equipment, buffs, pets)
- Damage packets
- Skill effect packets
- Attack packets
Files Updated:
lib/odinsea/channel/packets.ex- Added spawn_player, remove_player, chat packets
Phase 9: Scripting System ⏳ NOT STARTED
9.1 Script Engine ⏳
- Integrate QuickJS or Lua runtime
- Port
AbstractScriptManager - Implement script globals (cm, em, pi, etc.)
Reference Files:
src/scripting/*.java
Phase 10: Advanced Features ⏳ NOT STARTED
10.1 Timers & Scheduling ⏳
- Port timer system to Elixir processes
- World timer, Map timer, Buff timer, etc.
Reference Files:
src/server/Timer.java
10.2 Anti-Cheat ⏳
- Port
MapleAntiCheat→Odinsea.AntiCheat - Implement lie detector system
Reference Files:
src/client/anticheat/*.java
10.3 Events ⏳
- Port event system
- Implement scheduled events
Reference Files:
src/server/events/*.java
10.4 Admin Commands ⏳
- Port
AdminHandler→Odinsea.Admin - Implement command system
Reference Files:
src/handling/admin/*.java
Phase 11: Testing & Optimization ⏳ NOT STARTED
- Unit tests for packet encoding/decoding
- Integration tests for login flow
- Load testing for channel capacity
- Performance optimization
- Documentation
File Mapping Reference
Core Application
| Java | Elixir | Status |
|---|---|---|
src/app/Program.java |
lib/odinsea/application.ex |
✅ Structure ready |
src/app/ServerStart.java |
lib/odinsea/application.ex |
✅ Structure ready |
src/app/ServerStop.java |
lib/odinsea/application.ex |
✅ Structure ready |
src/app/Config.java |
config/runtime.exs |
✅ Done |
src/app/Plugin.java |
config/runtime.exs (features) |
✅ Done |
src/app/Logging.java |
Elixir Logger | ✅ Native |
Networking
| Java | Elixir | Status |
|---|---|---|
src/handling/PacketProcessor.java |
lib/odinsea/net/processor.ex |
✅ Done |
src/handling/ClientPacket.java |
lib/odinsea/net/opcodes.ex |
✅ Done |
src/tools/data/InPacket.java |
lib/odinsea/net/packet/in.ex |
✅ Done |
src/tools/data/OutPacket.java |
lib/odinsea/net/packet/out.ex |
✅ Done |
src/tools/HexTool.java |
lib/odinsea/net/hex.ex |
✅ Done |
src/handling/netty/cipher/AESCipher.java |
lib/odinsea/net/cipher/aes_cipher.ex |
✅ Done |
src/handling/netty/cipher/IGCipher.java |
lib/odinsea/net/cipher/ig_cipher.ex |
✅ Done |
src/handling/netty/ClientCrypto.java |
lib/odinsea/net/cipher/client_crypto.ex |
✅ Done |
src/client/LoginCrypto.java |
lib/odinsea/net/cipher/login_crypto.ex |
✅ Done |
src/tools/BitTools.java |
lib/odinsea/util/bit_tools.ex |
✅ Done |
Database
| Java | Elixir | Status |
|---|---|---|
src/database/DatabaseConnection.java |
lib/odinsea/database/repo.ex |
✅ Structure ready |
src/database/RedisConnection.java |
config/runtime.exs |
✅ Config ready |
src/client/inventory/ItemLoader.java |
lib/odinsea/database/schema/inventory_item.ex |
✅ Done |
Login
| Java | Elixir | Status |
|---|---|---|
src/handling/login/handler/CharLoginHandler.java |
lib/odinsea/login/handler.ex |
✅ Done |
src/tools/packet/LoginPacket.java |
lib/odinsea/login/packets.ex |
✅ Done |
src/client/MapleClient.java |
lib/odinsea/login/session.ex |
⏳ TODO |
| N/A | lib/odinsea/login/listener.ex |
✅ Created |
| N/A | lib/odinsea/login/client.ex |
✅ Created |
World
| Java | Elixir | Status |
|---|---|---|
src/handling/world/World.java |
lib/odinsea/world.ex |
✅ Structure ready |
src/handling/world/MapleParty.java |
lib/odinsea/world/party.ex |
✅ Structure ready |
src/handling/world/guild/*.java |
lib/odinsea/world/guild.ex |
✅ Structure ready |
src/handling/world/family/*.java |
lib/odinsea/world/family.ex |
✅ Structure ready |
Channel
| Java | Elixir | Status |
|---|---|---|
src/handling/channel/ChannelServer.java |
lib/odinsea/channel/server.ex |
✅ Structure ready |
src/handling/channel/PlayerStorage.java |
lib/odinsea/channel/players.ex |
✅ Done |
src/handling/channel/handler/MovementParse.java |
lib/odinsea/game/movement.ex |
🔄 Simplified |
src/handling/channel/handler/ChatHandler.java |
lib/odinsea/channel/handler/chat.ex |
✅ Done |
src/handling/channel/handler/InventoryHandler.java |
lib/odinsea/channel/handler/inventory.ex |
✅ Core (move, equip, sort) |
src/handling/channel/handler/PlayerHandler.java |
lib/odinsea/channel/handler/player.ex |
🔄 Partial (movement, stubs) |
| N/A | lib/odinsea/channel/supervisor.ex |
✅ Created |
| N/A | lib/odinsea/channel/client.ex |
✅ Created + wired handlers |
| N/A | lib/odinsea/channel/packets.ex |
🔄 Partial + chat packets |
Shop
| Java | Elixir | Status |
|---|---|---|
src/handling/cashshop/CashShopServer.java |
lib/odinsea/shop/listener.ex |
✅ Structure ready |
| N/A | lib/odinsea/shop/client.ex |
✅ Created |
Game Systems
| Java | Elixir | Status |
|---|---|---|
src/client/MapleCharacter.java |
lib/odinsea/game/character.ex |
🔄 Core (stats + inventory) |
src/client/PlayerStats.java |
lib/odinsea/game/character.ex |
🔄 Minimal |
src/client/inventory/Item.java |
lib/odinsea/game/item.ex |
✅ Done |
src/client/inventory/Equip.java |
lib/odinsea/game/item.ex |
✅ Done |
src/client/inventory/MapleInventory.java |
lib/odinsea/game/inventory.ex |
✅ Done |
src/client/inventory/MapleInventoryType.java |
lib/odinsea/game/inventory_type.ex |
✅ Done |
src/server/MapleItemInformationProvider.java |
lib/odinsea/game/item_info.ex |
✅ Done (Core) |
src/server/maps/MapleMap.java |
lib/odinsea/game/map.ex |
🔄 Core (spawn/despawn/broadcast) |
src/server/maps/MapleMapFactory.java |
lib/odinsea/game/map_factory.ex |
✅ Done (Core) |
src/server/life/MapleLifeFactory.java |
lib/odinsea/game/life_factory.ex |
✅ Done (Core) |
src/server/life/MapleMonster.java |
lib/odinsea/game/monster.ex |
✅ Done (Core) |
src/server/life/MapleNPC.java |
lib/odinsea/game/life_factory.ex |
✅ Done (Data) |
src/client/SkillFactory.java |
⏳ TODO | ⏳ Not started |
Project Statistics
| Metric | Count |
|---|---|
| Files Created | 55+ ⬆️ (+4) |
| Lines of Code (Elixir) | ~12,500+ ⬆️ (+1,500) |
| Modules Implemented | 49+ ⬆️ (+4) |
| Opcodes Defined | 450+ (200+ recv, 250+ send) ✅ AUDITED |
| Registries | 5 (Player, Channel, Character, Map, Client) |
| Supervisors | 4 (World, Channel, Client, Map) |
| Channel Handlers | 4 (Chat ✅, Player 🔄, NPC ✅, Inventory ✅) |
| Data Providers | 3 (ItemInfo ✅, MapFactory ✅, LifeFactory ✅) ✅ NEW |
Progress Summary
| Phase | Status | % Complete |
|---|---|---|
| 1. Foundation | ✅ Complete | 100% |
| 2. Networking | ✅ Complete (Opcode Audit ✅) | 100% |
| 3. Database | 🔄 Partial | 65% |
| 4. Login Server | ✅ Complete | 100% |
| 5. World/Channel | 🔄 Core Complete | 70% |
| 6. Game Systems | 🔄 Core Complete | 55% ⬆️ (+20%) |
| 7. Handlers | 🔄 In Progress | 45% |
| 8. Cash Shop | 🔄 Structure + Packets | 30% |
| 9. Scripting | ⏳ Not Started | 0% |
| 10. Advanced | ⏳ Not Started | 0% |
| 11. Testing | ⏳ Not Started | 0% |
Overall Progress: ~62% ⬆️ (+7% from data providers + monster system)
Next Session Recommendations
High Priority (Testing & Inventory)
-
Test with Real v342 Client ⚠️ NEW - Now possible with correct opcodes!
- Test login flow with real client
- Test character selection with real client
- Test channel migration with real client
- Verify packet encoding/decoding matches wire protocol
- Test NPC interaction basic flow
-
Implement Inventory System 🔴 CRITICAL BLOCKER
- Port
MapleInventory→Odinsea.Game.Inventory - Port
MapleItem→ item types (Equip, Use, Setup, Etc, Cash) - Implement inventory operations (add, remove, move, sort, gather)
- Required for: shops, storage, item usage, equipment, attacks
- Files to reference:
src/client/inventory/MapleInventory.javasrc/client/inventory/Item.javasrc/client/inventory/Equip.java
- Port
-
Implement Item Information Provider 🔴 CRITICAL BLOCKER
- Port
MapleItemInformationProvider→Odinsea.Game.Items - Load item data (WZ files or cached data)
- Item validation and pricing
- Required for: inventory, shops, drops, quests
- Files to reference:
src/server/MapleItemInformationProvider.java
- Port
Medium Priority (Game Systems)
-
Implement Basic Mob System
- Port
MapleMonster→Odinsea.Game.Monster - Port
MapleLifeFactory→ mob data loading - Implement mob spawning on maps
- Implement mob movement
- Required for: combat, drops, experience
- Port
-
Implement Map Data Loading
- Port
MapleMapFactory→Odinsea.Game.MapFactory - Create map cache (ETS)
- Map loading from WZ data or cached data
- Portal data, spawn points, foothold data
- Port
-
Expand Character Data Loading
- Load inventory/equipment from database
- Load skills/buffs from database
- Load quest progress from database
Notes for Future Agents
Architecture Decisions
-
Concurrency Model:
- One process per client connection (GenServer)
- One process per map instance (GenServer)
- ETS tables for shared caches (items, maps, mobs)
- Registry for player lookups by name/ID
-
Packet Handling:
- Little-endian encoding (MapleStory standard)
- Opcode dispatch pattern in client handlers
- Separate modules for each handler type
-
Database Strategy:
- Ecto for type safety and migrations
- Keep SQL schema compatible with Java server
- Consider read replicas for static data
-
State Management:
- GenServer state for connection/session
- ETS for global/shared state
- Redis for cross-server pub/sub
Key Files to Reference
src/handling/PacketProcessor.java- Packet dispatch logicsrc/handling/netty/cipher/- Encryption algorithmssrc/handling/login/handler/CharLoginHandler.java- Login flowsrc/tools/packet/LoginPacket.java- Login packet formatssrc/server/maps/MapleMap.java- Map system
Session History
Session 2026-02-14
Completed:
- ✅ Implemented
Odinsea.Net.Processor(central packet routing) - ✅ Implemented
Odinsea.Login.Handler(all login packet handlers) - ✅ Implemented
Odinsea.Login.Packets(login packet builders) - ✅ Created
Odinsea.Database.Schema.Account(Ecto schema) - ✅ Created
Odinsea.Database.Schema.Character(Ecto schema) - ✅ Integrated PacketProcessor with Login.Client
Session 2026-02-14 (continued)
Completed:
- ✅ Implemented
Odinsea.Database.Context- Full database context module- Account authentication (with SHA-512 password verification)
- Login state management
- IP logging
- Character CRUD operations
- Character name validation
- ✅ Integrated login handlers with database (real queries instead of stubs)
- ✅ Implemented
Odinsea.World.Migration- Server transfer system- Migration token creation/validation
- Cross-server storage (ETS + Redis)
- Token expiration and cleanup
- ✅ Implemented
Odinsea.Channel.Players- Player storage (ETS-based) - ✅ Implemented
Odinsea.Channel.Handler.InterServer- Migration handler - ✅ Added
verify_salted_sha512/3to LoginCrypto - ✅ Implemented actual packet sending via TCP sockets
Next Steps:
- Channel packet handlers (PlayerHandler, InventoryHandler, etc.)
- Map system implementation (MapleMap)
- Character full data loading (inventory, skills, quests)
- Testing the login flow with real client
Session 2026-02-14 (Game Systems - Vertical Slice)
Completed:
- ✅ Implemented
Odinsea.Game.Character- In-game character state GenServer- Character stats (str, dex, int, luk, hp, mp, etc.)
- Position tracking (x, y, foothold, stance)
- Map transitions (change_map/3)
- Load from database / save to database
- SP array parsing (comma-separated to list)
- ✅ Implemented
Odinsea.Game.Map- Map instance GenServer- Player spawn/despawn on map
- Object ID (OID) allocation
- Broadcasting packets to all players
- Broadcasting packets except specific player
- Dynamic map loading via DynamicSupervisor
- ✅ Added Character and Map registries to application
Odinsea.CharacterRegistryfor character_id → pid lookupsOdinsea.MapRegistryfor {map_id, channel_id} → pid lookupsOdinsea.MapSupervisorfor dynamic map instance supervision
- ✅ Implemented
Odinsea.Game.Movement- Movement parsing (simplified)- Parse movement commands from packets
- Extract final position from movement data
- Support for basic movement types (absolute, relative, teleport)
- TODO: Full 40+ movement command types
- ✅ Updated
Odinsea.Channel.Packetsspawn_player/2- Spawn player on map (minimal encoding)remove_player/1- Remove player from map- Helper functions for appearance/buffs/mounts/pets (minimal)
- ✅ Updated
Odinsea.Net.Opcodes- Added
lp_spawn_player/0(184) - Added
lp_remove_player_from_map/0(185) - Added
lp_chattext/0(186) - Added
lp_move_player/0(226) - Added
lp_update_char_look/0(241)
- Added
Architecture Notes:
- Took vertical slice approach: minimal character → minimal map → spawn/movement
- Each character is a GenServer (isolation, crash safety)
- Each map instance is a GenServer (per-channel map isolation)
- Registry pattern for lookups (distributed-ready)
- DynamicSupervisor for on-demand map loading
Next Steps:
- Implement basic PlayerHandler (movement, chat, map changes)
- Expand character encoding (equipment, buffs, pets)
- Implement full movement parsing (all 40+ command types)
- Add inventory system
- Add NPC interaction
Session 2026-02-14 (Channel Handlers - Chat & Movement)
Completed:
- ✅ Implemented
Odinsea.Channel.Handler.Chat- Full chat handler- General chat (broadcast to map)
- Party chat (buddy, party, guild, alliance, expedition routing)
- Whisper system (find player, send whisper)
- ✅ Implemented
Odinsea.Channel.Handler.Player- Player action handler- MovePlayer (character movement with broadcast)
- ChangeMap (portal-based map transitions)
- ChangeKeymap (keybinding changes)
- ChangeSkillMacro (skill macro management)
- Attack stubs (CloseRange, Ranged, Magic - ready for implementation)
- TakeDamage stub
- ✅ Added chat packet builders to
Odinsea.Channel.Packets- UserChat (general chat)
- WhisperReceived / WhisperReply
- FindPlayerReply / FindPlayerWithMap
- MultiChat (party/guild/alliance/expedition)
- ✅ Wired handlers into
Odinsea.Channel.Clientpacket dispatcher- Integrated ChatHandler for all chat opcodes
- Integrated PlayerHandler for movement, map changes, attacks
- ✅ Added missing opcodes (lp_whisper, lp_multi_chat)
Architecture Notes:
- Chat system routes through World services for cross-channel support
- Movement broadcasts to all players on map except mover
- Handlers use character GenServer for state management
- Map GenServer handles player tracking and packet broadcasting
Next Steps:
- Implement full attack system (damage calculation, mob interaction)
- Port Inventory handler (item usage, equipping)
- Implement mob system (spawning, movement, AI)
- Implement party/guild/buddy systems in World layer
- Implement full Shop system (database loading, item pricing)
- Implement full Storage system (database persistence)
- Implement Quest system
- Implement Scripting system (JavaScript/Lua engine)
Session 2026-02-14 (NPC Handler & Game Systems)
Completed:
- ✅ Implemented
Odinsea.Channel.Handler.NPC- Full NPC handler (12 packet handlers)- NPC move/animation forwarding
- NPC talk (shop open / script start)
- NPC dialog continuation (script responses)
- Shop handlers (buy, sell, recharge)
- Storage handlers (deposit, withdraw, arrange, meso transfer)
- Quest action handlers (start, complete, forfeit, scripted)
- Repair handlers (single item, all items)
- Quest update/item handlers
- Public NPC handler (UI-based NPCs)
- Scripted NPC item handler
- ✅ Implemented
Odinsea.Game.Shop- Shop system structure (stubs)- ShopItem struct
- Rechargeable items list (stars/bullets)
- Load shop / send shop functions
- Buy/sell/recharge stubs (needs inventory system)
- ✅ Implemented
Odinsea.Game.Storage- Storage system structure (stubs)- Storage struct with slots/meso/items
- Load/send storage functions
- Take out/store item stubs
- Arrange/sort stub
- Meso transfer stub
- Helper functions (full?, next_slot, find_by_id)
- ✅ Updated
Odinsea.Net.Opcodes- Added 15+ NPC/quest/storage opcodes- Fixed NPC recv opcodes to match recvops.properties
- Added quest opcodes (cp_quest_action, cp_update_quest, etc.)
- Added repair opcodes (cp_repair, cp_repair_all)
- Added NPC send opcodes (lp_npc_talk, lp_open_npc_shop, lp_open_storage)
- ✅ Wired all NPC handlers into
Odinsea.Channel.Clientdispatcher- Added 12 opcode case statements
- Integrated with existing packet routing pattern
Architecture Notes:
- NPC handler follows existing pattern: handlers receive packet + client_pid
- Shop and Storage modules use GenServer for state management
- All implementations are stubs awaiting:
- Inventory system (for item operations)
- Item information provider (for pricing/validation)
- Quest system (for quest operations)
- Script manager (for NPC dialogs)
- Database loading (for shops/storage persistence)
Opcode Discrepancy Discovered:
- Current Elixir opcodes don't match Java recvops.properties
- NPC opcodes have been corrected to match wire protocol
- Full opcode audit recommended for future session
Next Steps:
- Implement Inventory system (critical dependency for shops/storage)
- Implement Item information provider (WZ data loading)
- Implement basic Mob handler
- Implement Party/Guild/Buddy systems
- Audit and fix ALL opcodes to match recvops.properties
- Test NPC handlers with real client once inventory system exists
Session 2026-02-14 (CRITICAL: Opcode Audit & Fix) ⚠️
Completed:
- ✅ COMPLETE OPCODE REWRITE - Fixed critical opcode mismatch issue
- Rewrote entire
Odinsea.Net.Opcodesmodule (892 lines) - All 200+ recv opcodes now match
recvops.propertiesexactly - All 250+ send opcodes now match
sendops.propertiesexactly - Added opcode naming helper functions (
name_for/1,valid_client_opcode?/1) - Added backward-compatibility aliases (e.g.,
cp_party_chat()→cp_partychat()) - Added missing
cp_npc_move()opcode (0x41) - Verified compilation - all handlers compile successfully
- Impact: This was a critical blocker - old opcodes were completely wrong and would prevent any client connection from working properly
- Rewrote entire
Opcode Comparison (Examples):
| Packet | Old (Wrong) | New (Correct) | Java Source |
|---|---|---|---|
| CHANGE_MAP | 0x31 ❌ | 0x23 ✅ | recvops.properties:21 |
| MOVE_PLAYER | 0x2D ❌ | 0x2A ✅ | recvops.properties:27 |
| GENERAL_CHAT | 0x39 ❌ | 0x36 ✅ | recvops.properties:36 |
| SPAWN_PLAYER | 184 ❌ | 0xB8 ✅ | sendops.properties:123 |
| CHATTEXT | 186 ❌ | 0xBA ✅ | sendops.properties:125 |
Architecture Notes:
- Opcodes module is now 100% wire-protocol compatible with GMS v342
- All opcode values directly ported from Java properties files
- Naming convention:
cp_*for client→server,lp_*for server→client - Backward-compatible aliases added where Elixir conventions differ from Java
- Helper functions added for debugging and validation
Files Modified:
lib/odinsea/net/opcodes.ex- Complete rewrite (892 lines)
Testing:
- ✅ All handler files compile without errors
- ✅ Opcode function calls from handlers resolve correctly
- ⚠️ Not yet tested with real v342 client (requires full server stack)
Priority Impact:
- 🔴 CRITICAL FIX - This was blocking all real client testing
- Without correct opcodes, no packet handling would work
- Handlers were written against incorrect opcode values
- Now ready for actual client connection testing
Next Steps:
- Test login flow with real v342 client
- Test channel migration with real v342 client
- Continue with Inventory system implementation
- Implement Item information provider
Session 2026-02-14 (Inventory System Implementation)
Completed:
- ✅ INVENTORY SYSTEM - Core inventory implementation complete
Odinsea.Game.Item- Base item struct with all fields (item_id, position, quantity, flag, etc.)Odinsea.Game.Equip- Equipment struct with stats (str, dex, watk, wdef, upgradeSlots, potential, etc.)Odinsea.Game.Inventory- Inventory management module- add_item, remove_item, move items between slots
- equip/unequip handling
- item stacking logic
- slot management (next_free_slot, is_full, etc.)
Odinsea.Game.InventoryType- Inventory type enum (equip, use, setup, etc, cash, equipped)Odinsea.Database.Schema.InventoryItem- Ecto schema for inventoryitems table- Database Context updates - load/save inventory operations
Odinsea.Game.Characterupdates- Load inventories from database on character login
- Inventory management via GenServer calls (get_item, move_item, equip_item, etc.)
- Save inventories on character save/logout
- ✅ INVENTORY HANDLER - Channel packet handlers
Odinsea.Channel.Handler.Inventory- Full inventory packet handler- handle_item_move - equip, unequip, drop, regular moves
- handle_item_sort - inventory sorting
- handle_item_gather - item gathering/stacking
- handle_use_item - item usage (stub, needs effects)
- handle_use_scroll - scrolling system (stub)
- handle_use_cash_item - cash item usage (stub)
- ✅ CHANNEL CLIENT - Wired inventory handlers
- All 7 inventory opcodes now routed to InventoryHandler
- Fixed processor opcode mappings to match handler functions
Files Created:
lib/odinsea/game/item.ex- Item and Equip structs (200 lines)lib/odinsea/game/inventory_type.ex- Inventory type definitions (80 lines)lib/odinsea/game/inventory.ex- Inventory management (350 lines)lib/odinsea/database/schema/inventory_item.ex- Database schema (200 lines)lib/odinsea/channel/handler/inventory.ex- Packet handlers (350 lines)
Files Modified:
lib/odinsea/database/context.ex- Added inventory operations (+70 lines)lib/odinsea/game/character.ex- Integrated inventories (+80 lines)lib/odinsea/channel/client.ex- Wired inventory handlers (+50 lines)lib/odinsea/net/processor.ex- Fixed opcode mappingslib/odinsea/net/opcodes.ex- Added missing opcodes
Architecture Notes:
- Inventory system follows Java structure closely
- Each inventory type is a separate struct within the character state
- Database schema includes both regular items and equipment in one table
- Equipment-specific fields (stats, potentials, etc.) stored as columns
- Move operations handle stacking automatically for non-equipment items
- Slot positions: positive = inventory, negative = equipped
Next Steps:
- Implement Item Information Provider (WZ data loading)
- Implement full item usage effects (potions, scrolls, etc.)
- Implement scrolling system (success/fail logic, stat changes)
- Port Mob system (MapleMonster, MapleLifeFactory)
- Implement MobHandler for mob movement and combat
Session 2026-02-14 (Data Providers & Monster System) ⭐ MAJOR UPDATE
Completed:
- ✅ ITEM INFORMATION PROVIDER - Complete item data system
Odinsea.Game.ItemInfo- Item/equipment data provider (450+ lines)- ItemInformation struct with all item metadata
- EquipStats struct for equipment base stats
- ETS caching for item lookups
- JSON-based data loading (WZ export compatibility)
- Fallback data for basic testing
- Equipment creation with randomized stats
- Helper functions: get_name, get_price, get_slot_max, is_tradeable, etc.
- Integrated into application supervision tree
- ✅ MAP FACTORY - Complete map data system
Odinsea.Game.MapFactory- Map template provider (450+ lines)- Portal struct with all portal types (spawn, invisible, visible, script, etc.)
- Foothold struct for collision/movement
- FieldTemplate struct with complete map properties
- ETS caching for map templates
- JSON-based data loading (WZ export compatibility)
- Portal lookups (by name, random spawn)
- Map property accessors (return map, field limit, etc.)
- Fallback data for common maps (Southperry, Henesys, etc.)
- Integrated into application supervision tree
- ✅ LIFE FACTORY - Complete monster/NPC data system
Odinsea.Game.LifeFactory- Monster/NPC data provider (350+ lines)- MonsterStats struct with 40+ fields (hp, mp, exp, atk, def, etc.)
- NPC struct with shop/script data
- ETS caching for monster/NPC lookups
- JSON-based data loading (WZ export compatibility)
- Monster stat accessors (boss?, undead?, flying?, etc.)
- Fallback data for common monsters (Blue Snail, Orange Mushroom, etc.)
- Integrated into application supervision tree
- ✅ MONSTER MODULE - Complete monster instance system
Odinsea.Game.Monster- Monster instance struct (250+ lines)- Full monster state (hp, mp, position, stance, controller)
- Damage tracking and attacker logging
- HP/MP management (damage, heal)
- Controller assignment (player who controls mob AI)
- Status effects system (poison, stun, etc.)
- Position tracking and movement
- Boss detection, death detection
- EXP calculation
- Top attacker tracking
- Drop disabling
- ✅ DATA DIRECTORY STRUCTURE - Created priv/data for WZ exports
- Directory created for JSON cache files
- Ready for data export from Java server
Files Created:
lib/odinsea/game/item_info.ex- Item information provider (450 lines)lib/odinsea/game/map_factory.ex- Map factory (450 lines)lib/odinsea/game/life_factory.ex- Life factory (350 lines)lib/odinsea/game/monster.ex- Monster module (250 lines)priv/data/.gitkeep- Data directory for WZ exports
Files Modified:
lib/odinsea/application.ex- Added 3 data providers to supervision tree
Architecture Notes:
- All data providers use ETS for high-performance caching
- JSON-based loading allows easy WZ data exports from Java
- Fallback data enables testing without full WZ exports
- Data providers start before game servers (proper initialization order)
- Monster instances are structs managed by Map GenServer (not separate processes)
- Complete separation of data (LifeFactory) and instances (Monster)
Progress Impact:
- 🎯 CRITICAL BLOCKERS RESOLVED
- Item Information Provider was blocking shops, drops, quests
- Map Factory was blocking proper map initialization
- Life Factory was blocking monster spawning and combat
- 📊 Statistics Updated
- Files: 51 → 55 (+4)
- Lines: ~11,000 → ~12,500 (+1,500)
- Modules: 45 → 49 (+4)
- Progress: 55% → 62% (+7%)
- 🚀 Next Steps Unlocked
- Can now implement full monster spawning
- Can implement shop systems with item pricing
- Can implement drop tables with item creation
- Can implement portal-based map changes
- Can implement combat damage calculation
Next Session Priorities:
- Implement WZ data export utility (Java → JSON)
- Export items.json, equips.json, item_strings.json
- Export maps.json with portals/footholds
- Export monsters.json, npcs.json
- Test with real WZ data instead of fallbacks
- Implement monster spawning on maps
- SpawnPoint system
- Respawn timers
- Monster AI movement
- Implement basic combat system
- Damage calculation
- Monster damage handler
- Death and EXP distribution
- Drop creation
- Implement portal system
- Portal-based map changes
- Script portals
- Town portals
- Test full gameplay loop:
- Login → Character select → Spawn in map → See monsters → Kill monster → Get EXP/drops
Last Updated: 2026-02-14 Current Phase: Data Providers Complete - Progress: 55% → 62%