Packet Resolver

Ângelo Tadeucci edited this page Feb 17, 2026 · 3 revisions

How to use the packet resolver

This only works for packets which are sent from the server to the client.

Things you need first

A working Maple2. Setup guide here

Understanding how packets work. Tutorial here

How to use

First connect to your server.

Find the OP Code you want to resolve in SendOp.cs (Maple2.Server.Core\Constants\SendOp.cs).

In your chat type the following command: /debug resolve (opcode), it accepts the values in these formats: 81, 0081, 0x81, 0x0081

Now the resolver will send a packet to the client with the selected opcode, if the client reports that there was an error with the packet, the resolver will read the error and use the given hint from the error logger.

The errors from the client look something like this: ["sock_exception"] "BCNetworkService::ProcessPacket [type=170][offset=13][hint=Decode4]"

The resolver now will use that hint and add an INT (Since the hint is "Decode4") to the end of the packet and send it again until the client doesn't give any more errors.

The structure will be saved to an text file in /PacketStructures, they will have the opcode and the name for easy finding.

With the structure saved in the text file, you can change the values of each function to change the behavior of the packet. Packets normally have multiple headers, so you can change the part in which defines the header and delete the rest, then the resolver will continue from the last part.

Example

UserEnv 0x00AA has a bunch of different headers. On the first use it'll just send zeros so nothing major happened. This is the result:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.UserEnv);pWriter.WriteByte();pWriter.WriteInt();

Lets try to decode with header 8, so we will change the structure to:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.UserEnv);pWriter.WriteByte(8);

Now the resolver will run and the result is this:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.UserEnv);pWriter.WriteByte(8);pWriter.WriteInt();pWriter.WriteInt();

Since this has already been decoded, we know that the first int is a loop count. So we can change the value of it and see how the loop structure looks like.

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.UserEnv);pWriter.WriteByte(8);pWriter.WriteInt(2);// loop count

And this is the result:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.UserEnv);pWriter.WriteByte(8);pWriter.WriteInt(2);// loop countpWriter.WriteInt();// 1pWriter.WriteInt();// 1pWriter.WriteInt();// 2pWriter.WriteInt();// 2pWriter.WriteInt();

Now we can see that the mode 8 of the packet 0x00AA has structure like this:

Short - OPCODE
Byte - Header/Mode
Int - Loop counter
Int - Some value
Int - Some value
Int - Some value

Using the packet resolver on the packet from the Understanding packet tutorial, we can finally find the correct structure and it looks like this:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.ResponseCube);pWriter.WriteByte(20);pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteUnicodeString();pWriter.WriteLong();pWriter.WriteLong();pWriter.WriteByte();

Branches

Some packets have branches. It can be an simple boolean (true/false) or maybe if the item uid is in the character inventory.

Branches with booleans

For example the packet Ugc 0x006D mode 7, this is the structure:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.Ugc);pWriter.WriteByte(7);pWriter.WriteLong();pWriter.WriteByte();

Changing the last byte to one, this is the difference:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.UGC);pWriter.WriteByte(7);pWriter.WriteLong();pWriter.WriteByte(1);pWriter.WriteByte();pWriter.WriteInt();pWriter.WriteLong();pWriter.WriteLong();pWriter.WriteUnicodeString();pWriter.WriteUnicodeString();pWriter.WriteLong();pWriter.WriteUnicodeString();pWriter.WriteByte();pWriter.WriteByte();pWriter.WriteLong();pWriter.WriteByte();pWriter.WriteUnicodeString();

Branches with another values

Sometimes if there is a loop inside the structure it'll need a value different from zero, but what about item UID?

For example the packet ItemPutOn 0x0025, this is the structure (Maple2.Server.Game\Packets\EquipPacket.cs):

ByteWriterpWriter=Packet.Of(SendOp.ItemPutOn);pWriter.WriteInt(player.ObjectId);pWriter.WriteInt(item.Id);pWriter.WriteLong(item.Uid);pWriter.WriteUnicodeString(item.EquipSlot().ToString());pWriter.WriteInt(item.Rarity);pWriter.WriteByte(type);pWriter.WriteClass<Item>(item);

Lets see how the structure looks using the resolver:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.ItemPutOn);pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteLong();pWriter.WriteUnicodeString();pWriter.WriteInt();pWriter.WriteByte();

It's almost the same but it's missing everything from the WriteClass function! The client didn't return an error because it couldn't find the item UID we sent with the resolver (It's always zero), let's change the structure to have some correct values and try again:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.ItemPutOn);pWriter.WriteInt(10000126);// character object idpWriter.WriteInt(12060107);// item idpWriter.WriteLong(39);// item uidpWriter.WriteUnicodeString("RI");// equip slotpWriter.WriteInt(4);// item raritypWriter.WriteByte();

And here is the result from the resolver:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.ItemPutOn);pWriter.WriteInt(10000126);pWriter.WriteInt(12060107);pWriter.WriteLong(39);pWriter.WriteUnicodeString("RI");pWriter.WriteInt(4);pWriter.WriteByte();pWriter.WriteInt();// Write item starts here!pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteLong();pWriter.WriteLong();pWriter.WriteLong();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteByte();pWriter.WriteLong();pWriter.WriteShort();pWriter.WriteByte();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteByte();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteByte();pWriter.WriteLong();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteByte();pWriter.WriteInt();pWriter.WriteByte();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteByte();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteByte();pWriter.WriteByte();pWriter.WriteByte();pWriter.WriteByte();pWriter.WriteByte();pWriter.WriteLong();pWriter.WriteLong();pWriter.WriteUnicodeString();

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Packet Resolver

