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!

[V32] Test Server with custom resolution client

Junior Spellweaver
Joined
Jul 1, 2008
Messages
178
Reaction score
83
Wow I don't think I've released any thing Maple PS related since like 2010. This is a follow up thread to http://forum.ragezone.com/f427/maplestory-v32-localhost-595338-post5173059/#post5173059 lmao

[SUB]only like 9 years late lmao[/SUB]


Clean-ish V32 download from 2009:
Part1:
Part2:
Part3:
Part4:
Part5:

Custom res client, multiclient localhosts:

C# Server:

Custom WZ:

Server has basic functionality implemented, killing mobs, picking up items, leveling up, moving items around, etc. This is a very basic and early version of the server, there's still a ton more to work on but I've got other things to work on now so rip this dream. It's basically a hacked together server.

The server also uses RethinkDB instead of boring MySQL, so GL figuring out how to setup Rethink + Auth on it.

Tables Required:
  • "accounts"
  • "characters"

Accounts object example:
Code:
{
"Hash":  "fPi/G3uPr7RYLmB8ig+D5U+4gb+RVkP7tZeVFxw2GkoSc1bZ3iK99YS71a/4mDHwgs8h/A+80MPCdDfKXRZbgA==" ,
"IsAdmin": true ,
"Pin": null ,
"Salt":  "." ,
"Username":  "inumedia" ,
"id":  "9b0ee470-21e4-4f45-96cd-3066951ab6d8"
}

Oh, right, thanks Fraysa for the help with the basic packet structures idgaf about.

0ChTh4a - [V32] Test Server with custom resolution client - RaGEZONE Forums
YcxkSZ1 - [V32] Test Server with custom resolution client - RaGEZONE Forums
hiZbjIq - [V32] Test Server with custom resolution client - RaGEZONE Forums
mMgP7hr - [V32] Test Server with custom resolution client - RaGEZONE Forums


Some game play videos:





Addresses I recorded while making these modifications:
  • 5EFE0B = Equip button position
  • 5EFE8D = Inventory button position
  • 5EFF0F = Ability Button Position
  • 5EFF91 = Skill Button Position
  • 5F0013 = Keyboard Layout Button Position
  • 5F0102 = Quick Slot Toggle Button Position
  • 5F94D8 = Quick Slot Button Position
  • 5F976C = Chat Dropdown Position
  • 5F976C = Chat text box position
  • 5F143A = Chat scrollbar position
  • 5F1514 = Chat history (closed) position
  • 5F9638 = Chat Close Button Position
  • 5F9638 = Chat Open Button
  • 5F2489 = Chat Scroll (onResize) position
  • 5F2414 = Chat (onResize)
  • 5F13C8 = Chat Position
  • 5B798A = Shortcut Menu Position
  • 5B71DF = Main Menu Position
  • 5F1489 = Mini Chat History Position
  • 5F3CDA = Level Number Position
  • 6040F3 = Tooltip Max X
  • 604106 = Tooltip Max Y
  • 5F3D5E = Job Name Y
  • 5F93BE = Quickslot Position
  • 5F3DEA = Character Name
  • 4DD5CA = Login Frame Position
  • 5F5729 = Character HP / MP / EXP Position
  • 5F5390 = EXP Bar Empty Rect Position
  • 5F4C56 = Bar Empty Rect Position
  • 5F44F9 = HP Bar Empty Rect Position
  • 5F09A1 = StatusBar backgrnd Y-Pos
  • 5F0b02 = Notification Icon
  • 5F0A8C = Notification Icon Holder
  • 5F0A13 = StatusBar "backgrnd2"
  • 5F56A5 = HP/MP/EXP bar gloss position
  • 5F58D5 = EXP Decimal Placement
  • 5EE2F0 = QuickSlot Position (onStart)
  • 5EFC09 = Cash Shop Button Position
  • 5EFCC9 = Menu Button Position
  • 5EFD89 = Shortcut button position
  • 5F3C7C = Clear Render Bounds
  • 5ED0B3 = Render Bounds
  • 5CF4B1 = Notification Position (Gained X)
  • 5CF609 = ^
  • 5F88FC = Bounds can click on NPC
  • 5F8CA1 = HP Flash Position
  • 67F26B = Snap to right side of window
  • 58FD0E = Buff Tooltip Position
  • 58FC2D = Buff Icon Position
  • 4A318B = Party Invitation

I've also included opcode definitions in the source, but I'll paste here too:
Code:
7 = Security Pin operation
8 (0x01) = Security Pin Assigned
12 = Name Check Answer
16 = Ping
17 ( 03 01 0A ) = Premium Cafe, 42 hrs, 41 min remaining
18 ( 03 01 0A ) = After the 17 ^, 10926 hrs, 59 min remaining
21 = Unlock UI
24 = MODIFY_INVENTORY_ITEM
26 = UPDATE_STATS
27 = Buff updates? ( Turned hidden )
28 = Cancel buffs? ( Turned un-hidden )
29 = Update Skill
30 = Unlock Client
31 = Fame Response
32 = Gain Item / EXP / Etc (SHOW_STATUS_INFO)
33 = Sending notes :D
35 = Lie detector response
36 = ( 'You have been reported by a user.' )
39 = Quest Complete???
41 = Request did not go through for unknown reasons. ????
44 = Character Info Popup
45 = Party
46 = Add Buddy Response
48 = Guild
50 = SERVERMESSAGE
51 = Gained an item (in chat) --- Pigmy Egg Results ( Lotto egg thing, like those philo books )
59 = Self loadout
63 = Error response for using portal
64 = Error response for changing channel / going into cash shop
66 = Multi chat (Buddy, Party, Guild)
67 = Whisper / Find / ???
68 = Literally just gives the user `You can't use it here on this map.` ???
69 = ENVIRONMENT_EFFECT
70 = MAP_EFFECT
71 = Obscure handle cash item usage???
72 = Possible GM Tool response
73 (03 01 0A) = Ox Quiz Questions
75 = CLOCK
76 = Crimson Balrog Boat Packet
77 = Boat Packet
81 = Blank pop up?
83 = Add Character
84 = Remove Character
86 = Chat ???
89 = Scroll effect :D
110 = Kick back to login screen o_o / Could not dependably repro, possibly depends on payload
112 = Damage ( All 00s = MISS )
113 = Face
116 = That weird little heart over remote character's heads. Can also update their appearance.
117 = Level up (Foreign effects, also Job Change)
118 = Buffs?
126 = Gain Item (In chat)
129 follow by (int) = `You have used the luck sack to receive (int) mesos`
130 = Fail to use luck sack

139 = Spawn Mob
140 = Kill Mob
156 = Spawn NPC
157 = Kill NPC

169 = Item Drop
170 = Drop Modify

173 = Kite flying???
182 = Opened a magic door (bishop skill) ??? ( (1|0) ## ## ## ## && %% ), # = ObjID, & = PosX, % = PosY
183 = Removed the opened magic door??? ( ## ## ## ## ), # = ObjID
202 = Open NPC Dialogue (NPC_TALK)
205 = Kick back to login with message *shrug*
    - Showed modal temp with self in it on right side
210 = Partially opened something with other char standing facing left, talking to NPC maybe?
219 = This is currently unavailable. Please try again later.
222 = Other Messenger?
223 = MESSENGER
224 = PLAYER_INTERACTION
225 = Store stuff?
234 = Kicked back to login with message 'This name can be used. If you wish to use this name, press ok.'
      -> 'An error occured while trying to '
      * Looks like 234 -> Duey??? (Based on IDA, text references to Duey things)

I also included a basic NPC Scripting auto compilation / Roslyn / on-the-fly setup.

Here's what a taxi script looks like:

Code:
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;

namespace Maple32.NPCScripting.NPCs
{
    public class NPC1022001 : NPCScript
    {
        public static List<Tuple<int, int>> costs = new List<Tuple<int, int>>()
        {
            new Tuple<int,int>(102000000, 1200),
            new Tuple<int,int>(101000000, 1200),
            new Tuple<int,int>(100000000, 800),
            new Tuple<int,int>(103000000, 1000)
        };
        public async override Task Start()
        {
            bool? next = (await SendNext("I can take you to various locations for just a small fee. Beginners will get a 90% discount on normal prices.")).YesNo;
            if (!(next ?? false)) return;

            StringBuilder destinations = new StringBuilder("Select your destination.#b");
            for (int i = 0; i < costs.Count; ++i) destinations.AppendFormat("\r\n#L{0}##m{1}# ({2} meso)#l", i, costs[i].Item1, costs[i].Item2);
            int? selection = (await SendSimple(destinations.ToString())).Selection;
            if (!selection.HasValue) return;

            int cost = costs[selection.Value].Item2;
            if (!GainMesos(-cost))
            {
                await SendOk("You do not have enough mesos.");
                return;
            }

            SendToMap(costs[selection.Value].Item1);
        }
    }
}

It definitely needs to be optimized as cold compiling takes upwards of 10-20 seconds and delays the initial map transition or login if the scripts haven't been compiled.

iirc there's also a memory leak by design where previously compiled NPC scripts actually won't get unloaded when they are recompiled later. See Maple32.Services.Game.Implementation.NPCs.cs for where NPCs are loaded but there is no dotnet support for unloading.

Also, the server is compiled with the dotnet runtime ( ) and can be run as like native-code on Linux and other supported OSes by default.

Shops are loaded from BMS NpcShop.img, which should be included in the source 7z.
 

Attachments

You must be registered for see attachments list
Last edited:
Junior Spellweaver
Joined
May 15, 2016
Messages
131
Reaction score
16
Wow !
Thank you , pqs work?

LOL, u cant read?

Server has basic functionality implemented, killing mobs, picking up items, leveling up, moving items around, etc. This is a very basic and early version of the server, there's still a ton more to work on but I've got other things to work on now so rip this dream. It's basically a hacked together server.
 
Back
Top