Maple.Client.V95
0.1.0
dotnet add package Maple.Client.V95 --version 0.1.0
NuGet\Install-Package Maple.Client.V95 -Version 0.1.0
<PackageReference Include="Maple.Client.V95" Version="0.1.0" />
<PackageVersion Include="Maple.Client.V95" Version="0.1.0" />
<PackageReference Include="Maple.Client.V95" />
paket add Maple.Client.V95 --version 0.1.0
#r "nuget: Maple.Client.V95, 0.1.0"
#:package Maple.Client.V95@0.1.0
#addin nuget:?package=Maple.Client.V95&version=0.1.0
#tool nuget:?package=Maple.Client.V95&version=0.1.0
Maple.Client.V95
GMS v95 client struct definitions, singleton addresses, field offsets, attached-process runtime access, and x86 function disassembly for Maple memory tooling.
⭐ Please star this project if you like it. ⭐
Example | Example Catalogue | Public API
Packages
All packages are trimmable and AOT/NativeAOT compatible.
Example
// Look up a known struct field by name — returns the byte offset within the struct.
bool found = ClientStructs.Registry.TryGetField("CWvsContext", "WorldId", out StructField worldId);
Debug.Assert(found);
Debug.Assert(worldId.Offset == ClientStructs.Offsets.CWvsContext.WorldId);
// Walk all known struct names in the registry.
foreach (string structName in ClientStructs.Registry.StructNames)
Debug.Assert(structName.Length > 0);
// Look up a static address constant.
uint loginPtr = ClientStructs.Addresses.CWvsContextSingletonPtr;
Debug.Assert(loginPtr != 0);
For more examples see Example Catalogue.
Example Catalogue
The following examples are available in ReadMeTest.cs.
Example - Struct registry and offsets
// Iterate all fields registered for one struct.
IReadOnlyDictionary<string, StructField> loginFields = ClientStructs.Registry.GetFields("CLogin");
foreach ((string name, StructField field) in loginFields)
Console.WriteLine($"CLogin.{name} @ +0x{field.Offset:X}");
// Look up a single field — offset matches the typed constant.
ClientStructs.Registry.TryGetField("CLogin", "LoginStep", out StructField step);
Debug.Assert(step.Offset == ClientStructs.Offsets.CLogin.LoginStep);
// The singleton map enumerates all pointer-table addresses with their names.
foreach ((uint addr, string name) in ClientStructs.Singletons)
Console.WriteLine($"0x{addr:X8} → {name}");
Example - Runtime singleton resolution
// Skip when not attached to a live MapleStory process.
if (!ProcessHandle.TryAttach("MapleStory", out ProcessHandle? handle))
return;
using ProcessHandle process = handle!;
using WindowsProcessMemory memory = WindowsProcessMemory.Open(process);
using var accessor = new MemoryAccessor(memory);
var singletons = new SingletonResolver(accessor);
// Resolve CWvsContext by name — returns false when the client is not running.
if (!singletons.TryResolve("CWvsContext", out ResolvedSingleton ctx))
return;
Console.WriteLine($"{ctx.Name}: instance @ 0x{ctx.InstanceAddress:X8}");
// Resolve the full login-flow state when the client is in the login screen.
var resolver = new LoginStateResolver(accessor);
if (!resolver.TryResolve(out ResolvedLoginState state))
return;
Console.WriteLine($"LoginStep={state.Step} World={state.ContextWorldId} Channel={state.ContextChannelId}");
Example - Analysis disassembly
// Skip when not attached to a live MapleStory process.
if (!ProcessHandle.TryAttach("MapleStory", out ProcessHandle? handle))
return;
using ProcessHandle process = handle!;
using WindowsProcessMemory memory = WindowsProcessMemory.Open(process);
using var accessor = new MemoryAccessor(memory);
// Capture the main module image into managed memory — one stable snapshot for all analysis.
ProcessPeImageSnapshot snapshot = ProcessPeImageSnapshot.CaptureMainModule(process, accessor);
// Disassemble one known function from the snapshot.
var analyzer = new RuntimeFunctionAnalyzer(snapshot);
FunctionDisassembly disassembly = analyzer.Disassemble(ClientStructs.Addresses.SendLoginPacketFunc);
foreach (FunctionInstruction instr in disassembly.Instructions)
Console.WriteLine(instr);
Public API Reference
See docs/PublicApi.md for the complete auto-generated public API reference.
Note:
docs/PublicApi.mdis auto-updated by theReadMeTest_PublicApitest on everydotnet testrun. Do not edit it manually.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- No dependencies.
NuGet packages (2)
Showing the top 2 NuGet packages that depend on Maple.Client.V95:
| Package | Downloads |
|---|---|
|
Maple.StringPool
Zero-allocation decoder for the MapleStory GMS v95 StringPool singleton. Cross-platform, trimmable and AOT/NativeAOT compatible. |
|
|
Maple.Client.V95.Runtime
Attached-process runtime helpers for MapleStory GMS v95 client memory access, singleton resolution, and guarded login-flow interaction. Windows-only, trimmable and AOT/NativeAOT compatible. |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 0.1.0 | 98 | 3/30/2026 |