Ângelo Tadeucci edited this page Feb 17, 2026 · 3 revisions

How to use the packet resolver

This only works for packets which are sent from the server to the client.

Things you need first

A working Maple2. Setup guide here

Understanding how packets work. Tutorial here

How to use

First connect to your server.

Find the OP Code you want to resolve in SendOp.cs (Maple2.Server.Core\Constants\SendOp.cs).

In your chat type the following command: /debug resolve (opcode), it accepts the values in these formats: 81, 0081, 0x81, 0x0081

Now the resolver will send a packet to the client with the selected opcode, if the client reports that there was an error with the packet, the resolver will read the error and use the given hint from the error logger.

The errors from the client look something like this: ["sock_exception"] "BCNetworkService::ProcessPacket [type=170][offset=13][hint=Decode4]"

The resolver now will use that hint and add an INT (Since the hint is "Decode4") to the end of the packet and send it again until the client doesn't give any more errors.

The structure will be saved to an text file in /PacketStructures, they will have the opcode and the name for easy finding.

With the structure saved in the text file, you can change the values of each function to change the behavior of the packet. Packets normally have multiple headers, so you can change the part in which defines the header and delete the rest, then the resolver will continue from the last part.

Example

UserEnv 0x00AA has a bunch of different headers. On the first use it'll just send zeros so nothing major happened. This is the result:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.UserEnv);pWriter.WriteByte();pWriter.WriteInt();

Lets try to decode with header 8, so we will change the structure to:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.UserEnv);pWriter.WriteByte(8);

Now the resolver will run and the result is this:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.UserEnv);pWriter.WriteByte(8);pWriter.WriteInt();pWriter.WriteInt();

Since this has already been decoded, we know that the first int is a loop count. So we can change the value of it and see how the loop structure looks like.

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.UserEnv);pWriter.WriteByte(8);pWriter.WriteInt(2);// loop count

And this is the result:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.UserEnv);pWriter.WriteByte(8);pWriter.WriteInt(2);// loop countpWriter.WriteInt();// 1pWriter.WriteInt();// 1pWriter.WriteInt();// 2pWriter.WriteInt();// 2pWriter.WriteInt();

Now we can see that the mode 8 of the packet 0x00AA has structure like this:

Short - OPCODE
Byte - Header/Mode
Int - Loop counter
Int - Some value
Int - Some value
Int - Some value

Using the packet resolver on the packet from the Understanding packet tutorial, we can finally find the correct structure and it looks like this:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.ResponseCube);pWriter.WriteByte(20);pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteUnicodeString();pWriter.WriteLong();pWriter.WriteLong();pWriter.WriteByte();

Branches

Some packets have branches. It can be an simple boolean (true/false) or maybe if the item uid is in the character inventory.

Branches with booleans

For example the packet Ugc 0x006D mode 7, this is the structure:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.Ugc);pWriter.WriteByte(7);pWriter.WriteLong();pWriter.WriteByte();

Changing the last byte to one, this is the difference:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.UGC);pWriter.WriteByte(7);pWriter.WriteLong();pWriter.WriteByte(1);pWriter.WriteByte();pWriter.WriteInt();pWriter.WriteLong();pWriter.WriteLong();pWriter.WriteUnicodeString();pWriter.WriteUnicodeString();pWriter.WriteLong();pWriter.WriteUnicodeString();pWriter.WriteByte();pWriter.WriteByte();pWriter.WriteLong();pWriter.WriteByte();pWriter.WriteUnicodeString();

Branches with another values

Sometimes if there is a loop inside the structure it'll need a value different from zero, but what about item UID?

For example the packet ItemPutOn 0x0025, this is the structure (Maple2.Server.Game\Packets\EquipPacket.cs):

ByteWriterpWriter=Packet.Of(SendOp.ItemPutOn);pWriter.WriteInt(player.ObjectId);pWriter.WriteInt(item.Id);pWriter.WriteLong(item.Uid);pWriter.WriteUnicodeString(item.EquipSlot().ToString());pWriter.WriteInt(item.Rarity);pWriter.WriteByte(type);pWriter.WriteClass<Item>(item);

Lets see how the structure looks using the resolver:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.ItemPutOn);pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteLong();pWriter.WriteUnicodeString();pWriter.WriteInt();pWriter.WriteByte();

It's almost the same but it's missing everything from the WriteClass function! The client didn't return an error because it couldn't find the item UID we sent with the resolver (It's always zero), let's change the structure to have some correct values and try again:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.ItemPutOn);pWriter.WriteInt(10000126);// character object idpWriter.WriteInt(12060107);// item idpWriter.WriteLong(39);// item uidpWriter.WriteUnicodeString("RI");// equip slotpWriter.WriteInt(4);// item raritypWriter.WriteByte();

And here is the result from the resolver:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.ItemPutOn);pWriter.WriteInt(10000126);pWriter.WriteInt(12060107);pWriter.WriteLong(39);pWriter.WriteUnicodeString("RI");pWriter.WriteInt(4);pWriter.WriteByte();pWriter.WriteInt();// Write item starts here!pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteLong();pWriter.WriteLong();pWriter.WriteLong();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteByte();pWriter.WriteLong();pWriter.WriteShort();pWriter.WriteByte();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteByte();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteByte();pWriter.WriteLong();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteByte();pWriter.WriteInt();pWriter.WriteByte();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteByte();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteByte();pWriter.WriteByte();pWriter.WriteByte();pWriter.WriteByte();pWriter.WriteByte();pWriter.WriteLong();pWriter.WriteLong();pWriter.WriteUnicodeString();

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Packet Resolver

