diff --git a/examples/client_custom_packets/client_custom_packets.js b/examples/client_custom_packets/client_custom_packets.js index 991d660..11c353e 100644 --- a/examples/client_custom_packets/client_custom_packets.js +++ b/examples/client_custom_packets/client_custom_packets.js @@ -9,17 +9,47 @@ var customPackets={ "1.8": { "play": { "toClient": { - "my_custom_packet": { - "id": "0x7A", - "fields": [ - { - "name": "age", - "type": "i64" - }, - { - "name": "time", - "type": "i64" - } + "types": { + "packet_custom_name": [ + "container",[ + { + "name": "age", + "type": "i64" + }, + { + "name": "time", + "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); }); diff --git a/package.json b/package.json index 5c66aa4..a8faece 100644 --- a/package.json +++ b/package.json @@ -43,14 +43,16 @@ }, "dependencies": { "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", "protodef": "^1.1.1", "readable-stream": "^2.0.5", "ursa-purejs": "0.0.3", "uuid-1345": "^0.99.6", - "yggdrasil": "0.1.0", - "endian-toggle": "0.0.0" + "yggdrasil": "0.1.0" }, "optionalDependencies": { "ursa": "~0.9.1" diff --git a/src/transforms/serializer.js b/src/transforms/serializer.js index 98fdb30..7756451 100644 --- a/src/transforms/serializer.js +++ b/src/transforms/serializer.js @@ -4,59 +4,35 @@ const Parser = require("protodef").Parser; const minecraft = require("../datatypes/minecraft"); 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(); - proto.addType("string",["pstring",{ - countType:"varint" - }]); proto.addTypes(minecraft); - proto.addTypes(types); - - 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; - },{}) - }]} - ]]); + const mcData=require("minecraft-data")(version); + recursiveAddTypes(proto,merge(mcData.protocol,get(customPackets,[mcData.version.majorVersion])),[state,direction]); return proto; } function createSerializer({ state = states.HANDSHAKING, isServer = false , version,customPackets} = {}) { - const mcData=require("minecraft-data")(version); - 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"); + return new Serializer(createProtocol(state,!isServer ? "toServer" : "toClient",version,customPackets),"packet"); } -function createDeserializer({ state = states.HANDSHAKING, isServer = false, - packetsToParse = {"packet": true}, version,customPackets } = {}) +function createDeserializer({ state = states.HANDSHAKING, isServer = false,version,customPackets } = {}) { - const mcData=require("minecraft-data")(version); - 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"); + return new Parser(createProtocol(state,isServer ? "toServer" : "toClient",version,customPackets),"packet"); } module.exports = {