mirror of
https://github.com/PrismarineJS/node-minecraft-protocol.git
synced 2025-05-17 08:40:24 -04:00
update to new minecraft-data protocol schema
This commit is contained in:
parent
93449427cd
commit
d78d87b9fc
3 changed files with 64 additions and 56 deletions
|
@ -9,17 +9,47 @@ var customPackets={
|
||||||
"1.8": {
|
"1.8": {
|
||||||
"play": {
|
"play": {
|
||||||
"toClient": {
|
"toClient": {
|
||||||
"my_custom_packet": {
|
"types": {
|
||||||
"id": "0x7A",
|
"packet_custom_name": [
|
||||||
"fields": [
|
"container",[
|
||||||
{
|
{
|
||||||
"name": "age",
|
"name": "age",
|
||||||
"type": "i64"
|
"type": "i64"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "time",
|
"name": "time",
|
||||||
"type": "i64"
|
"type": "i64"
|
||||||
}
|
}
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"packet": [
|
||||||
|
"container",
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"name": "name",
|
||||||
|
"type": [
|
||||||
|
"mapper",
|
||||||
|
{
|
||||||
|
"type": "varint",
|
||||||
|
"mappings": {
|
||||||
|
"0x7A": "custom_name"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "params",
|
||||||
|
"type": [
|
||||||
|
"switch",
|
||||||
|
{
|
||||||
|
"compareTo": "name",
|
||||||
|
"fields": {
|
||||||
|
"custom_name": "packet_custom_name"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -51,6 +81,6 @@ client.on('login',function(){
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
client.on('my_custom_packet',function(packet){
|
client.on('custom_name',function(packet){
|
||||||
console.log(packet);
|
console.log(packet);
|
||||||
});
|
});
|
||||||
|
|
|
@ -43,14 +43,16 @@
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"buffer-equal": "1.0.0",
|
"buffer-equal": "1.0.0",
|
||||||
"minecraft-data": "^1.0.3",
|
"endian-toggle": "0.0.0",
|
||||||
|
"lodash.get": "^4.1.2",
|
||||||
|
"lodash.merge": "^4.3.0",
|
||||||
|
"minecraft-data": "~1.1.0",
|
||||||
"prismarine-nbt": "0.2.1",
|
"prismarine-nbt": "0.2.1",
|
||||||
"protodef": "^1.1.1",
|
"protodef": "^1.1.1",
|
||||||
"readable-stream": "^2.0.5",
|
"readable-stream": "^2.0.5",
|
||||||
"ursa-purejs": "0.0.3",
|
"ursa-purejs": "0.0.3",
|
||||||
"uuid-1345": "^0.99.6",
|
"uuid-1345": "^0.99.6",
|
||||||
"yggdrasil": "0.1.0",
|
"yggdrasil": "0.1.0"
|
||||||
"endian-toggle": "0.0.0"
|
|
||||||
},
|
},
|
||||||
"optionalDependencies": {
|
"optionalDependencies": {
|
||||||
"ursa": "~0.9.1"
|
"ursa": "~0.9.1"
|
||||||
|
|
|
@ -4,59 +4,35 @@ const Parser = require("protodef").Parser;
|
||||||
|
|
||||||
const minecraft = require("../datatypes/minecraft");
|
const minecraft = require("../datatypes/minecraft");
|
||||||
const states = require("../states");
|
const states = require("../states");
|
||||||
|
const merge=require("lodash.merge");
|
||||||
|
const get=require("lodash.get");
|
||||||
|
|
||||||
function createProtocol(types,packets)
|
function recursiveAddTypes(protocol,protocolData,path)
|
||||||
|
{
|
||||||
|
if(protocolData===undefined)
|
||||||
|
return;
|
||||||
|
if(protocolData.types)
|
||||||
|
protocol.addTypes(protocolData.types);
|
||||||
|
recursiveAddTypes(protocol,get(protocolData,path.shift()),path);
|
||||||
|
}
|
||||||
|
|
||||||
|
function createProtocol(state,direction,version,customPackets)
|
||||||
{
|
{
|
||||||
const proto = new ProtoDef();
|
const proto = new ProtoDef();
|
||||||
proto.addType("string",["pstring",{
|
|
||||||
countType:"varint"
|
|
||||||
}]);
|
|
||||||
proto.addTypes(minecraft);
|
proto.addTypes(minecraft);
|
||||||
proto.addTypes(types);
|
const mcData=require("minecraft-data")(version);
|
||||||
|
recursiveAddTypes(proto,merge(mcData.protocol,get(customPackets,[mcData.version.majorVersion])),[state,direction]);
|
||||||
Object.keys(packets).forEach(function(name) {
|
|
||||||
proto.addType("packet_"+name,["container",packets[name].fields]);
|
|
||||||
});
|
|
||||||
|
|
||||||
proto.addType("packet",["container", [
|
|
||||||
{ "name": "name", "type":["mapper",{"type": "varint" ,
|
|
||||||
"mappings":Object.keys(packets).reduce(function(acc,name){
|
|
||||||
acc[parseInt(packets[name].id)]=name;
|
|
||||||
return acc;
|
|
||||||
},{})
|
|
||||||
}]},
|
|
||||||
{ "name": "params", "type": ["switch", {
|
|
||||||
"compareTo": "name",
|
|
||||||
"fields": Object.keys(packets).reduce(function(acc,name){
|
|
||||||
acc[name]="packet_"+name;
|
|
||||||
return acc;
|
|
||||||
},{})
|
|
||||||
}]}
|
|
||||||
]]);
|
|
||||||
return proto;
|
return proto;
|
||||||
}
|
}
|
||||||
|
|
||||||
function createSerializer({ state = states.HANDSHAKING, isServer = false , version,customPackets} = {})
|
function createSerializer({ state = states.HANDSHAKING, isServer = false , version,customPackets} = {})
|
||||||
{
|
{
|
||||||
const mcData=require("minecraft-data")(version);
|
return new Serializer(createProtocol(state,!isServer ? "toServer" : "toClient",version,customPackets),"packet");
|
||||||
const direction = !isServer ? 'toServer' : 'toClient';
|
|
||||||
const packets = mcData.protocol.states[state][direction];
|
|
||||||
const v=mcData.version.majorVersion;
|
|
||||||
if(customPackets && customPackets[v] && customPackets[v][state] && customPackets[v][state][direction]) Object.keys(customPackets[v][state][direction]).forEach(name => packets[name]=customPackets[v][state][direction][name]);
|
|
||||||
const proto=createProtocol(mcData.protocol.types,packets);
|
|
||||||
return new Serializer(proto,"packet");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function createDeserializer({ state = states.HANDSHAKING, isServer = false,
|
function createDeserializer({ state = states.HANDSHAKING, isServer = false,version,customPackets } = {})
|
||||||
packetsToParse = {"packet": true}, version,customPackets } = {})
|
|
||||||
{
|
{
|
||||||
const mcData=require("minecraft-data")(version);
|
return new Parser(createProtocol(state,isServer ? "toServer" : "toClient",version,customPackets),"packet");
|
||||||
const direction = isServer ? "toServer" : "toClient";
|
|
||||||
const packets = mcData.protocol.states[state][direction];
|
|
||||||
const v=mcData.version.majorVersion;
|
|
||||||
if(customPackets && customPackets[v][state] && customPackets[v][state][direction]) Object.keys(customPackets[v][state][direction]).forEach(name => packets[name]=customPackets[v][state][direction][name]);
|
|
||||||
const proto=createProtocol(mcData.protocol.types,packets);
|
|
||||||
return new Parser(proto,"packet");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue