Giter Club home page Giter Club logo

cosmic's Introduction

Cosmic

Cosmic is a server emulator for Global MapleStory (GMS) version 83.

Introduction

Cosmic launched on March 2021. It is based on code from a long line of server emulators spanning over a decade - starting with OdinMS (2008) and ending with HeavenMS (2019).

This is mainly a Java based project, but there are also a bunch of scripts written in JavaScript.

Head developer and maintainer: Ponk.
Contributors: a lot of people over the years, and hopefully more to come. Big thanks to everyone who has contributed so far!

Join the Discord server where most of the discussions take place: https://discord.gg/JU5aQapVZK

Goals

What we are working towards.

  • Vanilla gameplay - stay as close to the original game as possible (within reason).
  • Ease of use - getting started should be frictionless and contributing to the project straightforward.
  • Reduce technical debt - making changes should be easy without causing unintended side effects.
  • Modern tools & technologies - stay appealing by continuously improving the code and the project as a whole.

Non-goals

Explicitly excluded from the scope of the project.

  • Custom gameplay features - existing custom features will be removed over time and new ones are unlikely to be added.
  • Client development - this project is focused on the server. Please go elsewhere for client related questions.
  • Public server - there will not be an official Cosmic server open to the public. Feel free to launch your own server at your own risk. No support will be provided.

Project setup

Contribute

You may contribute to the project in various ways, mainly through GitHub:

  • Providing improvements to the code through a Pull Request from your own fork.
  • Reporting a bug by creating an Issue.
  • Providing information to existing issues or reviewing pull requests that others have made.
  • ...and in other ways that I haven't thought of!

Continuous integration

A GitHub Actions pipeline is set up to run the build automatically when a new pull request is opened or commits are pushed to an existing one. This ensures that the code compiles and all the tests pass.

Once a pull request is merged, a tag with the new version is automatically created.

Discord integration

Most GitHub activity is pushed to a Discord channel for visibility. This works by leveraging a webhook. The activity includes (but is not limited to): merged commits, created PRs, comments, and new tags.

Versioning

The project follows the semantic versioning scheme using git tags.

  • Bug fixes are treated as PATCH: 1.2.3 -> 1.2.4
  • General changes or improvements are treated as MINOR: 1.2.3 -> 1.3.0
  • Major changes are treated as MAJOR: 1.2.3 -> 2.0.0

Getting started

Follow along as I go through the steps to play the game on your local computer from start to finish. I won't go into extreme detail, so if you don't have prior experience with Java or git, you might struggle.

We will set up the following:

  • Database - the database is used by the server to store game data such as accounts, characters and inventory items.
  • Server - the server is the "brain" and routes network traffic between the clients.
  • Client - the client is the application used to play the game, i.e. MapleStory.exe.

1 - Database

You will start by installing the database server and client, and then run some scripts to prepare it for the server.

Steps

  1. Download and install MySQL Community Server 8+. You will have to set a root password, make sure you don't lose it because you will need it later.
  2. Download and install HeidiSQL.
  3. Open HeidiSQL and connect to the database ("New" -> "Session in root folder" -> fill in password -> "Open").
  4. Run all four scripts located in database/sql in order. Starting with 1-db_database.sql and ending with 4-db-admin.sql. In HeidiSQL: "File" -> "Run SQL File...".
  5. The database is ready!

2 - Server

You will start by cloning the repository, then configure the database properties and lastly start the server.

Prerequisites

Steps

  1. Clone Cosmic into a new project. In IntelliJ, you would create a new project from version control.
  2. Open config.yaml. Find "DB_PASS" and set it to your database root user password.
  3. Start the server. The main method is located in net.server.Server.
  4. If you see "Cosmic is now online" in the console, it means the server is online and ready to serve traffic. Yay!

Below, I list other ways of running the server which are completely optional.

Docker

Support for Docker is also provided out of the box, as an alternative to running straight in the IDE. If you have Docker Desktop installed it's as easy as running docker compose up.

Making changes becomes a bit more tedious though as you have to rebuild the server image via docker compose up --build.

On the first launch, the database container will run the scripts which may take so long that the server fails to start. In that case, just wait until the database is done running the scripts and then retry (Ctrl+C and re-run the command).

Jar

Another option is to start the server from a terminal by running a jar file. You first need to build the jar file from source which requires Maven.

Building the jar file is as easy as running mvn clean package. The project is configured to produce a "fat" jar which contains all dependencies (by utilizing the maven-assembly-plugin). Note that the WZ XML files are not included in the jar.

To run the jar, a launch.bat file is provided for convenience. Simply double-click it and the server will start in a new terminal window.

Alternatively, run the jar file from the terminal. Just remember to provide the wz-path system property pointing to your wz directory.

3 - Client

You will start by installing the game with the old installer, then overwrite some WZ files with our custom ones, and lastly get the localhost executable in place.

Steps

  1. Download MapleGlobal-v83-setup.exe from my Google Drive. This is the official installer from back then.
  2. Install it in a directory of your choice.
  3. Delete the following files from the installation directory: HShield (entire directory), ASPLnchr.exe, MapleStory.exe, and Patcher.exe.
  4. Download CosmicWZ-2024-05-21-v0.13.0.zip from my Google Drive.
  5. Unzip it and copy all .wz-files into the installation directory. Replace the existing ones.
  6. Download HeavenMS-localhost-WINDOW.exe from hostr.co. This is a client modified to connect to your localhost instead of Nexon's server (along with some fixes and custom changes).
    • Your antivirus will likely detect the file as a trojan or similar and automatically delete it. To prevent this from happening, add your Downloads directory and the installation directory as exclusions in your antivirus software. On W11, this is under "Virus & threat protection settings" -> "Add or remove exclusions".
  7. Move HeavenMS-localhost-WINDOW.exe into the installation directory.
  8. Done! Double-click the exe and the game should start.
    • The client may be a bit fiddly. Sometimes it won't start, but if you see "Client connected" in the server console it's a good indication. Try spam-clicking it like 10+ times, that usually works for me.

Important note about localhost clients: these executables are red-flagged by antivirus tools as potentially malicious software. This happens due to the reverse engineering methods that were applied onto these software artifacts. The one provided here has been in use for years already and posed no harm so far, so it is assumed to be safe.

4 - Getting into the game

The client has started, and you're looking at the login screen.

Logging in

At this point, you can log in to the admin account using the following credentials:

  • Username: "admin"
  • Password: "admin"
  • Pin: "0000"
  • Pic: "000000"

Or create a regular account by typing in your desired username & password and attempting to log in. This "automatic registration" feature lets you create new accounts to play around with. It is enabled by default (see config.yaml).

Entering the game

Create a new character as you normally would, and then select it to enter the game. Hooray, finally we're in!

If you log in to the "Admin" character, you'll notice that the character looks almost invisible. This is hide mode, which is enabled by default when you log in to a GM character. You won't be visible to normal players and no mobs will move if you're alone on the map. Toggle hide mode on or off by typing "@hide" in the in-game chat.

Hide is one of many commands available to players, type "@commands" to see the full list. Higher ranked GMs have access to more powerful commands.

That's it, have fun playing around in game!

Advanced concepts

Some slightly more advanced concepts that might be useful once you're up and running.

Host on remote server

You don't have to host the server on your local machine to play. It's possible to host on a remote server such as a VPS or even a dedicated server.

I leave it to you to figure out the server hosting part, but once you have that running you'll need to edit the client exe to point to your remote server ip.

Edit client ip

  1. Download and install a hex editor: HxD
  2. Start HxD and open your client exe (I recommend making a copy of it first). At this point you should see a bunch of hex codes and a "Decoded text" column to the right of it.
  3. Ctrl+f and search for Text-string "127.0.0.1". You should find three occurrences right above each other.
  4. Place your cursor before the first "127" and start typing the desired ip, overwriting what is already there. Do the same on the other two and click on Save.
  5. Done! Now the client will attempt to connect to that ip address instead when you launch it.

WZ files

WZ files are the asset/data files required by the client and server. Typically, HaRepacker-resurrected is used to handle (view, edit, export) the .wz files.

The client can read the .wz files directly, but the server requires them in XML format. The server also does not make use of the sprites, which is the motivation for different kinds of exporting. HaRepacker allows you to export to "Private server", which is the .img files packaged in the .wz stripped of sprites and converted to XML. This takes much less disk space.

This server requires custom .wz files (unfortunately), as you may have noted during installation of the client. The intention is for these to be removed eventually and to solely run on vanilla .wz files.

WZ editing

  • Use the HaRepacker-resurrected editor, encryption "GMS (old)".
  • Open the desired .wz for editing and use the node hierarchy to make the desired changes (copy/pasting nodes may be unreliable in rare scenarios).
  • Save the changed .wz, overwriting the original content at the client folder.
  • Finally, re-export (using the "Private Server" exporting option) the changed XMLs into the server's .wz XML files (found in the "wz" directory), overwriting the old contents.

Make sure to always export from the client .wz files to the server XML, and not the other way around.

Editing the client .wz without exporting to the server may lead to strange behavior.

Client features

For more information about the client and its features, see HeavenMS on GitHub.

Some notable features:

  • Opens in window mode by default
  • Uncapped max speed

cosmic's People

Contributors

asafgb avatar canigetapr avatar cpurules avatar doggikong avatar favouris avatar foxyyokai avatar harkuli avatar jaydenseah avatar kolakcc avatar leevccc avatar lynxstar avatar matthewhinds avatar medicop avatar noamyoyo avatar nulliphite avatar ormizj avatar p0nk avatar peamy avatar periwinks avatar ronancpl avatar rubend96 avatar silwhoon avatar steven1152 avatar truongdatnhan avatar ubaware avatar v3921358 avatar vcoc avatar vince538 avatar wejrox avatar yuzumika avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

cosmic's Issues

pet equ err ‭-2147467261‬

id:1822000
name:Pet Label Ring

win10 21h2 An error is reported when the mouse is moved to the item
err:-2147467261‬

win10 ltsc2019 no problem

rate coupons stop working on death

Rate coupons seem to be working as a buff, and expire when u die like all buffs, but the times in which they buff are when the character is saved, eg; changing channels / relogging / going into/outof cash shop
So to get the buff again after death you'll have to cc, instead of it being automatically applied after death

Custom NPC scripts don't override the default

If you create a custom NPC script, it isn't executed if the NPC already has a D0 entry in the wz xml.

For example, Cody has the following XML:

  <imgdir name="9200000">
    <string name="name" value="Cody"/>
    <string name="func" value="Wizet Wizard"/>
    <string name="n0" value="Hey, care to help me out??"/>
    <string name="n1" value="I&apos;m telling you, I really AM from WIZET!"/>
    <string name="d0" value="What&apos;s going on? I&apos;m Cody, the head programmer of MapleStory~"/>
    <string name="d1" value="Thanks to your help, the party went bananas! Boy it was fun. anyway, hope you liked the stuff that I gave you. I&apos;ll see you around~"/>
  </imgdir>

I created a new npc file (scripts/npc/9200000.js) and gave it custom content, but it's never executed. It seems most if not all of the npcs that are already in the WZ xml files have been skipped over if they already have text. It makes sense, but it's difficult if you want to have an npc become a custom npc.

I think the scripts should take precedence if they exist, instead of being a fallback. I think scipting.npc.NPCConversationManager may be the place to do it, but I haven't dug far enough to say for sure.

A side use-case for this is fixing incorrect wording that was on some of the NPCs in v83.

Thoughts?

P.s. I came across this issue when trying to debug why Cody wasn't registering as an npc when debug mode is enabled and I clicked him. Seems like there are multiple pathways to having a conversation with an npc, maybe something to refactor.

Tools are broken

Have only checked MapleMobBookUpdate so far, which is unable to make a database connection.

Error when i try to run sv with IntelliJ idea

i got this error please help

java.lang.NoSuchFieldException: modifiers
at java.base/java.lang.Class.getDeclaredField(Class.java:2549)
at tools.AutoJCE.removeCryptographyRestrictions(AutoJCE.java:32)
at net.server.Server.main(Server.java:974)
Failed to remove cryptography restrictions

Mushroom Kingdom map issue

