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
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Maple.Client.V95" Version="0.1.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Maple.Client.V95" Version="0.1.0" />
                    
Directory.Packages.props
<PackageReference Include="Maple.Client.V95" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Maple.Client.V95 --version 0.1.0
                    
#r "nuget: Maple.Client.V95, 0.1.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Maple.Client.V95@0.1.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Maple.Client.V95&version=0.1.0
                    
Install as a Cake Addin
#tool nuget:?package=Maple.Client.V95&version=0.1.0
                    
Install as a Cake Tool

Maple.Client.V95

.NET C# Windows Build Status codecov Nuget License

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

Package NuGet OS Description
Maple.Client.V95 Nuget cross-platform Struct definitions, singleton addresses, and field offset registry for GMS v95
Maple.Client.V95.Runtime Nuget Windows Attached-process singleton resolution, field reads, and login-flow state snapshots
Maple.Client.V95.Analysis Nuget Windows Snapshot-backed x86 function disassembly and control-flow analysis

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.md is auto-updated by the ReadMeTest_PublicApi test on every dotnet test run. Do not edit it manually.

Product 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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • 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