- 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
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 object example:
Oh, right, thanks Fraysa for the help with the basic packet structures idgaf about.
Some game play videos:
Addresses I recorded while making these modifications:
I've also included opcode definitions in the source, but I'll paste here too:
I also included a basic NPC Scripting auto compilation / Roslyn / on-the-fly setup.
Here's what a taxi script looks like:
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 (
Shops are loaded from BMS NpcShop.img, which should be included in the source 7z.
[SUB]only like 9 years late lmao[/SUB]
Clean-ish V32 download from 2009:
Part1:
You must be registered to see links
Part2:
You must be registered to see links
Part3:
You must be registered to see links
Part4:
You must be registered to see links
Part5:
You must be registered to see links
Custom res client, multiclient localhosts:
You must be registered to see links
C# Server:
You must be registered to see links
Custom WZ:
You must be registered to see links
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.
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 (
You must be registered to see links
) 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: