lots a shit
This commit is contained in:
parent
4f9d056886
commit
0b7ea5aa9a
16 changed files with 278 additions and 131 deletions
3
server/Converter.js
Normal file
3
server/Converter.js
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
module.exports.toAbsoluteInt = function(float = 0.0) {
|
||||||
|
return Math.round(float * 32.0);
|
||||||
|
}
|
|
@ -1,6 +1,6 @@
|
||||||
class Entity {
|
class Entity {
|
||||||
constructor(x = 0, y = 0, z = 0, yaw = 0, pitch = 0) {
|
constructor(EID = 0, x = 0, y = 0, z = 0, yaw = 0, pitch = 0) {
|
||||||
this.EID = global.fromIDPool();
|
this.EID = EID;
|
||||||
|
|
||||||
this.x = x;
|
this.x = x;
|
||||||
this.y = y;
|
this.y = y;
|
||||||
|
|
|
@ -2,7 +2,7 @@ const Entity = require("./Entity.js");
|
||||||
|
|
||||||
class EntityItem extends Entity {
|
class EntityItem extends Entity {
|
||||||
constructor(itemID = 0x00, x = 0, y = 0, z = 0) {
|
constructor(itemID = 0x00, x = 0, y = 0, z = 0) {
|
||||||
super(x, y, z);
|
super(global.fromIDPool(), x, y, z);
|
||||||
|
|
||||||
this.motionX = (Math.random() * 0.2 - 0.1);
|
this.motionX = (Math.random() * 0.2 - 0.1);
|
||||||
this.motionY = 0.2;
|
this.motionY = 0.2;
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
const Entity = require("./Entity.js");
|
const Entity = require("./Entity.js");
|
||||||
|
|
||||||
class EntityPlayer extends Entity {
|
class EntityLiving extends Entity {
|
||||||
constructor(x = 0, y = 0, z = 0) {
|
constructor(EID = 0, x = 0, y = 0, z = 0) {
|
||||||
super(x, y, z);
|
super(EID, x, y, z);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -12,4 +12,4 @@ class EntityPlayer extends Entity {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = EntityPlayer;
|
module.exports = EntityLiving;
|
|
@ -1,12 +1,10 @@
|
||||||
const EntityLiving = require("./EntityLiving.js");
|
const EntityLiving = require("./EntityLiving.js");
|
||||||
|
|
||||||
class EntityPlayer extends EntityLiving {
|
class EntityPlayer extends EntityLiving {
|
||||||
constructor(x = 0, y = 0, z = 0) {
|
constructor(EID = 0, x = 0, y = 0, z = 0) {
|
||||||
super(x, y, z);
|
super(EID, x, y, z);
|
||||||
|
|
||||||
|
|
||||||
this.motionX = (Math.random() * 0.2 - 0.1);
|
|
||||||
this.motionY = 0.2;
|
|
||||||
this.motionZ = (Math.random() * 0.2 - 0.1);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
const namedPackets = {
|
const namedPackets = {
|
||||||
|
"Disconnect": -1,
|
||||||
"KeepAlive": 0x00,
|
"KeepAlive": 0x00,
|
||||||
"LoginRequest": 0x01,
|
"LoginRequest": 0x01,
|
||||||
"Handshake": 0x02,
|
"Handshake": 0x02,
|
||||||
|
|
|
@ -6,8 +6,11 @@ const Packet0KeepAlive = require("./Packets/Packet0KeepAlive.js"),
|
||||||
Packet6SpawnPosition = require("./Packets/Packet6SpawnPosition.js"),
|
Packet6SpawnPosition = require("./Packets/Packet6SpawnPosition.js"),
|
||||||
Packet10Player = require("./Packets/Packet10Player.js"),
|
Packet10Player = require("./Packets/Packet10Player.js"),
|
||||||
Packet13PlayerPositionAndLook = require("./Packets/Packet13PlayerPositionAndLook.js"),
|
Packet13PlayerPositionAndLook = require("./Packets/Packet13PlayerPositionAndLook.js"),
|
||||||
|
Packet18Animation = require("./Packets/Packet18Animation.js"),
|
||||||
|
Packet20NamedEntitySpawn = require("./Packets/Packet20NamedEntitySpawn.js"),
|
||||||
Packet50PreChunk = require("./Packets/Packet50PreChunk.js"),
|
Packet50PreChunk = require("./Packets/Packet50PreChunk.js"),
|
||||||
Packet53BlockChange = require("./Packets/Packet53BlockChange.js");
|
Packet53BlockChange = require("./Packets/Packet53BlockChange.js"),
|
||||||
|
Packet103SetSlot = require("./Packets/Packet103SetSlot.js");
|
||||||
|
|
||||||
const mappingTable = {
|
const mappingTable = {
|
||||||
0x00: Packet0KeepAlive,
|
0x00: Packet0KeepAlive,
|
||||||
|
@ -18,8 +21,11 @@ const mappingTable = {
|
||||||
0x06: Packet6SpawnPosition,
|
0x06: Packet6SpawnPosition,
|
||||||
0x0A: Packet10Player,
|
0x0A: Packet10Player,
|
||||||
0x0D: Packet13PlayerPositionAndLook,
|
0x0D: Packet13PlayerPositionAndLook,
|
||||||
|
0x12: Packet18Animation,
|
||||||
|
0x14: Packet20NamedEntitySpawn,
|
||||||
0x32: Packet50PreChunk,
|
0x32: Packet50PreChunk,
|
||||||
0x35: Packet53BlockChange,
|
0x35: Packet53BlockChange,
|
||||||
|
0x67: Packet103SetSlot
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = mappingTable;
|
module.exports = mappingTable;
|
27
server/Packets/Packet103SetSlot.js
Normal file
27
server/Packets/Packet103SetSlot.js
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
const Packet = require("./Packet.js");
|
||||||
|
|
||||||
|
class Packet103SetSlot extends Packet {
|
||||||
|
constructor(window_id = 0, slot = 0, item_id = -1, item_count = 0, item_uses = 0) {
|
||||||
|
super(0x67);
|
||||||
|
|
||||||
|
this.window_id = window_id;
|
||||||
|
this.slot = slot;
|
||||||
|
this.item_id = item_id;
|
||||||
|
this.item_count = item_count;
|
||||||
|
this.item_uses = item_uses;
|
||||||
|
}
|
||||||
|
|
||||||
|
writePacket() {
|
||||||
|
super.writePacket();
|
||||||
|
|
||||||
|
this.writer.writeByte(this.window_id);
|
||||||
|
this.writer.writeShort(this.slot);
|
||||||
|
this.writer.writeShort(this.item_id);
|
||||||
|
this.writer.writeByte(this.item_count);
|
||||||
|
if (this.item_id != -1) this.writer.writeShort(this.item_uses);
|
||||||
|
|
||||||
|
return this.toBuffer();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = Packet103SetSlot;
|
21
server/Packets/Packet18Animation.js
Normal file
21
server/Packets/Packet18Animation.js
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
const Packet = require("./Packet.js");
|
||||||
|
|
||||||
|
class Packet18Animation extends Packet {
|
||||||
|
constructor(EID = 0, animation = 0) {
|
||||||
|
super(0x12);
|
||||||
|
|
||||||
|
this.EID = EID;
|
||||||
|
this.animation = animation;
|
||||||
|
}
|
||||||
|
|
||||||
|
writePacket() {
|
||||||
|
super.writePacket();
|
||||||
|
|
||||||
|
this.writer.writeInt(this.EID);
|
||||||
|
this.writer.writeByte(this.animation);
|
||||||
|
|
||||||
|
return this.toBuffer();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = Packet18Animation;
|
34
server/Packets/Packet20NamedEntitySpawn.js
Normal file
34
server/Packets/Packet20NamedEntitySpawn.js
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
const Packet = require("./Packet.js");
|
||||||
|
const Converter = require("../Converter.js");
|
||||||
|
|
||||||
|
class Packet20NamedEntitySpawn extends Packet {
|
||||||
|
constructor(EID = 0, entityName = "", x = 0.0, y = 0.0, z = 0.0, yaw = 0.0, pitch = 0.0, currentItem = 0) {
|
||||||
|
super(0x14);
|
||||||
|
|
||||||
|
this.EID = EID;
|
||||||
|
this.entityName = entityName;
|
||||||
|
this.absX = Converter.toAbsoluteInt(x);
|
||||||
|
this.absY = Converter.toAbsoluteInt(y);
|
||||||
|
this.absZ = Converter.toAbsoluteInt(z);
|
||||||
|
this.packedYaw = 0; // TODO: Add rotation.
|
||||||
|
this.packedPitch = 0;
|
||||||
|
this.currentItem = currentItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
writePacket() {
|
||||||
|
super.writePacket();
|
||||||
|
|
||||||
|
this.writer.writeInt(this.EID);
|
||||||
|
this.writer.writeString(this.entityName);
|
||||||
|
this.writer.writeInt(this.absX);
|
||||||
|
this.writer.writeInt(this.absY);
|
||||||
|
this.writer.writeInt(this.absZ);
|
||||||
|
this.writer.writeByte(this.packedYaw);
|
||||||
|
this.writer.writeByte(this.packedPitch);
|
||||||
|
this.writer.writeShort(this.currentItem);
|
||||||
|
|
||||||
|
return this.toBuffer();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = Packet20NamedEntitySpawn;
|
|
@ -7,7 +7,7 @@ class Packet2Handshake extends Packet {
|
||||||
this.username = username;
|
this.username = username;
|
||||||
}
|
}
|
||||||
|
|
||||||
writePacket(EID = 0) {
|
writePacket() {
|
||||||
super.writePacket();
|
super.writePacket();
|
||||||
|
|
||||||
this.writer.writeString("-"); // "-" == Offline mode
|
this.writer.writeString("-"); // "-" == Offline mode
|
||||||
|
|
|
@ -1,95 +0,0 @@
|
||||||
const { Worker, MessageChannel, MessagePort, isMainThread, parentPort } = require('worker_threads');
|
|
||||||
|
|
||||||
const bufferStuff = require("../bufferStuff.js");
|
|
||||||
|
|
||||||
let chunkY = 0;
|
|
||||||
let busyInterval = null;
|
|
||||||
|
|
||||||
parentPort.on("message", (data) => {
|
|
||||||
// This stops the thread from stopping :)
|
|
||||||
if (busyInterval == null) busyInterval = setInterval(() => {}, 86400000);
|
|
||||||
|
|
||||||
switch (data[0]) {
|
|
||||||
case "chunk":
|
|
||||||
chunkY = 0;
|
|
||||||
|
|
||||||
parentPort.postMessage([data[0], doSquareChunk(data[1]), data[2]]);
|
|
||||||
chunkY += 16;
|
|
||||||
parentPort.postMessage([data[0], doSquareChunk(data[1]), data[2]]);
|
|
||||||
chunkY += 16;
|
|
||||||
parentPort.postMessage([data[0], doSquareChunk(data[1]), data[2]]);
|
|
||||||
chunkY += 16;
|
|
||||||
parentPort.postMessage([data[0], doSquareChunk(data[1]), data[2]]);
|
|
||||||
chunkY += 16;
|
|
||||||
parentPort.postMessage([data[0], doSquareChunk(data[1]), data[2]]);
|
|
||||||
chunkY += 16;
|
|
||||||
parentPort.postMessage([data[0], doSquareChunk(data[1]), data[2]]);
|
|
||||||
chunkY += 16;
|
|
||||||
parentPort.postMessage([data[0], doSquareChunk(data[1]), data[2]]);
|
|
||||||
chunkY += 16;
|
|
||||||
parentPort.postMessage([data[0], doSquareChunk(data[1]), data[2]]);
|
|
||||||
|
|
||||||
parentPort.postMessage(["remove", data[3]]);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "generate":
|
|
||||||
parentPort.postMessage([data[0], generateChunk(), data[1], data[2], data[3]]);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
function generateChunk() {
|
|
||||||
let chunk = {};
|
|
||||||
for (let y = 0; y < 128; y++) {
|
|
||||||
chunk[y] = {};
|
|
||||||
for (let x = 0; x < 16; x++) {
|
|
||||||
chunk[y][x] = {};
|
|
||||||
for (let z = 0; z < 16; z++) {
|
|
||||||
if (y == 64) {
|
|
||||||
chunk[y][x][z] = 2;
|
|
||||||
}
|
|
||||||
else if (y == 63 || y == 62) chunk[y][x][z] = 3;
|
|
||||||
else if (y == 0) chunk[y][x][z] = 7;
|
|
||||||
else if (y < 62) chunk[y][x][z] = 1;
|
|
||||||
else chunk[y][x][z] = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return chunk;
|
|
||||||
}
|
|
||||||
|
|
||||||
function doSquareChunk(chunk) {
|
|
||||||
let blocksToSend = [];
|
|
||||||
for (let y = 0; y < 16; y++) {
|
|
||||||
for (let x = 0; x < 16; x++) {
|
|
||||||
for (let z = 0; z < 16; z++) {
|
|
||||||
if (chunk[2][chunkY + y][x][z] == 0) continue; // don't send air lol
|
|
||||||
blocksToSend.push([chunk[2][chunkY + y][x][z], x & 0xf, z & 0xf, chunkY + y]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// I couldn't figure out how to construct a chunk lmao
|
|
||||||
// Using multi block chunks for now
|
|
||||||
// TODO: yknow, figure out how to actually chunk.
|
|
||||||
const writer = new bufferStuff.Writer();
|
|
||||||
writer.writeByte(0x34);
|
|
||||||
writer.writeInt(chunk[0]);
|
|
||||||
writer.writeInt(chunk[1]);
|
|
||||||
writer.writeShort(blocksToSend.length);
|
|
||||||
// Block coords
|
|
||||||
for (let blocks of blocksToSend) {
|
|
||||||
writer.writeShort((blocks[1] << 12 | blocks[2] << 8 | blocks[3]) - 32768);
|
|
||||||
}
|
|
||||||
// Block types
|
|
||||||
for (let blocks of blocksToSend) {
|
|
||||||
writer.writeByte(blocks[0]);
|
|
||||||
}
|
|
||||||
// Block metadata
|
|
||||||
for (let blocks of blocksToSend) {
|
|
||||||
writer.writeByte(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
return writer.buffer;
|
|
||||||
}
|
|
86
server/Workers/ChunkWorker.js
Normal file
86
server/Workers/ChunkWorker.js
Normal file
|
@ -0,0 +1,86 @@
|
||||||
|
const { parentPort } = require('worker_threads');
|
||||||
|
|
||||||
|
const { deflateSync } = require("zlib");
|
||||||
|
|
||||||
|
const bufferStuff = require("../bufferStuff.js");
|
||||||
|
|
||||||
|
let busyInterval = null;
|
||||||
|
|
||||||
|
parentPort.on("message", (data) => {
|
||||||
|
// This stops the thread from stopping :)
|
||||||
|
if (busyInterval == null) busyInterval = setInterval(() => {}, 86400000); // Runs once a day
|
||||||
|
|
||||||
|
switch (data[0]) {
|
||||||
|
case "chunk":
|
||||||
|
parentPort.postMessage([data[0], doChunk(data[1]), data[2]]);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "generate":
|
||||||
|
parentPort.postMessage([data[0], generateChunk(), data[1], data[2], data[3]]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
function generateChunk() {
|
||||||
|
let chunk = {};
|
||||||
|
for (let y = 0; y < 128; y++) {
|
||||||
|
chunk[y] = {};
|
||||||
|
for (let x = 0; x < 16; x++) {
|
||||||
|
chunk[y][x] = {};
|
||||||
|
for (let z = 0; z < 16; z++) {
|
||||||
|
if (y == 64) {
|
||||||
|
chunk[y][x][z] = 2;
|
||||||
|
}
|
||||||
|
else if (y == 63 || y == 62) chunk[y][x][z] = 3;
|
||||||
|
else if (y == 0) chunk[y][x][z] = 7;
|
||||||
|
else if (y < 62) chunk[y][x][z] = 1;
|
||||||
|
else chunk[y][x][z] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return chunk;
|
||||||
|
}
|
||||||
|
|
||||||
|
function doChunk(chunk) {
|
||||||
|
const writer = new bufferStuff.Writer();
|
||||||
|
|
||||||
|
writer.writeByte(0x33); // Chunk
|
||||||
|
writer.writeInt(chunk[0] << 4); // Chunk X
|
||||||
|
writer.writeShort(0 << 7); // Chunk Y
|
||||||
|
writer.writeInt(chunk[1] << 4); // Chunk Z
|
||||||
|
writer.writeByte(15); // Size X
|
||||||
|
writer.writeByte(127); // Size Y
|
||||||
|
writer.writeByte(15); // Size Z
|
||||||
|
|
||||||
|
const blocks = new bufferStuff.Writer(32768);
|
||||||
|
const metadata = new bufferStuff.Writer(32768);
|
||||||
|
const lighting = new bufferStuff.Writer(32768);
|
||||||
|
|
||||||
|
let blockMeta = false;
|
||||||
|
for (let x = 0; x < 16; x++) {
|
||||||
|
for (let z = 0; z < 16; z++) {
|
||||||
|
for (let y = 0; y < 128; y++) {
|
||||||
|
blocks.writeByte(chunk[2][y][x][z]); // The block
|
||||||
|
if (blockMeta) {
|
||||||
|
metadata.writeByte(0x00); // TODO: Metadata
|
||||||
|
// Light level 15 for 2 blocks (1111 1111)
|
||||||
|
lighting.writeUByte(0xFF); // TODO: Lighting (Client seems to do it's own so it's not top priority)
|
||||||
|
}
|
||||||
|
// Hack for nibble stuff
|
||||||
|
blockMeta = !blockMeta;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// These are hacks for the nibbles
|
||||||
|
blocks.writeBuffer(metadata.buffer);
|
||||||
|
blocks.writeBuffer(lighting.buffer); // Block lighting
|
||||||
|
//blocks.writeBuffer(lighting.buffer); // Sky lighting (Looks like this isn't needed???)
|
||||||
|
|
||||||
|
// We're on another thread we don't care if we halt
|
||||||
|
const deflated = deflateSync(blocks.buffer);
|
||||||
|
writer.writeInt(deflated.length); // Compressed Size
|
||||||
|
writer.writeBuffer(deflated); // Compressed chunk data
|
||||||
|
|
||||||
|
return writer.buffer;
|
||||||
|
}
|
|
@ -6,8 +6,10 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
module.exports.Writer = class {
|
module.exports.Writer = class {
|
||||||
constructor() {
|
constructor(size = 0) {
|
||||||
this.buffer = Buffer.alloc(0);
|
this.buffer = Buffer.alloc(size);
|
||||||
|
this.offset = 0;
|
||||||
|
this.baseSize = size;
|
||||||
}
|
}
|
||||||
|
|
||||||
reset() {
|
reset() {
|
||||||
|
@ -23,10 +25,27 @@ module.exports.Writer = class {
|
||||||
}
|
}
|
||||||
|
|
||||||
writeByte(data = 0) {
|
writeByte(data = 0) {
|
||||||
const buff = Buffer.alloc(1);
|
if (this.baseSize == 0) {
|
||||||
buff.writeInt8(data, 0);
|
const buff = Buffer.alloc(1);
|
||||||
|
buff.writeInt8(data, 0);
|
||||||
|
|
||||||
this.writeBuffer(buff);
|
this.writeBuffer(buff);
|
||||||
|
} else {
|
||||||
|
this.buffer.writeInt8(data, this.offset);
|
||||||
|
this.offset += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
writeUByte(data = 0) {
|
||||||
|
if (this.baseSize == 0) {
|
||||||
|
const buff = Buffer.alloc(1);
|
||||||
|
buff.writeUInt8(data, 0);
|
||||||
|
|
||||||
|
this.writeBuffer(buff);
|
||||||
|
} else {
|
||||||
|
this.buffer.writeUInt8(data, this.offset);
|
||||||
|
this.offset += 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
writeByteArray(data = [0]) {
|
writeByteArray(data = [0]) {
|
||||||
|
|
|
@ -1,11 +1,8 @@
|
||||||
|
const { Worker } = require('worker_threads');
|
||||||
const FunkyArray = require("./Util/funkyArray.js");
|
const FunkyArray = require("./Util/funkyArray.js");
|
||||||
const bufferStuff = require("./bufferStuff.js");
|
|
||||||
|
|
||||||
const config = require("../config.json");
|
const config = require("../config.json");
|
||||||
|
|
||||||
const { Worker } = require('worker_threads');
|
const workerPath = `${__dirname}/Workers/ChunkWorker.js`;
|
||||||
|
|
||||||
const workerPath = __dirname + "/Workers/ChunkPacketGenerator.js";
|
|
||||||
|
|
||||||
module.exports = class {
|
module.exports = class {
|
||||||
constructor() {
|
constructor() {
|
||||||
|
@ -17,7 +14,6 @@ module.exports = class {
|
||||||
|
|
||||||
this.threadPool = [];
|
this.threadPool = [];
|
||||||
this.workPool = new FunkyArray();
|
this.workPool = new FunkyArray();
|
||||||
|
|
||||||
this.toRemove = [];
|
this.toRemove = [];
|
||||||
|
|
||||||
// WoAh!!! Thread pool in js!?!??!???!11!?!?!
|
// WoAh!!! Thread pool in js!?!??!???!11!?!?!
|
||||||
|
@ -30,10 +26,6 @@ module.exports = class {
|
||||||
case "chunk":
|
case "chunk":
|
||||||
const user = global.getUserByKey(data[2]);
|
const user = global.getUserByKey(data[2]);
|
||||||
user.chunksToSend.add(Buffer.from(data[1]));
|
user.chunksToSend.add(Buffer.from(data[1]));
|
||||||
break;
|
|
||||||
|
|
||||||
// Specific to the chunk task as multiple of them are sent before removal
|
|
||||||
case "remove":
|
|
||||||
this.toRemove.push(data[1]);
|
this.toRemove.push(data[1]);
|
||||||
this.threadPool[myID][0] = false;
|
this.threadPool[myID][0] = false;
|
||||||
break;
|
break;
|
||||||
|
@ -102,10 +94,10 @@ module.exports = class {
|
||||||
}
|
}
|
||||||
|
|
||||||
setBlock(id = 0, x = 0, y = 0, z = 0) {
|
setBlock(id = 0, x = 0, y = 0, z = 0) {
|
||||||
if (y < 0 || y > 127) throw "Tried to set a block outside of the world!";
|
if (y < 0 || y > 127) return console.error("Tried to set a block outside of the world!");
|
||||||
|
|
||||||
const chunkX = Math.floor(x / 16);
|
const chunkX = Math.floor(x >> 4);
|
||||||
const chunkZ = Math.floor(z / 16);
|
const chunkZ = Math.floor(z >> 4);
|
||||||
const blockX = x - (16 * chunkX);
|
const blockX = x - (16 * chunkX);
|
||||||
const blockZ = z - (16 * chunkZ);
|
const blockZ = z - (16 * chunkZ);
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,10 @@
|
||||||
const bufferStuff = require("./bufferStuff.js");
|
const bufferStuff = require("./bufferStuff.js");
|
||||||
const ChunkManager = require("./chunkManager.js");
|
const ChunkManager = require("./chunkManager.js");
|
||||||
const User = require("./user.js");
|
const User = require("./user.js");
|
||||||
|
const EntityPlayer = require("./Entities/EntityPlayer.js");
|
||||||
const PacketMappingTable = require("./PacketMappingTable.js");
|
const PacketMappingTable = require("./PacketMappingTable.js");
|
||||||
const NamedPackets = require("./NamedPackets.js");
|
const NamedPackets = require("./NamedPackets.js");
|
||||||
|
const Converter = require("./Converter.js");
|
||||||
|
|
||||||
const Socket = require("net").Socket;
|
const Socket = require("net").Socket;
|
||||||
const uuid = require("uuid").v4;
|
const uuid = require("uuid").v4;
|
||||||
|
@ -23,6 +25,7 @@ global.getUserByKey = function(key) {
|
||||||
|
|
||||||
function addUser(socket) {
|
function addUser(socket) {
|
||||||
let user = new User(global.fromIDPool(), socket);
|
let user = new User(global.fromIDPool(), socket);
|
||||||
|
user.entityRef = new EntityPlayer(user.id, 8.5, 65.5, 8.5);
|
||||||
netUsers[user.id] = user;
|
netUsers[user.id] = user;
|
||||||
netUserKeys = Object.keys(netUsers);
|
netUserKeys = Object.keys(netUsers);
|
||||||
|
|
||||||
|
@ -59,12 +62,14 @@ module.exports.init = function(config) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Do chunk updates
|
// Do chunk updates
|
||||||
|
// Don't update if chunk is generating
|
||||||
if (!global.generatingChunks) {
|
if (!global.generatingChunks) {
|
||||||
let itemsToRemove = [];
|
let itemsToRemove = [];
|
||||||
// Do a max of 128 chunk updates per tick
|
// Do a max of 128 chunk updates per tick
|
||||||
for (let i = 0; i < Math.min(global.chunkManager.queuedBlockUpdates.getLength(), 128); i++) {
|
for (let i = 0; i < Math.min(global.chunkManager.queuedBlockUpdates.getLength(), 128); i++) {
|
||||||
const chunkUpdateKey = global.chunkManager.queuedBlockUpdates.itemKeys[i];
|
const chunkUpdateKey = global.chunkManager.queuedBlockUpdates.itemKeys[i];
|
||||||
const chunkUpdate = global.chunkManager.queuedBlockUpdates.items[chunkUpdateKey];
|
const chunkUpdate = global.chunkManager.queuedBlockUpdates.items[chunkUpdateKey];
|
||||||
|
// Don't update if chunk is nonexistant
|
||||||
if (global.chunkManager.chunks[chunkUpdate[1]] == null) continue;
|
if (global.chunkManager.chunks[chunkUpdate[1]] == null) continue;
|
||||||
if (global.chunkManager.chunks[chunkUpdate[1]][chunkUpdate[2]] == null) continue;
|
if (global.chunkManager.chunks[chunkUpdate[1]][chunkUpdate[2]] == null) continue;
|
||||||
itemsToRemove.push(chunkUpdateKey);
|
itemsToRemove.push(chunkUpdateKey);
|
||||||
|
@ -73,11 +78,13 @@ module.exports.init = function(config) {
|
||||||
global.chunkManager.chunks[chunkUpdate[1]][chunkUpdate[2]][chunkUpdate[3]][chunkUpdate[4]][chunkUpdate[5]] = chunkUpdate[0];
|
global.chunkManager.chunks[chunkUpdate[1]][chunkUpdate[2]][chunkUpdate[3]][chunkUpdate[4]][chunkUpdate[5]] = chunkUpdate[0];
|
||||||
|
|
||||||
const packet = new PacketMappingTable[NamedPackets.BlockChange](chunkUpdate[4] + (16 * chunkUpdate[1]), chunkUpdate[3], chunkUpdate[5] + (16 * chunkUpdate[2]), chunkUpdate[0]).writePacket();
|
const packet = new PacketMappingTable[NamedPackets.BlockChange](chunkUpdate[4] + (16 * chunkUpdate[1]), chunkUpdate[3], chunkUpdate[5] + (16 * chunkUpdate[2]), chunkUpdate[0]).writePacket();
|
||||||
for (let userKey in netUserKeys) {
|
for (let userKey of netUserKeys) {
|
||||||
const user = netUsers[userKey];
|
const user = netUsers[userKey];
|
||||||
if (user.loginFinished) user.socket.write(packet);
|
if (user.loginFinished) user.socket.write(packet);
|
||||||
}
|
}
|
||||||
} catch (e) {}
|
} catch (e) {
|
||||||
|
console.error(e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (let item of itemsToRemove) {
|
for (let item of itemsToRemove) {
|
||||||
|
@ -89,7 +96,7 @@ module.exports.init = function(config) {
|
||||||
for (let key of netUserKeys) {
|
for (let key of netUserKeys) {
|
||||||
const user = netUsers[key];
|
const user = netUsers[key];
|
||||||
|
|
||||||
|
//user.entityRef.onTick();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Send queued chunks to users
|
// Send queued chunks to users
|
||||||
|
@ -126,8 +133,12 @@ module.exports.connection = async function(socket = new Socket) {
|
||||||
const packetID = reader.readByte();
|
const packetID = reader.readByte();
|
||||||
|
|
||||||
switch(packetID) {
|
switch(packetID) {
|
||||||
|
case NamedPackets.Disconnect:
|
||||||
|
removeUser(thisUser.id);
|
||||||
|
break;
|
||||||
|
|
||||||
case NamedPackets.KeepAlive:
|
case NamedPackets.KeepAlive:
|
||||||
socket.write(new PacketMappingTable[NamedPackets.KeepAlive]().writePacket());
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case NamedPackets.LoginRequest:
|
case NamedPackets.LoginRequest:
|
||||||
|
@ -154,15 +165,21 @@ module.exports.connection = async function(socket = new Socket) {
|
||||||
netUsers[key].socket.write(joinMessage);
|
netUsers[key].socket.write(joinMessage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
socket.write(new PacketMappingTable[NamedPackets.SetSlot](0, 36, 3, 64, 0).writePacket());
|
||||||
|
|
||||||
socket.write(new PacketMappingTable[NamedPackets.PlayerPositionAndLook](8.5, 65 + 1.6200000047683716, 65, 8.5, 0, 0, false).writePacket());
|
socket.write(new PacketMappingTable[NamedPackets.PlayerPositionAndLook](8.5, 65 + 1.6200000047683716, 65, 8.5, 0, 0, false).writePacket());
|
||||||
|
|
||||||
thisUser.loginFinished = true;
|
thisUser.loginFinished = true;
|
||||||
|
|
||||||
|
// Send chunks
|
||||||
for (let x = -3; x < 4; x++) {
|
for (let x = -3; x < 4; x++) {
|
||||||
for (let z = -3; z < 4; z++) {
|
for (let z = -3; z < 4; z++) {
|
||||||
global.chunkManager.multiBlockChunk(x, z, thisUser);
|
global.chunkManager.multiBlockChunk(x, z, thisUser);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Send this user to other online users
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case NamedPackets.Handshake:
|
case NamedPackets.Handshake:
|
||||||
|
@ -211,6 +228,44 @@ module.exports.connection = async function(socket = new Socket) {
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case NamedPackets.Animation:
|
||||||
|
const EID = reader.readInt();
|
||||||
|
const cachedPacket = new PacketMappingTable[NamedPackets.Animation](thisUser.id, reader.readByte()).writePacket();
|
||||||
|
for (let key of netUserKeys) {
|
||||||
|
if (netUsers[key].id !== thisUser.id) netUsers[key].socket.write(cachedPacket);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NamedPackets.PlayerDigging:
|
||||||
|
const status = reader.readByte();
|
||||||
|
|
||||||
|
if (status == 2) {
|
||||||
|
const x = reader.readInt();
|
||||||
|
const y = reader.readByte();
|
||||||
|
const z = reader.readInt();
|
||||||
|
|
||||||
|
global.chunkManager.setBlock(0, x, y, z);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NamedPackets.PlayerBlockPlacement:
|
||||||
|
const x = reader.readInt();
|
||||||
|
const y = reader.readByte();
|
||||||
|
const z = reader.readInt();
|
||||||
|
let xOff = 0, yOff = 0, zOff = 0;
|
||||||
|
switch (reader.readByte()) { // direction
|
||||||
|
case 0: yOff = -1; break;
|
||||||
|
case 1: yOff = 1; break;
|
||||||
|
case 2: zOff = -1; break;
|
||||||
|
case 3: zOff = 1; break;
|
||||||
|
case 4: xOff = -1; break;
|
||||||
|
case 5: xOff = 1; break;
|
||||||
|
}
|
||||||
|
const block = reader.readShort();
|
||||||
|
|
||||||
|
global.chunkManager.setBlock(block, x + xOff, y + yOff, z + zOff);
|
||||||
|
break;
|
||||||
|
|
||||||
case NamedPackets.Player:
|
case NamedPackets.Player:
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in a new issue