The NPCs for the first Mushroom Kingdom map (106020000 - Mushroom Forest Field) are in the wrong spots.

Cosmic:
image

Expected:
image

These are all supposed to be further to the left (with the exception of the Head Security Officer, who should be close to the portal but is in fact all the way to the left of the map). You can see that the graphics for Mushking are slightly broken because he is supposed to be seated in his throne to the left (foothold 40)

It appears to be an issue in the WZ files for this map. The server XML/WZ files have different footholds assigned than in a clean Map.wz, which line up with where the characters are (mis)placed

I am happy to fix this, I think that just pulling a copy of this map from the clean v83 WZ and updating will suffice - but not sure what the process is for changes to the WZ/XML files is :-)

Wrong Southperry in command goto

Currently !goto southperry sends the player to map 60000, which is an older Southperry. The correct Southperry is map 2000000.

gmserver setting

gm server is not implemented
image
its only mentioned in serverconfig and config.yaml, there isn't any use of the setting

in my understanding gmserver is supposed to allow only gm accounts to log in(user accounts wouldn't be able to login), this can be done with a check whether the account has a character with gm lvl >1
This setting is useful for server owners to check that the server is ok after a restart / update before allowing the users to log in
It will also be good idea to add a command @gmserver off, (permission only for characters with gm lvl 4/5+) to re-enable users to log in, I'm unsure about how to implement the gmserver setting but I think if it was implemented I could write the code for the command

Code formatting is inconsistent

This one may be controversial, but I think the code style should be standardised and applied to the repo. Currently there's a mix of tabs and spaces everywhere, some different brace placement etc.

Since intellij community has become pretty standard next to vscode, I think it would be worth having a standard code style committed to the repo for both editors, then it can be applied automatically on save for js and java files.

Currently I've gotten around the tabs issue by changing the tab display to 8 characters in my IDE, which makes it look a bit better, but it's inconsistent.

Thoughts?

Script 1063017 broken due to typo

ERROR npc.NPCScriptManager - Error performing NPC script action for npc: 1063017
javax.script.ScriptException: org.graalvm.polyglot.PolyglotException: TypeError: Access to host class server.life.MapleLifeFactoroy is not allowed or does not exist.

"MapleLifeFactoroy" should be "LifeFactory"

commit397 Map.wz corrupt

Hey, WinRAR is saying the following when I unzip it. Do you mind uploading a new version?

commit397_wz-20210321T173600Z-001.zip: Checksum error in commit397_wz\Map.wz. The file is corrupt
commit397_wz-20210321T173600Z-001.zip: The archive is corrupt

Mob skill cooldown is broken

Horntail spams skills constantly. Gatekeeper attacks upon entering the map even though no character is nearby.
Likely introduced during mob skill refactoring in last merged PR.

[Need Help]damage cap

I have created an account and a hero, after maxing the stats, the maximum damage dealed by character is 199999, I'm wondering is there any way to unlimited damage cap?

Constants for class skills are missing some entries

I've found that a few classes are missing entries for skills in their java constants file (constants.skills.*). Two examples are Aran and Bowmaster.

If you cross check the skills listed against those available on BBB hiddenstreet, you can which are missing.

They'd be useful to add in so that they could be referenced directly instead of the skill id, which would improve script readability in my opinion. Of course, it's better to have a complete list in case people wish to reference them in future, so that's another reason.

party exp distribution

When in a party and killing a mob, one of the party members (the one who dealt the most damage) gets the maximum exp and the others get the minimum exp (regardless of their damage), for example, 6 characters are in a party and two attack a zakum arm, lets say it gives 100 exp, one of them dealt 51% of the damage and another 49% the rest didn't participate but are within the level interval to leech, the one who dealt 51% will get 20+80/6 exp and his friends 80/6 exp each, instead it should be, the one who hit 51% gets 51%*20 +80/6, his friend 49%*20 +80/6 and the other 4 80/6

example takes into account the default values:
EXP_SPLIT_MVP_MOD: 0.2
EXP_SPLIT_COMMON_MOD: 0.8
PARTY_BONUS_EXP_RATE: 1.0

The relevant file to look at is Monster.java

Docker compose mounted directories creates rebuild issues

Changes to the src can't be rebuilt once it's been deployed, since the user doesn't have permissions on the docker-db-data directory which is sent to the docker build context. This causes docker-compose up --build to complain of a docker socket issue when it's actually masking the permissions error (evident by running docker build . in the project root).

I've fixed this locally by adding the folder to the .dockerignore since it shouldn't be sent to the image anyway.

Area bosses are not killable

Snow Witch, Security Camera, Deet and Roi, Scholar Ghost and Shade should be killable and stop using the warp attack when the reactor on the map has been triggered.

Some NPC/Quest/... scripts are in UTF-8 encoding

Some scripts have characters in them causing them to not be processed by the engine.

cunfricht@charlie-dev:~/Projects/Cosmic$ find . -path "./scripts/*/*.js" -exec file {} \; >encoding.txt
cunfricht@charlie-dev:~/Projects/Cosmic$ cat encoding.txt | grep UTF-8
./scripts/quest/20408.js: UTF-8 Unicode text
./scripts/quest/21738.js: UTF-8 Unicode text
./scripts/npc/1092019.js: UTF-8 Unicode text, with very long lines
./scripts/npc/2012031.js: UTF-8 Unicode text
./scripts/npc/2042000.js: UTF-8 Unicode text, with very long lines
./scripts/npc/2012028.js: UTF-8 Unicode text
./scripts/npc/2012033.js: UTF-8 Unicode text
./scripts/npc/2012032.js: UTF-8 Unicode text
./scripts/npc/1090000.js: UTF-8 Unicode text, with very long lines
./scripts/npc/2012030.js: UTF-8 Unicode text
./scripts/npc/2012027.js: UTF-8 Unicode text
./scripts/npc/2012029.js: UTF-8 Unicode text

Exception during RankingLoginTask run

RankingLoginTask causes exception when run: "Unsupported conversion from TIMESTAMP to java.lang.Long". Most likely a side effect from upgrading MySQL versions.
The same issue was fixed for "tempban" and "birthday" values in "account" table.

Docker compose maplestory service doesn't wait for db health before starting

executing docker-compose up for the first time failed for me since maplestory started before the database had initialised everything. It was fine the second run, presumably since the db had set up all the tables and made itself available for connection.

Unfortunately compose doesn't have the inbuilt ability to wait until a service has passed its health checks before starting another service; instead depends_on only waits until the container starts.

Potential solutions could be to use a wait-for instead to await db connectivity?

Change rebirth support to allow a custom npc id to be used

Currently rebirths can be turned on but they'll only we usable if you can find Wolf Spirit Ryko (9010021). We couldn't find that npc anywhere that was listed in the xml files, so I modified the rebirth system to allow a specific NPC id to be passed in.

This feature seems pretty useful, so I think it should be added.

Since npcs that already have their conversations present in the wz don't automatically use the *.js file present and any npc should be usable, the id of the rebirth npc being set should be added to the list of npcs that will always use the override, if rebirths are enabled.

Rebirth doesn't clear old job quests which prevents players from being the same job again

Second job quests for explorers use custom quest IDs for tracking the progress (letter, marbles, proof of hero). When rebirthing, these quests are still marked as completed for the player, which prevents them from getting past the letter phase.

The custom quest IDs are not shorts either, although they need to be in order to send the packet to the client.
In order to set up the rebirth to reset completed class-specific quests, the custom quests will need to have their id changed to be < 32767 in order to be a short, and the rebirth system will need to be extended to forfeit those quests. Currently, no method exists on the maple character to do so.

  • Change custom explorer second job quest ids to be shorts instead of ints
  • Add a method to lazily delete/forfeit quests to the maple character
  • Figure out the list of quests that need to be forfeited for each class and create a reference to them
  • Extend MapleCharacter::rebirth to also forfeit any job-specific quests

thank u

Thank you for your continued contribution.

Mini Dungeons don't work in parties

Script error in: MD_pig, MD_mushroom, MD_golem
I suppose other Mini dungeons also cause these errors too
you are able to enter them when you aren't in a party but I think that's actually supposed to not be possible

image

Some Magatia quests are not coded

Asethia in #bug-report:

A lot of the Magatia quests seem to be not functioning or bugged in some way, not entirely sure why? Fairly confident that it isn't v83 related, went through and saw tons of people talking about doing them around this time, so probably related to heavenms? Unfortunate too, given they're one of the main questlines available in the 70s.

For instance;

"The secret, Quiet passage" doesn't seem completable

You're supposed to go through to this locked door, press up, then enter a password, but it simply doesn't respond. https://youtu.be/Io5MFrh7NVg?t=400 (link to the quest with time stamp)

Similarly; a lot of the clickables in "Magatia: Home of the missing alchemist" don't respond, or don't respond for the quests they're needed to, making them impossible to complete without commands.

https://youtu.be/Io5MFrh7NVg?t=423

You also can't collect this item; Magic device, from Closed lab homun, so commands are required again to complete it.

https://youtu.be/Io5MFrh7NVg?t=161

Feature request: support a local directory

Instead of the user modifying script/wz/config.yaml, having a separate local directory ($HOME/.local/share/cosmic?) that the server will load on top of it's own directory would be rather nice.

As an example in the local directory a user can have a config.yaml with only the changed values:

WORLDS: 2
ENABLE_PIC: false
USE_MTS: true

As well for scripts/wz folder the source likewise loads the local folder on top of it's own original folder, so the user only needs to have the scripts / wz xmls that they want to change or add.

Rebirthing and becoming the same class prevents 3rd job advancement due to sp gains

When a player rebirths, the game remembers how many points have been used on which skills. This causes them to be present on the next playthrough if the player chooses the same job path.

By itself this is not an issue, but the server requires that the player use all their sp before their 3rd job advancement, which is not possible in this scenario since their skills are already maxed out. This leads to a deadlock in progression.

A possible fix is to warn the player that SP will be lost when they job advance instead of requesting they use it. Of course, this isn't in line with the authentic experience since you had to use them instead.

Exception with portal in map 261000010 (Zenumist Society)

Attempting to enter the portal to map 261000011 (Zenumist - Hidden Room : Zenumist - Hidden Room) results in a exception, forcing a !reloadmap command.

image

java.lang.IndexOutOfBoundsException: readerIndex(20) + length(4) exceeds writerIndex(20): UnpooledHeapByteBuf(ridx: 20, widx: 20, cap: 20/20)
        at io.netty.buffer.AbstractByteBuf.checkReadableBytes0(AbstractByteBuf.java:1442)
        at io.netty.buffer.AbstractByteBuf.readIntLE(AbstractByteBuf.java:817)
        at net.packet.ByteBufInPacket.readInt(ByteBufInPacket.java:33)
        at net.server.channel.handlers.ChangeMapHandler.handlePacket(ChangeMapHandler.java:91)
        at client.Client.channelRead(Client.java:208)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
        at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
        at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436)
        at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:327)
        at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:299)
        at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
        at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
        at io.netty.handler.timeout.IdleStateHandler.channelRead(IdleStateHandler.java:286)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
        at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
        at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
        at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
        at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166)
        at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:722)
        at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:658)
        at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:584)
        at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:496)
        at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
        at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
        at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
        at java.base/java.lang.Thread.run(Thread.java:833)

KIN/NimaKIN cleanup

It's unknown to me if KIN and NimaKIN have ever been documented in actual MapleStory (be it GMS, KMS, or otherwise).

I think KIN's current script should be changed to a !gmsalon command or the like and restoring her as changing people's job to GMs (900/910) as it appears is her function from her speech bubble. A note for current functionality is it would be ideal if hair/eye color didn't default to black but was taken from the player's existing.

As for NimaKIN, I think there should probably be a check before the dialog to see if the player can level up (if level under 200/120), assuming the dialogue is not original.

Mount in config.yaml to maplestory service

Currently the config is built with the jar, but mounting it in would make it easier to redeploy and test changes, since it shouldn't need a full rebuild to be applied.

Leech levels are off

Level 50 chr is leeching from a level 90 mob with lv 105 chr as mvp.
As described by Shahar in the general channel on Discord on September 4th.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.