Ângelo Tadeucci edited this page Feb 17, 2026 · 3 revisions

How to use the packet resolver

This only works for packets which are sent from the server to the client.

Things you need first

A working Maple2. Setup guide here

Understanding how packets work. Tutorial here

How to use

First connect to your server.

Find the OP Code you want to resolve in SendOp.cs (Maple2.Server.Core\Constants\SendOp.cs).

In your chat type the following command: /debug resolve (opcode), it accepts the values in these formats: 81, 0081, 0x81, 0x0081

Now the resolver will send a packet to the client with the selected opcode, if the client reports that there was an error with the packet, the resolver will read the error and use the given hint from the error logger.

The errors from the client look something like this: ["sock_exception"] "BCNetworkService::ProcessPacket [type=170][offset=13][hint=Decode4]"

The resolver now will use that hint and add an INT (Since the hint is "Decode4") to the end of the packet and send it again until the client doesn't give any more errors.

The structure will be saved to an text file in /PacketStructures, they will have the opcode and the name for easy finding.

With the structure saved in the text file, you can change the values of each function to change the behavior of the packet. Packets normally have multiple headers, so you can change the part in which defines the header and delete the rest, then the resolver will continue from the last part.

Example

UserEnv 0x00AA has a bunch of different headers. On the first use it'll just send zeros so nothing major happened. This is the result:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.UserEnv);pWriter.WriteByte();pWriter.WriteInt();

Lets try to decode with header 8, so we will change the structure to:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.UserEnv);pWriter.WriteByte(8);

Now the resolver will run and the result is this:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.UserEnv);pWriter.WriteByte(8);pWriter.WriteInt();pWriter.WriteInt();

Since this has already been decoded, we know that the first int is a loop count. So we can change the value of it and see how the loop structure looks like.

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.UserEnv);pWriter.WriteByte(8);pWriter.WriteInt(2);// loop count

And this is the result:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.UserEnv);pWriter.WriteByte(8);pWriter.WriteInt(2);// loop countpWriter.WriteInt();// 1pWriter.WriteInt();// 1pWriter.WriteInt();// 2pWriter.WriteInt();// 2pWriter.WriteInt();

Now we can see that the mode 8 of the packet 0x00AA has structure like this:

Short - OPCODE
Byte - Header/Mode
Int - Loop counter
Int - Some value
Int - Some value
Int - Some value

Using the packet resolver on the packet from the Understanding packet tutorial, we can finally find the correct structure and it looks like this:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.ResponseCube);pWriter.WriteByte(20);pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteUnicodeString();pWriter.WriteLong();pWriter.WriteLong();pWriter.WriteByte();

Branches

Some packets have branches. It can be an simple boolean (true/false) or maybe if the item uid is in the character inventory.

Branches with booleans

For example the packet Ugc 0x006D mode 7, this is the structure:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.Ugc);pWriter.WriteByte(7);pWriter.WriteLong();pWriter.WriteByte();

Changing the last byte to one, this is the difference:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.UGC);pWriter.WriteByte(7);pWriter.WriteLong();pWriter.WriteByte(1);pWriter.WriteByte();pWriter.WriteInt();pWriter.WriteLong();pWriter.WriteLong();pWriter.WriteUnicodeString();pWriter.WriteUnicodeString();pWriter.WriteLong();pWriter.WriteUnicodeString();pWriter.WriteByte();pWriter.WriteByte();pWriter.WriteLong();pWriter.WriteByte();pWriter.WriteUnicodeString();

Branches with another values

Sometimes if there is a loop inside the structure it'll need a value different from zero, but what about item UID?

For example the packet ItemPutOn 0x0025, this is the structure (Maple2.Server.Game\Packets\EquipPacket.cs):

ByteWriterpWriter=Packet.Of(SendOp.ItemPutOn);pWriter.WriteInt(player.ObjectId);pWriter.WriteInt(item.Id);pWriter.WriteLong(item.Uid);pWriter.WriteUnicodeString(item.EquipSlot().ToString());pWriter.WriteInt(item.Rarity);pWriter.WriteByte(type);pWriter.WriteClass<Item>(item);

Lets see how the structure looks using the resolver:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.ItemPutOn);pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteLong();pWriter.WriteUnicodeString();pWriter.WriteInt();pWriter.WriteByte();

It's almost the same but it's missing everything from the WriteClass function! The client didn't return an error because it couldn't find the item UID we sent with the resolver (It's always zero), let's change the structure to have some correct values and try again:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.ItemPutOn);pWriter.WriteInt(10000126);// character object idpWriter.WriteInt(12060107);// item idpWriter.WriteLong(39);// item uidpWriter.WriteUnicodeString("RI");// equip slotpWriter.WriteInt(4);// item raritypWriter.WriteByte();

And here is the result from the resolver:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.ItemPutOn);pWriter.WriteInt(10000126);pWriter.WriteInt(12060107);pWriter.WriteLong(39);pWriter.WriteUnicodeString("RI");pWriter.WriteInt(4);pWriter.WriteByte();pWriter.WriteInt();// Write item starts here!pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteLong();pWriter.WriteLong();pWriter.WriteLong();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteByte();pWriter.WriteLong();pWriter.WriteShort();pWriter.WriteByte();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteByte();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteByte();pWriter.WriteLong();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteByte();pWriter.WriteInt();pWriter.WriteByte();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteByte();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteByte();pWriter.WriteByte();pWriter.WriteByte();pWriter.WriteByte();pWriter.WriteByte();pWriter.WriteLong();pWriter.WriteLong();pWriter.WriteUnicodeString();

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Packet Resolver

Ângelo Tadeucci edited this page Feb 17, 2026 · 3 revisions

How to use the packet resolver

This only works for packets which are sent from the server to the client.

Things you need first

A working Maple2. Setup guide here

Understanding how packets work. Tutorial here

How to use

First connect to your server.

Find the OP Code you want to resolve in SendOp.cs (Maple2.Server.Core\Constants\SendOp.cs).

In your chat type the following command: /debug resolve (opcode), it accepts the values in these formats: 81, 0081, 0x81, 0x0081

Now the resolver will send a packet to the client with the selected opcode, if the client reports that there was an error with the packet, the resolver will read the error and use the given hint from the error logger.

The errors from the client look something like this: ["sock_exception"] "BCNetworkService::ProcessPacket [type=170][offset=13][hint=Decode4]"

The resolver now will use that hint and add an INT (Since the hint is "Decode4") to the end of the packet and send it again until the client doesn't give any more errors.

The structure will be saved to an text file in /PacketStructures, they will have the opcode and the name for easy finding.

With the structure saved in the text file, you can change the values of each function to change the behavior of the packet. Packets normally have multiple headers, so you can change the part in which defines the header and delete the rest, then the resolver will continue from the last part.

Example

UserEnv 0x00AA has a bunch of different headers. On the first use it'll just send zeros so nothing major happened. This is the result:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.UserEnv);pWriter.WriteByte();pWriter.WriteInt();

Lets try to decode with header 8, so we will change the structure to:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.UserEnv);pWriter.WriteByte(8);

Now the resolver will run and the result is this:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.UserEnv);pWriter.WriteByte(8);pWriter.WriteInt();pWriter.WriteInt();

Since this has already been decoded, we know that the first int is a loop count. So we can change the value of it and see how the loop structure looks like.

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.UserEnv);pWriter.WriteByte(8);pWriter.WriteInt(2);// loop count

And this is the result:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.UserEnv);pWriter.WriteByte(8);pWriter.WriteInt(2);// loop countpWriter.WriteInt();// 1pWriter.WriteInt();// 1pWriter.WriteInt();// 2pWriter.WriteInt();// 2pWriter.WriteInt();

Now we can see that the mode 8 of the packet 0x00AA has structure like this:

Short - OPCODE
Byte - Header/Mode
Int - Loop counter
Int - Some value
Int - Some value
Int - Some value

Using the packet resolver on the packet from the Understanding packet tutorial, we can finally find the correct structure and it looks like this:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.ResponseCube);pWriter.WriteByte(20);pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteUnicodeString();pWriter.WriteLong();pWriter.WriteLong();pWriter.WriteByte();

Branches

Some packets have branches. It can be an simple boolean (true/false) or maybe if the item uid is in the character inventory.

Branches with booleans

For example the packet Ugc 0x006D mode 7, this is the structure:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.Ugc);pWriter.WriteByte(7);pWriter.WriteLong();pWriter.WriteByte();

Changing the last byte to one, this is the difference:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.UGC);pWriter.WriteByte(7);pWriter.WriteLong();pWriter.WriteByte(1);pWriter.WriteByte();pWriter.WriteInt();pWriter.WriteLong();pWriter.WriteLong();pWriter.WriteUnicodeString();pWriter.WriteUnicodeString();pWriter.WriteLong();pWriter.WriteUnicodeString();pWriter.WriteByte();pWriter.WriteByte();pWriter.WriteLong();pWriter.WriteByte();pWriter.WriteUnicodeString();

Branches with another values

Sometimes if there is a loop inside the structure it'll need a value different from zero, but what about item UID?

For example the packet ItemPutOn 0x0025, this is the structure (Maple2.Server.Game\Packets\EquipPacket.cs):

ByteWriterpWriter=Packet.Of(SendOp.ItemPutOn);pWriter.WriteInt(player.ObjectId);pWriter.WriteInt(item.Id);pWriter.WriteLong(item.Uid);pWriter.WriteUnicodeString(item.EquipSlot().ToString());pWriter.WriteInt(item.Rarity);pWriter.WriteByte(type);pWriter.WriteClass<Item>(item);

Lets see how the structure looks using the resolver:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.ItemPutOn);pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteLong();pWriter.WriteUnicodeString();pWriter.WriteInt();pWriter.WriteByte();

It's almost the same but it's missing everything from the WriteClass function! The client didn't return an error because it couldn't find the item UID we sent with the resolver (It's always zero), let's change the structure to have some correct values and try again:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.ItemPutOn);pWriter.WriteInt(10000126);// character object idpWriter.WriteInt(12060107);// item idpWriter.WriteLong(39);// item uidpWriter.WriteUnicodeString("RI");// equip slotpWriter.WriteInt(4);// item raritypWriter.WriteByte();

And here is the result from the resolver:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.ItemPutOn);pWriter.WriteInt(10000126);pWriter.WriteInt(12060107);pWriter.WriteLong(39);pWriter.WriteUnicodeString("RI");pWriter.WriteInt(4);pWriter.WriteByte();pWriter.WriteInt();// Write item starts here!pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteLong();pWriter.WriteLong();pWriter.WriteLong();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteByte();pWriter.WriteLong();pWriter.WriteShort();pWriter.WriteByte();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteByte();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteByte();pWriter.WriteLong();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteByte();pWriter.WriteInt();pWriter.WriteByte();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteByte();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteByte();pWriter.WriteByte();pWriter.WriteByte();pWriter.WriteByte();pWriter.WriteByte();pWriter.WriteLong();pWriter.WriteLong();pWriter.WriteUnicodeString();

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Packet Resolver

Ângelo Tadeucci edited this page Feb 17, 2026 · 3 revisions

How to use the packet resolver

This only works for packets which are sent from the server to the client.

Things you need first

A working Maple2. Setup guide here

Understanding how packets work. Tutorial here

How to use

First connect to your server.

Find the OP Code you want to resolve in SendOp.cs (Maple2.Server.Core\Constants\SendOp.cs).

In your chat type the following command: /debug resolve (opcode), it accepts the values in these formats: 81, 0081, 0x81, 0x0081

Now the resolver will send a packet to the client with the selected opcode, if the client reports that there was an error with the packet, the resolver will read the error and use the given hint from the error logger.

The errors from the client look something like this: ["sock_exception"] "BCNetworkService::ProcessPacket [type=170][offset=13][hint=Decode4]"

The resolver now will use that hint and add an INT (Since the hint is "Decode4") to the end of the packet and send it again until the client doesn't give any more errors.

The structure will be saved to an text file in /PacketStructures, they will have the opcode and the name for easy finding.

With the structure saved in the text file, you can change the values of each function to change the behavior of the packet. Packets normally have multiple headers, so you can change the part in which defines the header and delete the rest, then the resolver will continue from the last part.

Example

UserEnv 0x00AA has a bunch of different headers. On the first use it'll just send zeros so nothing major happened. This is the result:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.UserEnv);pWriter.WriteByte();pWriter.WriteInt();

Lets try to decode with header 8, so we will change the structure to:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.UserEnv);pWriter.WriteByte(8);

Now the resolver will run and the result is this:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.UserEnv);pWriter.WriteByte(8);pWriter.WriteInt();pWriter.WriteInt();

Since this has already been decoded, we know that the first int is a loop count. So we can change the value of it and see how the loop structure looks like.

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.UserEnv);pWriter.WriteByte(8);pWriter.WriteInt(2);// loop count

And this is the result:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.UserEnv);pWriter.WriteByte(8);pWriter.WriteInt(2);// loop countpWriter.WriteInt();// 1pWriter.WriteInt();// 1pWriter.WriteInt();// 2pWriter.WriteInt();// 2pWriter.WriteInt();

Now we can see that the mode 8 of the packet 0x00AA has structure like this:

Short - OPCODE
Byte - Header/Mode
Int - Loop counter
Int - Some value
Int - Some value
Int - Some value

Using the packet resolver on the packet from the Understanding packet tutorial, we can finally find the correct structure and it looks like this:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.ResponseCube);pWriter.WriteByte(20);pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteUnicodeString();pWriter.WriteLong();pWriter.WriteLong();pWriter.WriteByte();

Branches

Some packets have branches. It can be an simple boolean (true/false) or maybe if the item uid is in the character inventory.

Branches with booleans

For example the packet Ugc 0x006D mode 7, this is the structure:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.Ugc);pWriter.WriteByte(7);pWriter.WriteLong();pWriter.WriteByte();

Changing the last byte to one, this is the difference:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.UGC);pWriter.WriteByte(7);pWriter.WriteLong();pWriter.WriteByte(1);pWriter.WriteByte();pWriter.WriteInt();pWriter.WriteLong();pWriter.WriteLong();pWriter.WriteUnicodeString();pWriter.WriteUnicodeString();pWriter.WriteLong();pWriter.WriteUnicodeString();pWriter.WriteByte();pWriter.WriteByte();pWriter.WriteLong();pWriter.WriteByte();pWriter.WriteUnicodeString();

Branches with another values

Sometimes if there is a loop inside the structure it'll need a value different from zero, but what about item UID?

For example the packet ItemPutOn 0x0025, this is the structure (Maple2.Server.Game\Packets\EquipPacket.cs):

ByteWriterpWriter=Packet.Of(SendOp.ItemPutOn);pWriter.WriteInt(player.ObjectId);pWriter.WriteInt(item.Id);pWriter.WriteLong(item.Uid);pWriter.WriteUnicodeString(item.EquipSlot().ToString());pWriter.WriteInt(item.Rarity);pWriter.WriteByte(type);pWriter.WriteClass<Item>(item);

Lets see how the structure looks using the resolver:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.ItemPutOn);pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteLong();pWriter.WriteUnicodeString();pWriter.WriteInt();pWriter.WriteByte();

It's almost the same but it's missing everything from the WriteClass function! The client didn't return an error because it couldn't find the item UID we sent with the resolver (It's always zero), let's change the structure to have some correct values and try again:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.ItemPutOn);pWriter.WriteInt(10000126);// character object idpWriter.WriteInt(12060107);// item idpWriter.WriteLong(39);// item uidpWriter.WriteUnicodeString("RI");// equip slotpWriter.WriteInt(4);// item raritypWriter.WriteByte();

And here is the result from the resolver:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.ItemPutOn);pWriter.WriteInt(10000126);pWriter.WriteInt(12060107);pWriter.WriteLong(39);pWriter.WriteUnicodeString("RI");pWriter.WriteInt(4);pWriter.WriteByte();pWriter.WriteInt();// Write item starts here!pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteLong();pWriter.WriteLong();pWriter.WriteLong();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteByte();pWriter.WriteLong();pWriter.WriteShort();pWriter.WriteByte();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteByte();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteByte();pWriter.WriteLong();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteByte();pWriter.WriteInt();pWriter.WriteByte();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteByte();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteByte();pWriter.WriteByte();pWriter.WriteByte();pWriter.WriteByte();pWriter.WriteByte();pWriter.WriteLong();pWriter.WriteLong();pWriter.WriteUnicodeString();

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Packet Resolver

Ângelo Tadeucci edited this page Feb 17, 2026 · 3 revisions

How to use the packet resolver

