From 863ddf17853e423d72805bb02ed48a0ff61fa9d4 Mon Sep 17 00:00:00 2001 From: Romain Beaumont Date: Thu, 7 Apr 2016 00:46:40 +0200 Subject: [PATCH] add example chunk, use protodef to implement read and write batch, try to make the chunk sending work --- examples/chunk | Bin 0 -> 83200 bytes examples/server.js | 20 ++++++++++++-------- src/createClient.js | 22 ++++++++-------------- src/createServer.js | 14 ++++++++++++++ src/datatypes/minecraft.js | 36 +++++++++++++++++++++++++++++++++++- 5 files changed, 69 insertions(+), 23 deletions(-) create mode 100644 examples/chunk diff --git a/examples/chunk b/examples/chunk new file mode 100644 index 0000000000000000000000000000000000000000..4152a449e50dace389356c21650ac8bea1744cea GIT binary patch literal 83200 zcmeI3OK#j&5JibJj2Hpi0wT(i^>Mr;O?n^607EsEy<+xoKpbl=6C^*)7d>`FV?{ky&fD$T!+$)Q5DP-dP%bXUh~)0 zpY8ppHaLHM!)JLEZ@8|u??aJZ{r)HLwyBl1_GZeS@{%7A3*JP?I4E@VxS%8LzX!3~ zzwcSjejn0i`5@=lvQ%q750lN&twuemSZTBwrF{7MLdbT&m9&?q-JBo5G7jajERim< z4|xB!yE&yg@{1Dnv@&ng-R-)e1=QUu{K=mvPDQl)g7vD-bfw0x}#HQ`;IErq!e+m-rsS?gvuI?YcU z;43D*|7;WWo?gmF+Ve@8&Qf(Dp-U)(dCeLxew)T+Z?;^ z^uBYkv{3Y+4K=!v)ABUM{O-m}kDG0|FsgYp)s1wTxeLu_srf=emr?*UveuL8I=#BP zDo1bPrY#l+o6c=i+KbaUciEheQnOOdyzn~ROjNX~brW6hZqm|hnMd!UeT0-UoeL{H zU!3;(VfE&$4nKeH#3n1f+smf2#Q3?ep0}CE=TFsDu~}A-kx#{*FSQ(B$*Hc=ljF;AK(#gR4`k@c}2rXT(OUQO>I@>Kkn`4wXFvD&soRHqzzpTSO31`z&H&_dmA4jbjEs9hf zQ6w}ZB0>>$S+qwBqg9QgOWh-XdjH_*-ddBQufSh>E;#6DY3`NzwfN)a|2q7&OL?FE zqJ8eT2OsnP7v?vo{2t8MUq|o$DO$F-O?K;atKL5;Zto#(DE360zJELF3-j+|ejjvk z{@rfZ?cR-}#9fLquS<=XAKIf-tBwdMd6g1X_AYyqV{h5`{#X2WZ~hp^9|i1d+1hn> zQg^-E$?_=j4NiPwQqEUd#9xsf^$?9Jdz>jxuYV`8^6y?({#~cO(vL@^aW4=M)zG?y zM%NOx3Q=Wm)nmgwz81AVYB9fDKb)_xY$hU&yc#Urw`8EjGIvDXB-<@!|3BU6=dGOx zjXlf$cH+dpF$mv?O}aDPb$^L31pE=9v8V8dT%CK1B6)CzJZWy-EZXm1q&?RDs9pEh z^GE-FjaxSee~j!(TcTe=}Yje0Z zC0L}l)Q;so<=^Pa`}maBm6zkF)+k7T1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCL^pfg1;~w|L|6 zlVPF1p?)m<<9#-_pkBoTp!$j!S~DafB(T=!Ltwh{gK?w_aFR%LdX*@CzlD4Icj6oV5gUIs z^eX8q{M|PO{SW;0DCy^Re>2icBOeoJ_xBf_maW_P-oR zDs|RJBPYvNEv)UaxnZoj=_7n2s!!t|JX-&SwkH13$DBWkvEKOW8M2IaByTq_`J))i z8rJ7mUn$lodo}6-<^Uc35zW9Htx8^l`9@6s)<=3RA#tocN9LDe(?`?Kt^RSc^)d0U zmec#UE>{2Qw={F``PEVOLduBE%o0RUHq{U!1@E!IQ^Q zdwy~C@}<;b_b{BEUtWe5IXu6-x{`&h?1ntOxV%DvXwAM*eR;L*Eqfu!OL;VTCTICG z3@2yer0PPRlasR-FG8Q64`(8?9-fNI`unGwLJ!B=jcM6%ar)iUr<={D`{lQv_>T;D J2Oj4g_!n1^QO5uP literal 0 HcmV?d00001 diff --git a/examples/server.js b/examples/server.js index 2324fff..ffc36c8 100644 --- a/examples/server.js +++ b/examples/server.js @@ -1,6 +1,7 @@ 'use strict'; var pmp = require('../'); +var fs = require("fs"); if(process.argv.length !=4) { console.log("Usage: node server.js "); @@ -44,15 +45,18 @@ server.on('connection', function(client) { }); client.on("mcpe_request_chunk_radius",packet => { - const chunkRadius=packet.chunk_radius; + const chunkRadius = packet.chunk_radius; // TODO : to fix, no idea what to send - client.writeMCPE("mcpe_full_chunk_data",{ - chunk_x:0, - chunk_z:0, - order:0, - chunk_data_length:8, - chunk_data:new Buffer([0,1]) - }); + for (let x = 5; x < 6; x++) { + for (let z = 2; z < 3; z++) { + client.writeBatch([{"name":"mcpe","params":{name:"mcpe_full_chunk_data",params:{ + chunk_x: x, + chunk_z: z, + order: 1, + chunk_data:fs.readFileSync(__dirname+"/chunk") + }}}]); + } + } }); client.on('error', function(err) { diff --git a/src/createClient.js b/src/createClient.js index 36011cb..04daada 100644 --- a/src/createClient.js +++ b/src/createClient.js @@ -4,6 +4,10 @@ const raknet = require('raknet'); const fs = require('fs'); const path = require('path'); const zlib = require('zlib'); +const ProtoDef = require('protodef').ProtoDef; +const batchProto=new ProtoDef(); +batchProto.addTypes(require("./datatypes/minecraft")); +batchProto.addType("insideBatch",["endOfArray",{"type":["buffer",{"countType":"i32"}]}]); function createClient(options) { assert.ok(options, 'options is required'); @@ -41,24 +45,14 @@ function createClient(options) { texture: fs.readFileSync(path.join(__dirname,'texture')) } } - ) + ); + }); client.on('mcpe_batch', function(packet) { var buf = zlib.inflateSync(packet.payload); - var offset = 0; - var length = buf.length; - - while(offset < length) { - var pkLength = buf.readInt32BE(offset); - offset += 4; - - var packetBuffer = buf.slice(offset, pkLength); - offset += pkLength; - - packetBuffer = Buffer.concat([new Buffer([0x8e]),packetBuffer]); - client.readEncapsulatedPacket(packetBuffer); - } + var packets=batchProto.parsePacketBuffer("insideBatch",buf).data; + packets.forEach(packet => client.readEncapsulatedPacket(Buffer.concat([new Buffer([0x8e]),packet]))); }); return client; diff --git a/src/createServer.js b/src/createServer.js index b8ba171..2cc79ad 100644 --- a/src/createServer.js +++ b/src/createServer.js @@ -1,4 +1,9 @@ const raknet = require('raknet'); +const zlib = require('zlib'); +const ProtoDef = require('protodef').ProtoDef; +const batchProto=new ProtoDef(); +batchProto.addTypes(require("./datatypes/minecraft")); +batchProto.addType("insideBatch",["endOfArray",{"type":["buffer",{"countType":"i32"}]}]); function createServer(options) { options = options || {}; @@ -20,12 +25,21 @@ function createServer(options) { server.on("connection", function (client) { client.on("mcpe",packet => client.emit(packet.name,packet.params)); + client.writeMCPE=(name,packet) => { client.writeEncapsulated("mcpe",{ name:name, params:packet }); }; + client.writeBatch=function(packets) { + const payload=zlib.deflateSync(batchProto.createPacketBuffer("insideBatch", + packets.map(packet => + client.encapsulatedPacketSerializer.createPacketBuffer(packet).slice(1)))); + client.writeMCPE("mcpe_batch",{ + payload:payload + }); + } }); return server; } diff --git a/src/datatypes/minecraft.js b/src/datatypes/minecraft.js index 53f8fe2..fb1bc48 100644 --- a/src/datatypes/minecraft.js +++ b/src/datatypes/minecraft.js @@ -93,9 +93,43 @@ function writeIpAddress(value, buffer, offset) { return offset; } +function readEndOfArray(buffer, offset, typeArgs) { + var type=typeArgs.type; + var cursor = offset; + var elements = []; + while(cursor