PrismarineJS / node-minecraft-protocol

Parse and serialize minecraft packets, plus authentication and encryption.
https://prismarinejs.github.io/node-minecraft-protocol/
BSD 3-Clause "New" or "Revised" License
1.23k stars 240 forks source link

Handle official (MC| - prefixed) Custom Payload packets #152

Open roblabla opened 9 years ago

roblabla commented 9 years ago

Minecraft defines a couple of packets through the Custom Payload mechanism. Currently, node-mc-proto decodes every custom payload as a simple byte array, and API users are left to decode those themselves. This issues proposes two things

  1. Add a new mechanism for API users to write their own custom payload decoder.
  2. Add a custom payload decoder for all the official channels.

We might want to support and manage the "Register/Unregister" channel automagically for this.

In 1.8, the official channels (Ignoring the custom channel management ones) are :

MC|AdvCdm

Name Type Description
Mode Byte
X Int If Mode == 0
Y Int If Mode == 0
Z Int If Mode == 0
EntityID Int If Mode == 1
Command String
### MC|Beacon
Name Type Description
Effect1 Int
Effect2 Int
### MC|BEdit
Name Type Description
Book Slot?
### MC|BSign
Name Type Description
Book Slot ?
### MC|BOpen
Name Type Description
### MC|ItemName
Name Type Description
ItemName String
### MC|RPack

(Deprecated, use Resource Pack Send (Play, 0x48, clientbound) and Resource Pack Status (Play, 0x19, serverbound) packets)

Name Type Description
URL String
### MC|TrList
Name Type Description
???
### MC|TrSel
Name Type Description
Slot ID Int The selected slot id of the trading inventory
### MC|PingHost

(Deprecated in 1.7)

Name Type Description
???
### MC|Brand
Name Type Description
Implementation String
rom1504 commented 9 years ago

See https://github.com/SpockBotMC/SpockBot/pull/172/files on that topic

rom1504 commented 8 years ago

This is needed to support command block updating. An example of updating is:

client->server: play custom_payload : 
{"channel":"MC|AdvCdm","data":{"type":"Buffer","data":[0,0,0,0,0,0,0,0,71,255,255,255,189,17,47,116,112,32,114,111,109,49,53,48,52,32,48,32,48,32,48,1]}}
rom1504 commented 8 years ago

https://gist.github.com/rom1504/742a400592260329bcb1 : started to work on it

rom1504 commented 8 years ago

http://wiki.vg/Plugin_channel is more up to date

rom1504 commented 8 years ago

Some of that currently put in mineflayer, https://github.com/PrismarineJS/mineflayer/blob/master/lib/plugins/command_block.js, it will move here when ready I think.

deathcap commented 8 years ago

and/or to https://github.com/PrismarineJS/minecraft-data right? (protocol definition)

Plugin channels would also be useful for https://github.com/PrismarineJS/node-minecraft-protocol/issues/114 Forge Support - FML/Forge has several of its own used during handshaking

rom1504 commented 8 years ago

yeah and minecraft-data

rom1504 commented 8 years ago

https://github.com/PrismarineJS/node-minecraft-protocol/pull/423 brings parsing of channel to the client and server with registration/unregistration. Missing for this issue:

edit : checking things in https://github.com/rom1504/node-minecraft-protocol/commit/a0717a1232f83799bd87fb7e918392cb175183d4