26 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 ✅
- Port packet opcode definitions (
ClientPacket/LoopbackPacket) - Port
PacketProcessor→Odinsea.Net.Processor
Files Created:
lib/odinsea/net/opcodes.ex- All client/server packet opcodeslib/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 🔄 STARTED
- Port
MapleMap→Odinsea.Game.Map(minimal implementation) - Implement player spawn/despawn on maps
- Implement map broadcasting (packets to all players)
- Port
MapleMapFactory→ map loading/caching - Implement map objects (reactors, portals)
- Load map data from WZ files
Files Created:
lib/odinsea/game/map.ex- Map instance GenServer
Reference Files:
src/server/maps/MapleMap.java✅ (partially)
6.2 Life (Mobs/NPCs) ⏳
- Port
MapleLifeFactory→Odinsea.Game.Life - Port
MapleMonster→ monster handling - Port
MapleNPC→ NPC handling
Reference Files:
src/server/life/*.java
6.3 Items & Inventory ⏳
- Port
MapleItemInformationProvider - Port
MapleInventory→Odinsea.Game.Inventory - Implement item types (equip, use, setup, etc.)
Reference Files:
src/server/MapleItemInformationProvider.javasrc/client/inventory/*.java
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 ⏳
- Port
InventoryHandler→Odinsea.Channel.Handler.Inventory - Implement item usage, scrolling, sorting
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 ⏳
- Port
NPCHandler→Odinsea.Channel.Handler.NPC - Implement NPC talk, shops, storage
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 |
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/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 |
🔄 Minimal (stats + position) |
src/client/PlayerStats.java |
lib/odinsea/game/character.ex |
🔄 Minimal |
src/server/maps/MapleMap.java |
lib/odinsea/game/map.ex |
🔄 Minimal (spawn/despawn) |
src/server/maps/MapleMapFactory.java |
⏳ TODO | ⏳ Not started |
src/client/inventory/MapleInventory.java |
⏳ TODO | ⏳ Not started |
src/client/SkillFactory.java |
⏳ TODO | ⏳ Not started |
Project Statistics
| Metric | Count |
|---|---|
| Files Created | 40+ |
| Lines of Code (Elixir) | ~7,500+ |
| Modules Implemented | 37+ |
| Opcodes Defined | 160+ |
| Registries | 5 (Player, Channel, Character, Map, Client) |
| Supervisors | 4 (World, Channel, Client, Map) |
| Channel Handlers | 2 (Chat ✅, Player 🔄) |
Progress Summary
| Phase | Status | % Complete |
|---|---|---|
| 1. Foundation | ✅ Complete | 100% |
| 2. Networking | ✅ Complete | 100% |
| 3. Database | 🔄 Partial | 65% |
| 4. Login Server | ✅ Complete | 100% |
| 5. World/Channel | 🔄 Core Complete | 70% |
| 6. Game Systems | 🔄 Started | 20% |
| 7. Handlers | 🔄 In Progress | 25% |
| 8. Cash Shop | 🔄 Structure + Packets | 30% |
| 9. Scripting | ⏳ Not Started | 0% |
| 10. Advanced | ⏳ Not Started | 0% |
| 11. Testing | ⏳ Not Started | 0% |
Overall Progress: ~45%
Next Session Recommendations
High Priority (Database Integration)
-
Integrate Login Handlers with Database
- Implement
authenticate_user/3with actual DB queries - Load characters from database in
load_characters/2 - Character name validation against DB
- Account/character creation in database
- Ban checking (IP, MAC, account)
- Implement
-
Implement Migration System
- Create Ecto migrations for accounts/characters tables
- Set up migration tokens for channel transfers
- Session management across servers
-
Complete Packet Sending
- Implement actual packet sending in
send_packet/2 - Add encryption/header generation before sending
- Test full login flow with real client
- Implement actual packet sending in
Medium Priority (Channel Server)
-
Implement Channel Packet Handlers
- Port
InterServerHandler(migration in) - Port
PlayerHandler(movement, attacks) - Port
InventoryHandler(items) - Port
NPCHandler(dialogs, shops)
- Port
-
Implement Map System
- Port
MapleMapFactory - Create map cache (ETS)
- Map loading from WZ data
- Port
-
Implement Character Loading
- Load full character data from database
- Load inventory/equipment
- Load skills/buffs/quests
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 NPC handler (NPC talk, shops)
- Port Inventory handler (item usage, equipping)
- Implement mob system (spawning, movement, AI)
- Implement party/guild/buddy systems in World layer
Last Updated: 2026-02-14 Current Phase: Channel Handlers (40% → 45%)