This only works for packets which are sent from the server to the client.

Things you need first

A working Maple2. Setup guide here

Understanding how packets work. Tutorial here

How to use

First connect to your server.

Find the OP Code you want to resolve in SendOp.cs (Maple2.Server.Core\Constants\SendOp.cs).

In your chat type the following command: /debug resolve (opcode), it accepts the values in these formats: 81, 0081, 0x81, 0x0081

Now the resolver will send a packet to the client with the selected opcode, if the client reports that there was an error with the packet, the resolver will read the error and use the given hint from the error logger.

The errors from the client look something like this: ["sock_exception"] "BCNetworkService::ProcessPacket [type=170][offset=13][hint=Decode4]"

The resolver now will use that hint and add an INT (Since the hint is "Decode4") to the end of the packet and send it again until the client doesn't give any more errors.

The structure will be saved to an text file in /PacketStructures, they will have the opcode and the name for easy finding.

With the structure saved in the text file, you can change the values of each function to change the behavior of the packet. Packets normally have multiple headers, so you can change the part in which defines the header and delete the rest, then the resolver will continue from the last part.

Example

UserEnv 0x00AA has a bunch of different headers. On the first use it'll just send zeros so nothing major happened. This is the result:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.UserEnv);pWriter.WriteByte();pWriter.WriteInt();

Lets try to decode with header 8, so we will change the structure to:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.UserEnv);pWriter.WriteByte(8);

Now the resolver will run and the result is this:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.UserEnv);pWriter.WriteByte(8);pWriter.WriteInt();pWriter.WriteInt();

Since this has already been decoded, we know that the first int is a loop count. So we can change the value of it and see how the loop structure looks like.

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.UserEnv);pWriter.WriteByte(8);pWriter.WriteInt(2);// loop count

And this is the result:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.UserEnv);pWriter.WriteByte(8);pWriter.WriteInt(2);// loop countpWriter.WriteInt();// 1pWriter.WriteInt();// 1pWriter.WriteInt();// 2pWriter.WriteInt();// 2pWriter.WriteInt();

Now we can see that the mode 8 of the packet 0x00AA has structure like this:

Short - OPCODE
Byte - Header/Mode
Int - Loop counter
Int - Some value
Int - Some value
Int - Some value

Using the packet resolver on the packet from the Understanding packet tutorial, we can finally find the correct structure and it looks like this:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.ResponseCube);pWriter.WriteByte(20);pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteUnicodeString();pWriter.WriteLong();pWriter.WriteLong();pWriter.WriteByte();

Branches

Some packets have branches. It can be an simple boolean (true/false) or maybe if the item uid is in the character inventory.

Branches with booleans

For example the packet Ugc 0x006D mode 7, this is the structure:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.Ugc);pWriter.WriteByte(7);pWriter.WriteLong();pWriter.WriteByte();

Changing the last byte to one, this is the difference:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.UGC);pWriter.WriteByte(7);pWriter.WriteLong();pWriter.WriteByte(1);pWriter.WriteByte();pWriter.WriteInt();pWriter.WriteLong();pWriter.WriteLong();pWriter.WriteUnicodeString();pWriter.WriteUnicodeString();pWriter.WriteLong();pWriter.WriteUnicodeString();pWriter.WriteByte();pWriter.WriteByte();pWriter.WriteLong();pWriter.WriteByte();pWriter.WriteUnicodeString();

Branches with another values

Sometimes if there is a loop inside the structure it'll need a value different from zero, but what about item UID?

For example the packet ItemPutOn 0x0025, this is the structure (Maple2.Server.Game\Packets\EquipPacket.cs):

ByteWriterpWriter=Packet.Of(SendOp.ItemPutOn);pWriter.WriteInt(player.ObjectId);pWriter.WriteInt(item.Id);pWriter.WriteLong(item.Uid);pWriter.WriteUnicodeString(item.EquipSlot().ToString());pWriter.WriteInt(item.Rarity);pWriter.WriteByte(type);pWriter.WriteClass<Item>(item);

Lets see how the structure looks using the resolver:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.ItemPutOn);pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteLong();pWriter.WriteUnicodeString();pWriter.WriteInt();pWriter.WriteByte();

It's almost the same but it's missing everything from the WriteClass function! The client didn't return an error because it couldn't find the item UID we sent with the resolver (It's always zero), let's change the structure to have some correct values and try again:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.ItemPutOn);pWriter.WriteInt(10000126);// character object idpWriter.WriteInt(12060107);// item idpWriter.WriteLong(39);// item uidpWriter.WriteUnicodeString("RI");// equip slotpWriter.WriteInt(4);// item raritypWriter.WriteByte();

And here is the result from the resolver:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.ItemPutOn);pWriter.WriteInt(10000126);pWriter.WriteInt(12060107);pWriter.WriteLong(39);pWriter.WriteUnicodeString("RI");pWriter.WriteInt(4);pWriter.WriteByte();pWriter.WriteInt();// Write item starts here!pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteLong();pWriter.WriteLong();pWriter.WriteLong();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteByte();pWriter.WriteLong();pWriter.WriteShort();pWriter.WriteByte();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteByte();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteByte();pWriter.WriteLong();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteByte();pWriter.WriteInt();pWriter.WriteByte();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteByte();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteByte();pWriter.WriteByte();pWriter.WriteByte();pWriter.WriteByte();pWriter.WriteByte();pWriter.WriteLong();pWriter.WriteLong();pWriter.WriteUnicodeString();

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Packet Resolver

Ângelo Tadeucci edited this page Feb 17, 2026 · 3 revisions

How to use the packet resolver

This only works for packets which are sent from the server to the client.

Things you need first

A working Maple2. Setup guide here

Understanding how packets work. Tutorial here

How to use

First connect to your server.

Find the OP Code you want to resolve in SendOp.cs (Maple2.Server.Core\Constants\SendOp.cs).

In your chat type the following command: /debug resolve (opcode), it accepts the values in these formats: 81, 0081, 0x81, 0x0081

Now the resolver will send a packet to the client with the selected opcode, if the client reports that there was an error with the packet, the resolver will read the error and use the given hint from the error logger.

The errors from the client look something like this: ["sock_exception"] "BCNetworkService::ProcessPacket [type=170][offset=13][hint=Decode4]"

The resolver now will use that hint and add an INT (Since the hint is "Decode4") to the end of the packet and send it again until the client doesn't give any more errors.

The structure will be saved to an text file in /PacketStructures, they will have the opcode and the name for easy finding.

With the structure saved in the text file, you can change the values of each function to change the behavior of the packet. Packets normally have multiple headers, so you can change the part in which defines the header and delete the rest, then the resolver will continue from the last part.

Example

UserEnv 0x00AA has a bunch of different headers. On the first use it'll just send zeros so nothing major happened. This is the result:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.UserEnv);pWriter.WriteByte();pWriter.WriteInt();

Lets try to decode with header 8, so we will change the structure to:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.UserEnv);pWriter.WriteByte(8);

Now the resolver will run and the result is this:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.UserEnv);pWriter.WriteByte(8);pWriter.WriteInt();pWriter.WriteInt();

Since this has already been decoded, we know that the first int is a loop count. So we can change the value of it and see how the loop structure looks like.

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.UserEnv);pWriter.WriteByte(8);pWriter.WriteInt(2);// loop count

And this is the result:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.UserEnv);pWriter.WriteByte(8);pWriter.WriteInt(2);// loop countpWriter.WriteInt();// 1pWriter.WriteInt();// 1pWriter.WriteInt();// 2pWriter.WriteInt();// 2pWriter.WriteInt();

Now we can see that the mode 8 of the packet 0x00AA has structure like this:

Short - OPCODE
Byte - Header/Mode
Int - Loop counter
Int - Some value
Int - Some value
Int - Some value

Using the packet resolver on the packet from the Understanding packet tutorial, we can finally find the correct structure and it looks like this:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.ResponseCube);pWriter.WriteByte(20);pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteUnicodeString();pWriter.WriteLong();pWriter.WriteLong();pWriter.WriteByte();

Branches

Some packets have branches. It can be an simple boolean (true/false) or maybe if the item uid is in the character inventory.

Branches with booleans

For example the packet Ugc 0x006D mode 7, this is the structure:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.Ugc);pWriter.WriteByte(7);pWriter.WriteLong();pWriter.WriteByte();

Changing the last byte to one, this is the difference:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.UGC);pWriter.WriteByte(7);pWriter.WriteLong();pWriter.WriteByte(1);pWriter.WriteByte();pWriter.WriteInt();pWriter.WriteLong();pWriter.WriteLong();pWriter.WriteUnicodeString();pWriter.WriteUnicodeString();pWriter.WriteLong();pWriter.WriteUnicodeString();pWriter.WriteByte();pWriter.WriteByte();pWriter.WriteLong();pWriter.WriteByte();pWriter.WriteUnicodeString();

Branches with another values

Sometimes if there is a loop inside the structure it'll need a value different from zero, but what about item UID?

For example the packet ItemPutOn 0x0025, this is the structure (Maple2.Server.Game\Packets\EquipPacket.cs):

ByteWriterpWriter=Packet.Of(SendOp.ItemPutOn);pWriter.WriteInt(player.ObjectId);pWriter.WriteInt(item.Id);pWriter.WriteLong(item.Uid);pWriter.WriteUnicodeString(item.EquipSlot().ToString());pWriter.WriteInt(item.Rarity);pWriter.WriteByte(type);pWriter.WriteClass<Item>(item);

Lets see how the structure looks using the resolver:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.ItemPutOn);pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteLong();pWriter.WriteUnicodeString();pWriter.WriteInt();pWriter.WriteByte();

It's almost the same but it's missing everything from the WriteClass function! The client didn't return an error because it couldn't find the item UID we sent with the resolver (It's always zero), let's change the structure to have some correct values and try again:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.ItemPutOn);pWriter.WriteInt(10000126);// character object idpWriter.WriteInt(12060107);// item idpWriter.WriteLong(39);// item uidpWriter.WriteUnicodeString("RI");// equip slotpWriter.WriteInt(4);// item raritypWriter.WriteByte();

And here is the result from the resolver:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.ItemPutOn);pWriter.WriteInt(10000126);pWriter.WriteInt(12060107);pWriter.WriteLong(39);pWriter.WriteUnicodeString("RI");pWriter.WriteInt(4);pWriter.WriteByte();pWriter.WriteInt();// Write item starts here!pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteLong();pWriter.WriteLong();pWriter.WriteLong();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteByte();pWriter.WriteLong();pWriter.WriteShort();pWriter.WriteByte();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteByte();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteByte();pWriter.WriteLong();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteByte();pWriter.WriteInt();pWriter.WriteByte();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteByte();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteByte();pWriter.WriteByte();pWriter.WriteByte();pWriter.WriteByte();pWriter.WriteByte();pWriter.WriteLong();pWriter.WriteLong();pWriter.WriteUnicodeString();

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Packet Resolver

Ângelo Tadeucci edited this page Feb 17, 2026 · 3 revisions

How to use the packet resolver

This only works for packets which are sent from the server to the client.

Things you need first

A working Maple2. Setup guide here

