Welcome!

Join our community of MMO enthusiasts and game developers! By registering, you'll gain access to discussions on the latest developments in MMO server files and collaborate with like-minded individuals. Join us today and unlock the potential of MMO server development!

Join Today!

OrionAlpha - A Nexon-like KMS 1.21/1.23 and JMS 0.20 Emulator

Custom Title Activated
Loyal Member
Joined
Jan 18, 2010
Messages
3,109
Reaction score
1,139
UPDATE (02/20/2024) - OrionAlpha now serves as a multi-purpose beta emulator with support for KMS v1.21, KMS v1.23, and JMS v0.20. As more beta clients get found, I'll try my best to add support for each of them.

OrionAlpha has been one of my favorite projects in MapleStory development by far. After I had found these old closed alpha videos, it was the one client of the game I really wanted to play around with. Luckily for me, a client somehow managed to exist!

This emulator was written from scratch with help from sunnyboy and Arnah -- and unlike other emulators here, this one is designed to replicate the structure of Nexon's official source files. While I didn't have the patience to build this into a truly multi-JVM environment, it's not too hard to convert because we already make use of it.

So, what makes KMS 1.23 different? Here's some interesting stuff:
Code:
- This client is so old that no protection had even existed yet. No security or antihack whatsoever.
- This is the only MapleStory client without any AES or Shanda encryption. In fact, this uses it's own special XOR encryption that does not exist in any other client I've found.
- StringPool did not exist yet. All strings are hard-coded directly into the application.
- Unlike GMS clients, this is truly the only 2nd job client out there. Other clients have 3rd job stuff implemented, even if it didn't exist for a long time.
- Character emotions do not exist yet. Functional keys (F1~F12) do nothing. Originally these keys were used for actions, before Nexon updated them. An emotion for Vomit exists, but is not functional in the client yet.
- Key configuration does not exist yet. All character keys are hard-coded. This means CTRL is attack, ALT is jump, Z is loot, and M is minimap.
- Party, Buddy, and Guild all do not exist yet. This was implemented in the earliest stages of GMS clients, but not here.
- Quests do not exist yet (technically). A UI window for them shows up in the system menu, but it's hard-coded to be disabled. No quest functionality regarding packets exist, so everything is NPC-based. Almost all NPC's in the game that are scripted are solely "scripted" because they are quests. Even so, in the game files there script property is defined through the key "quest" (later changed to script).
- Cash Items are ETC and USE items. This was still a thing in old GMS clients, but quickly changed.
- This is the only client to include Wizet's original Login UI. It features completely different login panel, world select, character select, and even creations. In fact, a few versions after this the UI was changed to the one you see in all other future versions.
- NPC shop data came directly from NPCs in the game files
- Names and descriptions exist on entities in the game files, not String.wz.
- This is one of the few clients to include Wizet's original hexagonal UI (my personal favorite).
- This client is one of the first (if not the first) to include the Cash Shop system. The UI hasn't changed much.
- Almost all other game UI is unique here, such as Trading too.
- In future versions of MapleStory, all old UI elements from this client are included in the WZ files. Nexon never removed these (or updated) elements. Furthermore, Mini Game UI's and stuff were based from this client's UI before the redesign.
- Plenty more nostalgia facts that I'm probably missing here, but you get it -- this version is unique!

The implementation for OrionAlpha is pretty much complete. With less than 100 opcodes that even exist in the client, all are implemented. Database operations, game functionality, cash shop functionality, etc. is all there. We use Nexon's standard for Field handling through use of FieldSplits. All packets are only sent to users within your split, not to the map. This is how users migrate between splits, making it look like they've left the map when they are out of range on your mini map. We also use Nexon's standard for Life handling as well. With the use of a HeapBase, we have 100% GMS-like controllers (how NPCs and Mobs aggro to your character), as well as the calculations to overall mob capacity. Throughout the entire source our names, functions, and class structure have all been based on Nexon's official server files and resources. If you ever need to update packets (or find them) in client PDB's and match it to ours, you will always find them in the exact same places -- easy to update, easy to maintain. Think of OrionAlpha as a modified barebones version of Orion -- I took most of the systems from Orion to use them here. Speaking of Orion, we are relaunching in 2020 -- feel free to visit us on !

This doesn't mean OrionAlpha is perfect, it's far from it. Unfortunately, we never got around to fixing any bugs we overlooked or finished some behind the scenes features either. A lot remains that I had wanted to rewrite (our JVM architecture, DB handling, and data file loading), but never got around to it. I've also decided not to implement Orion's full damage calculations (CalcDamage) into this by a request. In regards to missing content, the only thing that's missing in OrionAlpha is the same thing that's missing in Orion -- my worst enemy, scripts! I've went around and modeled them for anyone who wishes to script them further. Every script has been documented and started. Since we weren't aware of how quests had worked (assumed they hadn't existed yet), we never wrote a backend implementation for them.

So, setting up OrionAlpha.. Well, if you know how to configure Nexon's official server files (hehe hi Darter xd), then setting up our server will be very easy! To make it easier, I've already included all the files you'll need along with all of the possible properties. If you intend to make a public server, all you'll need to do is change the IP configuration (and any other setting for rates, etc). Don't worry -- I've documented all of this on the git for your ease! All we recommend is that you have JDK 11 (or higher) installed. You will need to compile the source with an IDE (we prefer IntelliJ, but Eclipse or NetBeans works too). Finally, you will need a MySQL client. I just use the old MySQL Query Browser and refuse to change, but you can use whatever you like as long as it can create a new schema and execute queries.

Speaking of the git, here is all you need for OrionAlpha:

Since I'm basically the client hacker guy around here, what good is OrionAlpha without client edits? I've documented all of the client edits available for OrionAlpha on the git as well -- this explains what the edits do, their addresses in the client, and what to change them to. The following client hacks are available:
Code:
* Multi Client
* Window Mode
* Custom Resolution
* Repeating Chat Bypass
* Chat Spam Bypass
* Infinite Chat Text
* Swear Filter
* Remove Nexon ADs
* Droppable NX
* Custom Damage Cap
* Custom Meso Cap
* Admin Client Restrictions Bypass

I believe that is all. Everything you need can be found on the git. I've included the full game client, my personally named IDB for whatever I used it for, and even LocaleEmulator so that you can view the text outside of broken ASCII (do remember, this is a Korean beta!)

Screenshots:
Eric - OrionAlpha - A Nexon-like KMS 1.21/1.23 and JMS 0.20 Emulator - RaGEZONE Forums

Eric - OrionAlpha - A Nexon-like KMS 1.21/1.23 and JMS 0.20 Emulator - RaGEZONE Forums

Eric - OrionAlpha - A Nexon-like KMS 1.21/1.23 and JMS 0.20 Emulator - RaGEZONE Forums

Eric - OrionAlpha - A Nexon-like KMS 1.21/1.23 and JMS 0.20 Emulator - RaGEZONE Forums

Eric - OrionAlpha - A Nexon-like KMS 1.21/1.23 and JMS 0.20 Emulator - RaGEZONE Forums

Eric - OrionAlpha - A Nexon-like KMS 1.21/1.23 and JMS 0.20 Emulator - RaGEZONE Forums


Merry Christmas,
Eric
 
Last edited:
Custom Title Activated
Loyal Member
Joined
Jan 18, 2010
Messages
3,109
Reaction score
1,139
Hopefully someday the Closed Beta client gets found.

Me too. From the looks of it, it's pretty much the same client though, isn't it? I just know earlier builds used F1~F4(?) keys, didn't have a Cash Shop yet, and portal mechanics were barely there. Not too sure about the differences myself, you've definitely researched it more than I have.

Hey! I would be happy for guide how to install the server. :)

It's just like any other Java project. I'm not sure if other public sources utilize Maven or not yet? Basically you just load the project now, instead of having to add other JAR dependencies into the project manually.

