- Removed restrictive pet loot inventory slot checks in PetLootHandler.java and added explicit 1812001 (Item Pouch) and 1812000 (Meso Magnet) global equip verification.
- Added Pirate Corkscrew Blow (5101004) charge duration bindings to the actual server-side damage calculation formula in CloseRangeDamageHandler.java.
- Hardened MapleTrade.java with synchronized methods to prevent concurrent item duping.
- Synchronized ItemMoveHandler.java packet execution to prevent inventory races.
- Validated StorageHandler.java negative meso overflow autoban.
- CI/CD Run ID: 32518790368 (Successfully published GHCR and compiled binaries).
- OriginalMS CI/CD workflow confirmed green (Run ID: 32515341744)
- AuraTorrent CI/CD workflow confirmed green (Run ID: 32515049384)
- Confirm remote release workflow commit
f108d1acompleted successfully on GitHub. - Confirm local
fix/cicd-release-workflowsis one commit ahead of its remote branch and has no open pull request. - Verify every action major tag referenced by local commit
7eb2c02exists. Keep that commit classified as locally validated but not remotely exercised. - Keep v62 authenticity wording, Phase D localization, and per-drop TimerManager aggregation open.
- Fix GitHub Actions workflows for GHCR publishing and binary compilation
- Bump action versions to support Node 24 runtime
All notable changes to BiosMS are documented in this file.
The format is based on Keep a Changelog.
- CI:
.github/workflows/release_and_packages.ymlrepaired. Both jobs were pinned toruns-on: ubuntu-22.04, a GitHub-hosted image that has been retired. A job pinned to a withdrawn label never gets a runner. Both now useubuntu-latest; the compiler is still JDK 8 throughsetup-java, so the host image does not constrain the build. - CI: Two actions ran on the Node 16 action runtime, which current runners refuse to execute:
actions/setup-java@v3andsoftprops/action-gh-release@v1, now v4 and v2. Thesetup-javastep sits inside "Compile Native Binaries & ZIP Drop-in", which is where the failure was reported. - CI: Removed the
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24environment variable. The runner does not read it and it never had any effect; each action's runtime comes from its ownaction.yml. Bumping the actions is the real fix, and leaving a placebo invites the next reader to trust it. - CI: The GHCR job probed for a Dockerfile and set a flag gating every step below it. With no Dockerfile the job skipped everything and reported success, so a workflow named "Publish GitHub Container Package" could publish nothing and still go green. A missing Dockerfile is now an error.
- CI: Added
docker/setup-buildx-actionbeforebuild-push-action, plus GHA layer caching. Runner images ship buildx, but depending on a preinstalled tool makes the job depend on image contents rather than on anything the workflow declares.build-push-actionv5 to v6,actions/checkoutv4 to v5. - CI: Tightened permissions.
contents: writeandpackages: writehad been granted to every job at the top level. The top level is nowcontents: read, the Maven job addscontents: writefor the release upload, and the GHCR job addspackages: write. - CI: The ZIP step ended every copy with
|| trueand zipped whatever survived. If the build layout ever changed, every copy would fail silently and the step would either ship an empty archive or die on zip's own "nothing to do" with no explanation.target/dist,target/lib,configsandscriptsare now required and fail loudly with a::error::annotation;launch_*.shstays optional and says so.mvngained-Band-DskipTests, the latter because this repository has nosrc/test. - CI: Verified by parsing the workflow, running
bash -nover all three shell blocks, and executing the packaging script against two layouts: missing build output exits 1 with the error annotation, and a complete layout populatesrelease-pkgcorrectly. Thezipcall, the Maven build and the container build were NOT verified locally, becausezip,mvn,javaanddockerare all absent from this workstation.
docs/ORIGINALMS_GAP_ANALYSIS.md, a read-only v62 parity audit measured against the code rather than against the previous documents. No Java, script or WZ data was changed.
- Root
ORIGINALMS_GAP_ANALYSIS.mdis now a pointer to the new document. It was stale: five of its six open items were already implemented, two of them carrying Critical and High severities while the fix sat in the file the document named. Section 1 of the new document records what each item resolved to, with the file and line.
- Phases A, B and C of
ORIGINALMS_V62_PLAN.mdmeasure as complete or substantially complete. Phase D, localization, is the critical path to Oct 25: 111 files still carry Portuguese, including live Java handlers, while the README records localization as complete. - Cygnus Knights (1000-1511) and Aran (2000-2112) are fully registered and are not GMS v62 content. Cygnus shipped in v75. The project cannot claim authentic v62 parity and carry two post-v62 class lines without saying which it means. Owner decision, recorded not reverted.
- One genuine open defect:
MapleMap.javaschedules a separateTimerManagerrunnable per dropped item at lines 1065, 1100, 1153, 1163 and 1167. - README overstates three rows: localization, and by implication job-class authenticity. Gachapon at 12 locations and the Apache MINA network engine both verified accurate.
classicis fully merged and safe to delete.OdinMSholds 2 unmerged commits,audit/v62-feature-parityholds 1 documentation-only commit. Six working copies of this repository exist on disk;OriginalMS_Backuphas 1361 dirty entries.
docs/v62_FEATURE_AUDIT_REPORT.mddocumenting the v62 feature parity audit, including Cygnus Knights, Aran, boss gates, and party quests.- Authentic GMS v62 Gachapon tables embedded within NPC logic scripts.
- Localized English dialogue strings in Party Quest NPC scripts that were originally in Portuguese:
9020000.js(Kerning PQ Entry - Clott)2040034.js(Ludibrium PQ Entry - Red Sign)2012001.js(Orbis Boat Loader)2013000.js(Orbis PQ Entry - Wonky The Fairy)GuildQuest.js(Guild PQ Event Script)
- Trade Duplication Exploit - Patched a race condition in
MapleTrade.completeTrade()that allowed item duplication via concurrent confirm packets. - Meso Storage DoS Exploit - Patched
StorageHandlerbounds checking to correctly handleInteger.MIN_VALUErollovers, replacing hard crashes with strict Autoban routines. - Inventory Drop Casting - Fixed a synchronization gap in
ItemMoveHandlerpreventing macro packet drop-casting duplication. - Pet Loot Restrictions - Overhauled
PetLootHandlerto accurately recognize theItem Pouch (1812001)cash shop item and allow pets to loot items dropped by the owner. - Pirate Corkscrew Blow Calculation - Integrated
chargepacket decoding intoAbstractDealDamageHandlerto dynamically modify the damage threshold for fully-charged Corkscrew Blow attacks, preventing false-positive Autobans. - Horntail Concurrency Crash - Patched
HontalePQ.jsto eliminateConcurrentModificationExceptionthread crashes triggered when a PQ instance disposed itself inside a global iterator loop.
- Massive Scripting Phase - Initialized phased scripting architecture ledger for missing v62 JavaScript assets.
- Track 1: Static World NPCs - Generated 15 NPC scripts for Nautilus Harbor using Rhinoscript/JavaScript, including
cm.openShop()integration. - Track 2: Pirate Job Advancements - Programmed the complete 1st, 2nd, 3rd, and 4th Pirate job advancement sequence within
1090000.js(Kyrin) utilizing Fast-Track instance bypassing. - Track 3: Monster Carnival PQ - Programmed the JavaScript orchestration tier for CPQ, including
MonsterCarnivalPQ.jsevent lifecycle and2042000.js(Spiegelmann) party registration logic.
- CPQ2 (Monster Carnival 2) -
MonsterCarnivalHandlernow detects Magatia map range (980031xxx) and routes to the authentic CPQ2 mob pool (Reinforced Iron Mutae, Hector, Security Camera, Stereo Mist, Soul Teddy, Homunculus, Void Mage, Reinforced Iron Mutae Chief, Roid, King Block Golem). CPQ1 (Ludibrium) mob pool unchanged. - Crimsonwood Keep Party Quest (CWKPQ) - New
scripts/event/CrimsonwoodPQ.jsevent for the expedition-based party quest in Crimsonwood Keep maps (610020xxx). AddedCWKPQ(5)toMapleSquadTypeenum. - Mu Lung Dojo - New
scripts/event/MuLungDojo.js36-floor solo/party ranking event. Floor progression handled in-event; best floor scores persist in the newdojorecordDB table viaEventInstanceManager.saveDojoRecord(). - Maker Skill handler (
MakerSkillHandler.java) - Processes the Maker Skill interface packet (recv opcode 0x9B) for Cygnus Knights and Aran Maker skills (10001007,20001007). Looks up recipes frommaker_recipeandmaker_recipe_ingredientstables, validates materials, deducts mesos, and creates the crafted item. Starter recipes included for arrows, throwing stars, and bullets. - Party Search handlers (
PartySearchHandler.java) - WiresPARTY_SEARCH_REGISTER(0xBD) andPARTY_SEARCH_START(0xBF) recv opcodes that were previously defined inrecvops.propertiesbut never handled. Stores LFP state onMapleCharacter(partySearch,partySearchCategory). - Steal skill item drop (skill 4201004) - Bandit's Steal now has a chance (driven by the skill's effect chance stat) to drop one random item from a monster's drop table. Each monster can only be stolen from once (
isStolenFromflag onMapleMonster). Implemented inAbstractDealDamageHandler. dojorecordDB table - Tracks character best Mu Lung Dojo floor and timestamp. UsesON DUPLICATE KEY UPDATEto only record improvements.maker_recipeandmaker_recipe_ingredientsDB tables - Stores Maker Skill crafting recipes. Seeds basic v62 ammunition recipes on first import.- OmegaPQ activated - Added
OmegaPQtoworld.eventsactive list (scriptOmegaPQ.jsalready existed but was dormant). EventInstanceManager.saveDojoRecord()- New Java method callable from event scripts to write dojo ranking records to the DB without requiring direct DB access from JavaScript.
configs/world0/world.properties- RemovedBossHunterPQfrom the active event list (script file does not exist; the equivalentBossQuest.jswas already active). AddedOmegaPQ,CrimsonwoodPQ,MuLungDojo.
- BossHunterPQ naming bug -
BossHunterPQwas listed inworld.eventsbut noBossHunterPQ.jsscript exists. The server was silently failing to load this event on every startup. Removed the erroneous entry;BossQuest(the correct script) remains active. - PARTY_SEARCH opcodes unhandled -
PARTY_SEARCH_REGISTER = 0xBDandPARTY_SEARCH_START = 0xBFwere present inrecvops.propertiesand mapped in the enum but had no registered handler, causing those packets to be silently dropped. Now handled.
- Full translation of all server notices, log messages, and in-game player command output from Portuguese to English.
- Restored missing packet handler registrations and realigned recv/send opcode enum values to match client.
- Maven build configuration (
pom.xml), Docker Compose stack (docker-compose.yml), and multi-stageDockerfile(Maven build → JRE slim runtime). - Server shell launch scripts (
launch_world.sh,launch_login.sh,launch_channel.sh) and logging configuration. - JavaScript scripting engine for NPCs, portals, quests, reactors, and events using Rhino/Nashorn with
mozilla_compat.jsshim.
- Initial port of the OdinMS v62 codebase to a clean, English-language Java 8 + Maven project.
- Apache MINA 2.0.9 networking with full login, world, and channel server trio.
- Complete character system: 52 job classes (Explorer, Cygnus Knights, Aran), all skill trees, buffs, debuffs, combos, energy charge.
- Party quests: HenesysPQ, KerningPQ, LudiPQ, LudiMazePQ, OrbisPQ, AriantPQ×3, AmoriaPQ, AquariumPQ, PiratePQ, HontalePQ, ZakumPQ, GuildQuest, ElnathPQ.
- Boss systems: Zakum (squad + altar), Horntail (squad + full fight).
- CPQ1 (Monster Carnival, Ludibrium) with mob spawn, debuffs, and guardian mechanics.
- Social systems: guilds, alliances, buddy list, messenger, marriages, spouse chat.
- Economy: player shops, hired merchants, MTS, Duey delivery, storage.
- Misc: Pets (auto-pot, loot, chat, food), Mounts, VIP teleport rocks, Maple TV, Silver Box.
- World rankings computed every 30 minutes by
RankingWorker(overall + per-job-class). - MySQL 5.7 schema with 76 tables; Tomcat JDBC connection pool.