Understanding how packets work. Tutorial here

How to use

First connect to your server.

Find the OP Code you want to resolve in SendOp.cs (Maple2.Server.Core\Constants\SendOp.cs).

In your chat type the following command: /debug resolve (opcode), it accepts the values in these formats: 81, 0081, 0x81, 0x0081

Now the resolver will send a packet to the client with the selected opcode, if the client reports that there was an error with the packet, the resolver will read the error and use the given hint from the error logger.

The errors from the client look something like this: ["sock_exception"] "BCNetworkService::ProcessPacket [type=170][offset=13][hint=Decode4]"

The resolver now will use that hint and add an INT (Since the hint is "Decode4") to the end of the packet and send it again until the client doesn't give any more errors.

The structure will be saved to an text file in /PacketStructures, they will have the opcode and the name for easy finding.

With the structure saved in the text file, you can change the values of each function to change the behavior of the packet. Packets normally have multiple headers, so you can change the part in which defines the header and delete the rest, then the resolver will continue from the last part.

Example

UserEnv 0x00AA has a bunch of different headers. On the first use it'll just send zeros so nothing major happened. This is the result:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.UserEnv);pWriter.WriteByte();pWriter.WriteInt();

Lets try to decode with header 8, so we will change the structure to:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.UserEnv);pWriter.WriteByte(8);

Now the resolver will run and the result is this:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.UserEnv);pWriter.WriteByte(8);pWriter.WriteInt();pWriter.WriteInt();

Since this has already been decoded, we know that the first int is a loop count. So we can change the value of it and see how the loop structure looks like.

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.UserEnv);pWriter.WriteByte(8);pWriter.WriteInt(2);// loop count

And this is the result:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.UserEnv);pWriter.WriteByte(8);pWriter.WriteInt(2);// loop countpWriter.WriteInt();// 1pWriter.WriteInt();// 1pWriter.WriteInt();// 2pWriter.WriteInt();// 2pWriter.WriteInt();

Now we can see that the mode 8 of the packet 0x00AA has structure like this:

Short - OPCODE
Byte - Header/Mode
Int - Loop counter
Int - Some value
Int - Some value
Int - Some value

Using the packet resolver on the packet from the Understanding packet tutorial, we can finally find the correct structure and it looks like this:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.ResponseCube);pWriter.WriteByte(20);pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteUnicodeString();pWriter.WriteLong();pWriter.WriteLong();pWriter.WriteByte();

Branches

Some packets have branches. It can be an simple boolean (true/false) or maybe if the item uid is in the character inventory.

Branches with booleans

For example the packet Ugc 0x006D mode 7, this is the structure:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.Ugc);pWriter.WriteByte(7);pWriter.WriteLong();pWriter.WriteByte();

Changing the last byte to one, this is the difference:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.UGC);pWriter.WriteByte(7);pWriter.WriteLong();pWriter.WriteByte(1);pWriter.WriteByte();pWriter.WriteInt();pWriter.WriteLong();pWriter.WriteLong();pWriter.WriteUnicodeString();pWriter.WriteUnicodeString();pWriter.WriteLong();pWriter.WriteUnicodeString();pWriter.WriteByte();pWriter.WriteByte();pWriter.WriteLong();pWriter.WriteByte();pWriter.WriteUnicodeString();

Branches with another values

Sometimes if there is a loop inside the structure it'll need a value different from zero, but what about item UID?

For example the packet ItemPutOn 0x0025, this is the structure (Maple2.Server.Game\Packets\EquipPacket.cs):

ByteWriterpWriter=Packet.Of(SendOp.ItemPutOn);pWriter.WriteInt(player.ObjectId);pWriter.WriteInt(item.Id);pWriter.WriteLong(item.Uid);pWriter.WriteUnicodeString(item.EquipSlot().ToString());pWriter.WriteInt(item.Rarity);pWriter.WriteByte(type);pWriter.WriteClass<Item>(item);

Lets see how the structure looks using the resolver:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.ItemPutOn);pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteLong();pWriter.WriteUnicodeString();pWriter.WriteInt();pWriter.WriteByte();

It's almost the same but it's missing everything from the WriteClass function! The client didn't return an error because it couldn't find the item UID we sent with the resolver (It's always zero), let's change the structure to have some correct values and try again:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.ItemPutOn);pWriter.WriteInt(10000126);// character object idpWriter.WriteInt(12060107);// item idpWriter.WriteLong(39);// item uidpWriter.WriteUnicodeString("RI");// equip slotpWriter.WriteInt(4);// item raritypWriter.WriteByte();

And here is the result from the resolver:

#Generatedby Maple2 PacketStructureResolver
ByteWriter pWriter =Packet.Of(SendOp.ItemPutOn);pWriter.WriteInt(10000126);pWriter.WriteInt(12060107);pWriter.WriteLong(39);pWriter.WriteUnicodeString("RI");pWriter.WriteInt(4);pWriter.WriteByte();pWriter.WriteInt();// Write item starts here!pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteLong();pWriter.WriteLong();pWriter.WriteLong();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteByte();pWriter.WriteLong();pWriter.WriteShort();pWriter.WriteByte();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteByte();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteShort();pWriter.WriteShort();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteByte();pWriter.WriteLong();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteByte();pWriter.WriteInt();pWriter.WriteByte();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteByte();pWriter.WriteInt();pWriter.WriteInt();pWriter.WriteByte();pWriter.WriteByte();pWriter.WriteByte();pWriter.WriteByte();pWriter.WriteByte();pWriter.WriteLong();pWriter.WriteLong();pWriter.WriteUnicodeString();

Clone this wiki locally