1. Install an IDE (IntelliJ is preferred)
2. In your IDE, File->Open Project, and open OrionAlpha. Your IDE will scan and index the source files as well as the maven repos for dependencies.
3. On the right hand side (assuming you use IntelliJ) is a "Maven Projects" button. Expand OrionAlpha -> Lifecycle -> Package.
4. Once you've packaged the files to the target directory, you're all set in regards to the backend.
5. Install MySQL (use a client -- I use MySQL Query Browser, you can use HeidiSQL or Navicat, whatever you'd like)
6. If you have MySQL installed, File->Open Script, and find the SQL file located in OrionAlpha/sql/ named OrionAlpha.sql
7. Execute the file, it will create a schema called 'orionalpha'. This is your database for the server, and it's all set.
8. Now, setup your configuration (reference the git). If you want custom rates or something, go for it. Otherwise, skip this step.
9. Launch the server! (run .bat files) I will need to update the git doc to include this, but the launch order is as follows: Login => Game => Shop.
10. Voila! Your server is all setup. You can customize the client too if you'd like.

Oh, and in regards to accounts.. The default SQL includes our accounts, feel free to just add your own. In MySQL create a new column, name your account whatever you'd like, copy our password, and make your grade code 2. Our password is the default "admin" password used everywhere else.

Looks like Odin

i'm sorry i failed you zygod :((

The python scripts revolution continues comrades

Yeah I did python scripts all for you fam, I even referenced your release for it. Right now I have some issue with Jython where apparently they use some deprecated reflection or something? No clue, something with streams in their dependency. I noticed you use the old revision on your post, not the new 2.7 one, maybe I should use that one instead lmao
 
Newbie Spellweaver
Joined
May 22, 2012
Messages
27
Reaction score
0
sometimes i dream to get to this level of maple developing...
 
Newbie Spellweaver
Joined
May 22, 2012
Messages
27
Reaction score
0
Nobody but yourself is stopping you from getting to "this level".
as a child i always wanted to develop a maple server but i just cant find the way to do this, always when i start i somehow get blocked in the way and stops.
i dont know why but it seems impoosible to me in someway...
 
Interesting...
Loyal Member
Joined
Oct 25, 2008
Messages
1,372
Reaction score
604
as a child i always wanted to develop a maple server but i just cant find the way to do this, always when i start i somehow get blocked in the way and stops.
i dont know why but it seems impoosible to me in someway...

Just set up a source, complete a few free Java tutorials online, and start tinkering with it. You could be fairly decent in just a few months if you put in enough effort
 
Initiate Mage
Joined
Dec 28, 2019
Messages
1
Reaction score
0
Awesome release. Do you think you would be adding gms support for networking/crypto? Would help give gms sources a good push forward I believe!
 
Custom Title Activated
Loyal Member
Joined
Jan 18, 2010
Messages
3,109
Reaction score
1,139
Awesome release. Do you think you would be adding gms support for networking/crypto? Would help give gms sources a good push forward I believe!

I wouldn't be adding GMS support to OrionAlpha directly, no. However, the networking implementation itself is not region specific. The primary differences would be that in GMS clients, 1) Nexon encrypts the data length in the packet headers by doing dataLen ^= rawSeq; 2) AES and Shanda are introduced; 3) Client sequences are updated using an IGcipher. This is open-source for a reason: for people to build off of. I'm hoping that people who would like to have Netty in their source (or who want to update this into a GMS source -- go for it!) to take what I have with what they know and apply it.
 
Initiate Mage
Joined
Jan 1, 2020
Messages
1
Reaction score
0
hi. i'm fairly new to maplestory servers and really wanted to try this source out. but im running into an error after setting everything up and running launch_login.
Code:
MapleStory Korea Service WvsLogin.exe.
Jan 01, 2020 12:49:11 AM com.zaxxer.hikari.HikariDataSource <init>
INFO: HikariPool-1 - Starting...
Jan 01, 2020 12:49:13 AM com.zaxxer.hikari.pool.HikariPool throwPoolInitializationException
SEVERE: HikariPool-1 - Exception during pool initialization.
java.sql.SQLInvalidAuthorizationSpecException: Access denied for user 'root'@'localhost' (using password: NO)
        at org.mariadb.jdbc.internal.util.exceptions.ExceptionMapper.get(ExceptionMapper.java:173)
        at org.mariadb.jdbc.internal.util.exceptions.ExceptionMapper.getException(ExceptionMapper.java:110)
        at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.connectWithoutProxy(AbstractConnectProtocol.java:1093)
        at org.mariadb.jdbc.internal.util.Utils.retrieveProxy(Utils.java:494)
        at org.mariadb.jdbc.MariaDbConnection.newConnection(MariaDbConnection.java:150)
        at org.mariadb.jdbc.Driver.connect(Driver.java:86)
        at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:117)
        at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:123)
        at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:367)
        at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:196)
        at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:467)
        at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:541)
        at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:115)
        at com.zaxxer.hikari.HikariDataSource.<init>(HikariDataSource.java:81)
        at network.database.UnifiedDB.load(UnifiedDB.java:96)
        at login.LoginApp.initializeDB(LoginApp.java:202)
        at login.LoginApp.setUp(LoginApp.java:262)
        at login.LoginApp.start(LoginApp.java:248)
        at login.LoginApp.main(LoginApp.java:242)
Caused by: java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: NO)
Current charset is windows-1252. If password has been set using other charset, consider using option 'passwordCharacterEncoding'
        at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.authentication(AbstractConnectProtocol.java:852)
        at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.handleConnectionPhases(AbstractConnectProtocol.java:780)
        at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.connect(AbstractConnectProtocol.java:454)
        at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.connectWithoutProxy(AbstractConnectProtocol.java:1089)
        ... 16 more

com.zaxxer.hikari.pool.HikariPool$PoolInitializationException: Failed to initialize pool: Access denied for user 'root'@'localhost' (using password: NO)
        at com.zaxxer.hikari.pool.HikariPool.throwPoolInitializationException(HikariPool.java:576)
        at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:562)
        at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:115)
        at com.zaxxer.hikari.HikariDataSource.<init>(HikariDataSource.java:81)
        at network.database.UnifiedDB.load(UnifiedDB.java:96)
        at login.LoginApp.initializeDB(LoginApp.java:202)
        at login.LoginApp.setUp(LoginApp.java:262)
        at login.LoginApp.start(LoginApp.java:248)
        at login.LoginApp.main(LoginApp.java:242)
