13 KiB
Java TODOs Analysis for Odinsea Elixir Port
Analysis Date: 2026-02-14
Java Source: /home/ra/lucid/src
Elixir Target: /home/ra/odinsea-elixir
Summary
Total TODOs/FIXMEs/XXXs found in Java source: 87+
After analysis, these fall into several categories:
- Critical Gameplay TODOs - Missing functionality that affects core gameplay
- Version/Region-Specific TODOs (TODO JUMP/GMS) - Code branches for different versions
- LEGEND TODOs - High-level content/skills not fully implemented
- Low-Priority TODOs - Nice-to-have features, optimizations, or minor fixes
Critical TODOs Requiring Port to Elixir
1. Energy Charge Bar Decay (MapleCharacter.java:3034)
Java Location: src/client/MapleCharacter.java:3034
Elixir Target: lib/odinsea/game/character.ex
// TODO: bar going down
if (energyLevel < 10000) {
energyLevel += (echeff.getX() * targets);
// ... energy charge handling
}
Description: The energy charge system for characters (like Aran) doesn't implement the energy bar decay over time. Currently energy only increases with attacks but doesn't decrease when not attacking.
Implementation Needed:
- Add energy charge decay timer in Character GenServer
- Decay energy when not attacking for X seconds
- Update client with energy bar changes
Priority: HIGH - Affects Aran and similar class gameplay
2. Party Quest Stats Tracking (MapleCharacter.java:7115)
Java Location: src/client/MapleCharacter.java:7115
Elixir Target: lib/odinsea/game/character.ex (party quest stats)
// TODO: gvup, vic, lose, draw, VR
public boolean startPartyQuest(final int questid) {
// ... quest initialization with stats
updateInfoQuest(questid, "min=0;sec=0;date=0000-00-00;have=0;rank=F;try=0;cmp=0;CR=0;VR=0;gvup=0;vic=0;lose=0;draw=0");
}
Description: Party quest statistics (victories, losses, draws, VR rating) are stored but not calculated or updated.
Implementation Needed:
- Track PQ completion stats
- Calculate VR (Victory Rating)
- Implement gvup (give up?) tracking
Priority: MEDIUM - Nice for PQ ranking but not blocking
3. Player Movement Validation (PlayerHandler.java:1207)
Java Location: src/handling/channel/handler/PlayerHandler.java:1207
Elixir Target: lib/odinsea/channel/handler/player.ex
if (res != null && c.getPlayer().getMap() != null) { // TODO more validation of input data
if (packet.length() < 11 || packet.length() > 26) {
return;
}
Description: Movement packet validation is minimal. Need more comprehensive validation to prevent speed hacking and teleport exploits.
Implementation Needed:
- Validate movement distances against character speed stats
- Check for impossible position changes
- Validate foothold transitions
Priority: HIGH - Security/anti-cheat concern
Note: Elixir already has Odinsea.Game.Movement with validation - verify it covers these cases.
4. Party Invitation Pending Storage (PartyHandler.java:159)
Java Location: src/handling/channel/handler/PartyHandler.java:159
Elixir Target: lib/odinsea/world/party.ex
// TODO store pending invitations and check against them
Description: Party invitations are not tracked, allowing potential exploits or duplicate invitations.
Implementation Needed:
- Store pending party invitations in ETS or GenServer state
- Validate accept/deny against pending list
- Add expiration for pending invites
Priority: MEDIUM - Prevents invitation spam/exploits
5. Summon Damage Validation (SummonHandler.java:226)
Java Location: src/handling/channel/handler/SummonHandler.java:226
Elixir Target: lib/odinsea/channel/handler/summon.ex
// TODO : Check player's stat for damage checking.
Description: Summon damage lacks proper validation against player stats, allowing potential damage hacking.
Implementation Needed:
- Validate summon damage against calculated max damage
- Apply same anti-cheat checks as player attacks
Priority: HIGH - Security/anti-cheat concern
6. Multi-Summon BuffStat Handling (SummonHandler.java:260)
Java Location: src/handling/channel/handler/SummonHandler.java:260
Elixir Target: lib/odinsea/channel/handler/summon.ex
//TODO: Multi Summoning, must do something about hack buffstat
Description: When a player has multiple summons, buff stat handling needs refinement to prevent exploits.
Implementation Needed:
- Track multiple active summons per player
- Handle buff stat stacking correctly
Priority: MEDIUM - Affects Mechanic and similar multi-summon classes
7. NPC Repair Price Calculation (NPCHandler.java:467)
Java Location: src/handling/channel/handler/NPCHandler.java:467
Elixir Target: lib/odinsea/channel/handler/npc.ex
//TODO: need more data on calculating off client
Description: Equipment durability repair prices may not match client calculations.
Implementation Needed:
- Verify repair price formula matches client
- Ensure consistent pricing across server/client
Priority: LOW - Minor economic issue
8. Monster Revive Spawn Effect (MapleMap.java:1503)
Java Location: src/server/maps/MapleMap.java:1503
Elixir Target: lib/odinsea/game/map.ex
c.sendPacket(MobPacket.spawnMonster(monster, monster.getStats().getSummonType() <= 1 ? -3 : monster.getStats().getSummonType(), oid)); // TODO effect
Description: Monster revive spawning doesn't show the proper spawn effect.
Implementation Needed:
- Send proper spawn effect packet when monsters revive
- Match visual effect to summon type
Priority: LOW - Visual polish only
9. Monster Party EXP Distribution (MapleMonster.java:1712)
Java Location: src/server/life/MapleMonster.java:1712
Elixir Target: lib/odinsea/game/monster.ex
// TODO actually this causes wrong behaviour when the party changes between attacks
// only the last setup will get exp - but otherwise we'd have to store the full party
// constellation for every attack/everytime it changes, might be wanted/needed in the
// future but not now
Description: When party composition changes during combat, EXP distribution may be unfair.
Implementation Needed:
- Store party snapshot at time of attack
- Distribute EXP based on party composition at attack time, not kill time
Priority: MEDIUM - Fairness issue in party play
10. Speed Run Rank Calculation (MapleMap.java:3244)
Java Location: src/server/maps/MapleMap.java:3244
Elixir Target: lib/odinsea/game/map.ex (speed run feature)
//TODO revamp
Description: Speed run ranking calculation needs improvement to properly track rankings.
Implementation Needed:
- Implement proper speed run leaderboard ranking
- Cache rank information efficiently
Priority: LOW - Feature enhancement
11. Anti-Cheat Attack Timing (CheatTracker.java:96,117)
Java Location: src/client/anticheat/CheatTracker.java:96,117
Elixir Target: lib/odinsea/anticheat.ex or lib/odinsea/anticheat/monitor.ex
if (Server_ClientAtkTickDiff - STime_TC > 1000) { // 250 is the ping, TODO
// ...
if (STime_TC < AtkDelay) { // 250 is the ping, TODO
Description: Anti-cheat ping buffer is hardcoded at 250ms but should be dynamic per-player.
Implementation Needed:
- Track per-player average ping
- Adjust attack timing thresholds based on actual latency
Priority: MEDIUM - Reduces false positives for laggy players
12. Death Bug - Player Spawn (MapleStatEffect.java:1296)
Java Location: src/server/MapleStatEffect.java:1296
Elixir Target: lib/odinsea/game/stat_effect.ex
applyto.setMoveAction(0); //TODO fix death bug, player doesnt spawn on other screen
Description: When a player is resurrected, they may not appear correctly on other players' screens.
Implementation Needed:
- Fix spawn broadcast packet for resurrected players
- Ensure proper visibility state sync
Priority: HIGH - Affects gameplay visibility
13. UnifiedDB Character Deletion Cleanup (UnifiedDB.java:168,177,188)
Java Location: src/service/UnifiedDB.java:168,177,188
Elixir Target: lib/odinsea/database/context.ex
World.Guild.deleteGuildCharacter(nGuildId, nCharId); // TODO: Write method for this
pFamily.leaveFamily(nCharId); // TODO: Write method for this
pSidekick.eraseToDB(); // TODO: Write method for this
Description: Character deletion doesn't properly clean up guild, family, and sidekick associations.
Implementation Needed:
- Implement
delete_guild_character/2in Guild service - Implement
leave_family/2for character deletion case - Implement sidekick cleanup
Priority: HIGH - Data integrity issue
14. Mini-Game Score Formula (MapleMiniGame.java:276)
Java Location: src/server/shops/MapleMiniGame.java:276
Elixir Target: lib/odinsea/game/mini_game.ex
public int getScore(MapleCharacter chr) {
//TODO: Fix formula
int score = 2000;
// ... basic calculation
}
Description: Mini-game (Omok/Match Card) scoring formula is placeholder.
Implementation Needed:
- Implement proper ELO or ranking formula
- Balance win/loss/tie point values
Priority: LOW - Mini-games are side content
15. Mini-Game Record Points (MapleMiniGame.java:297)
Java Location: src/server/shops/MapleMiniGame.java:297
Elixir Target: lib/odinsea/game/mini_game.ex
//TODO: record points
Description: Mini-game points are not persisted to database.
Implementation Needed:
- Add mini-game stats table
- Persist wins/losses/ties
Priority: LOW - Mini-games are side content
16. Family Splitting Logic (MapleFamily.java:690)
Java Location: src/handling/world/family/MapleFamily.java:690
Elixir Target: lib/odinsea/world/family.ex
// TODO: MapleFamily: If errors persist, consider no handling family splitting
// inside the check of whether the family should be disbanded,
// and instead handle it in the caller after this function returns.
Description: Family splitting logic during disband check may cause issues.
Implementation Needed:
- Review family splitting algorithm
- Consider moving logic to caller
Priority: MEDIUM - Stability improvement
Version-Specific TODOs (TODO JUMP / TODO LEGEND)
These TODOs indicate code that needs adjustment for different MapleStory versions (GMS vs SEA) or LEGEND content.
TODO JUMP Items
ClientPacket.java:218- Version-specific opcode handlingLoopbackPacket.java:345- Version-specific packet formatMapleStatEffect.java:573,664,1014,1035,2323- Version-specific skill behaviorPlayerHandler.java:365- Version-specific movementPartyHandler.java:31,235- Version-specific party actionsInventoryHandler.java:1603- Version-specific mount handlingMobPacket.java:399,420,474- Version-specific monster packetsPacketHelper.java:371- Version-specific character encodingMaplePacketCreator.java:146,1243,1290,1330,1370,1941,2635,2652,5497,5511,5660- Version-specific packets
TODO LEGEND Items
ReactorActionManager.java:257- Harvesting system (LEGEND profession system)LoginInformationProvider.java:125- LEGEND-specific login infoPlayerStats.java:947,2554- LEGEND class skills (Demon Slayer, etc.)MapleStatEffect.java:727,881- Mercedes and other LEGEND skills
Priority Assessment: These should be deferred until base GMS v342 is fully stable.
TODOs Already Implemented in Elixir
Based on PORT_PROGRESS.md, these Java TODOs appear to be already addressed:
- Movement System - Elixir has comprehensive
Odinsea.Game.Movementwith validation - Combat/Damage - Elixir has
Odinsea.Game.DamageCalcandOdinsea.Game.AttackInfo - Drop System - Elixir has
Odinsea.Game.DropSystemfully implemented - Quest System - Elixir has complete quest implementation
- Skill System - Elixir has
Odinsea.Game.SkillandOdinsea.Game.StatEffect
Port Priority Matrix
| Priority | Count | Description |
|---|---|---|
| CRITICAL | 4 | Data integrity, security exploits, game-breaking bugs |
| HIGH | 3 | Core gameplay features, anti-cheat, visibility |
| MEDIUM | 6 | Fairness, stability, feature completeness |
| LOW | 10+ | Visual polish, side content, optimizations |
Recommended Implementation Order
Phase 1: Critical Fixes
- ✅ UnifiedDB character deletion cleanup (Guild/Family/Sidekick)
- ✅ Death bug - player spawn on resurrection
- ✅ Summon damage validation
- ✅ Movement validation enhancement
Phase 2: Core Features
- ✅ Energy charge bar decay
- ✅ Monster party EXP distribution fix
- ✅ Party invitation tracking
- ✅ Anti-cheat ping adjustment
Phase 3: Polish
- Mini-game improvements
- Speed run ranking
- Visual effects (monster spawn)
- Version-specific content (TODO JUMP/LEGEND)
Notes
- The Elixir port has excellent coverage of core systems (movement, combat, drops, quests)
- Most critical TODOs are around data integrity (character deletion) and anti-cheat
- Version-specific TODOs (TODO JUMP/LEGEND) should be deferred
- Several TODOs in Java are minor visual/economic issues that can be addressed later