Caused by: java.sql.SQLInvalidAuthorizationSpecException: Access denied for user 'root'@'localhost' (using password: NO)
        at org.mariadb.jdbc.internal.util.exceptions.ExceptionMapper.get(ExceptionMapper.java:173)
        at org.mariadb.jdbc.internal.util.exceptions.ExceptionMapper.getException(ExceptionMapper.java:110)
        at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.connectWithoutProxy(AbstractConnectProtocol.java:1093)
        at org.mariadb.jdbc.internal.util.Utils.retrieveProxy(Utils.java:494)
        at org.mariadb.jdbc.MariaDbConnection.newConnection(MariaDbConnection.java:150)
        at org.mariadb.jdbc.Driver.connect(Driver.java:86)
        at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:117)
        at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:123)
        at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:367)
        at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:196)
        at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:467)
        at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:541)
        ... 7 more
Caused by: java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: NO)
Current charset is windows-1252. If password has been set using other charset, consider using option 'passwordCharacterEncoding'
        at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.authentication(AbstractConnectProtocol.java:852)
        at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.handleConnectionPhases(AbstractConnectProtocol.java:780)
        at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.connect(AbstractConnectProtocol.java:454)
        at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.connectWithoutProxy(AbstractConnectProtocol.java:1089)
        ... 16 more
Press any key to continue . . .

It has something to do with having insufficient privileges i think? I'm using a MYSQL server and it forces me to use a password. i only care to run the server for myself btw. i havent port fowarded anything
 
Custom Title Activated
Loyal Member
Joined
Jan 18, 2010
Messages
3,109
Reaction score
1,139

Well, that's what documentation is for..

Code:
dbGameWorldInfo -> The username/password of your database, separated by comma. (e.g "root,password")
The default is "root," because we don't use a password on local. So, if you need to use one, change it to "root,yourpasswordhere" in Database.img.

Oh, and if you're using a remote MySQL server or custom port, reconfigure those as well. All configurations are explained on the README.
 
Joined
Sep 8, 2011
Messages
822
Reaction score
129
dist jar?
download link"?

Download it, iirc you need to use this as a Maven project, in other words - it has dependencies that are required in order to compile, luckily most Java IDEs can handle this automatically or at the very least - a single click would do it for you.

All in all, it takes less than a minute to set this up and running.
 
Newbie Spellweaver
Joined
Jan 9, 2019
Messages
18
Reaction score
0
Me too. From the looks of it, it's pretty much the same client though, isn't it? I just know earlier builds used F1~F4(?) keys, didn't have a Cash Shop yet, and portal mechanics were barely there. Not too sure about the differences myself, you've definitely researched it more than I have.



It's just like any other Java project. I'm not sure if other public sources utilize Maven or not yet? Basically you just load the project now, instead of having to add other JAR dependencies into the project manually.

1. Install an IDE (IntelliJ is preferred)
2. In your IDE, File->Open Project, and open OrionAlpha. Your IDE will scan and index the source files as well as the maven repos for dependencies.
3. On the right hand side (assuming you use IntelliJ) is a "Maven Projects" button. Expand OrionAlpha -> Lifecycle -> Package.
4. Once you've packaged the files to the target directory, you're all set in regards to the backend.
5. Install MySQL (use a client -- I use MySQL Query Browser, you can use HeidiSQL or Navicat, whatever you'd like)
6. If you have MySQL installed, File->Open Script, and find the SQL file located in OrionAlpha/sql/ named OrionAlpha.sql
7. Execute the file, it will create a schema called 'orionalpha'. This is your database for the server, and it's all set.
8. Now, setup your configuration (reference the git). If you want custom rates or something, go for it. Otherwise, skip this step.
9. Launch the server! (run .bat files) I will need to update the git doc to include this, but the launch order is as follows: Login => Game => Shop.
10. Voila! Your server is all setup. You can customize the client too if you'd like.

Oh, and in regards to accounts.. The default SQL includes our accounts, feel free to just add your own. In MySQL create a new column, name your account whatever you'd like, copy our password, and make your grade code 2. Our password is the default "admin" password used everywhere else.



i'm sorry i failed you zygod :((



Yeah I did python scripts all for you fam, I even referenced your release for it. Right now I have some issue with Jython where apparently they use some deprecated reflection or something? No clue, something with streams in their dependency. I noticed you use the old revision on your post, not the new 2.7 one, maybe I should use that one instead lmao

I got to step 3 bug then I get an error
Eric - OrionAlpha - A Nexon-like KMS 1.21/1.23 and JMS 0.20 Emulator - RaGEZONE Forums


EDIT: nvm figured it out by changing the project language to SDK



Are there any GM commands or something?
 
Last edited:
Back
Top