Extreme jank to support players
This commit is contained in:
parent
9084a1e69f
commit
1001bb88fe
8 changed files with 192 additions and 11 deletions
|
@ -1,7 +1,23 @@
|
||||||
module.exports.toAbsoluteInt = function(float = 0.0) {
|
module.exports.toAbsoluteInt = function(float = 0.0) {
|
||||||
return Math.round(float * 32.0);
|
return Math.floor(float * 32.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports.to360Fraction = function(float = 0.0) {
|
module.exports.to360Fraction = function(float = 0.0) {
|
||||||
return Math.floor((float / 360) * 256);
|
if (float < 0) {
|
||||||
|
return Math.abs(Math.max(Math.floor((map(float, 0, -360, 360, 0) / 360) * 256) - 1, 0));
|
||||||
|
} else if (float > 0) {
|
||||||
|
return Math.max(Math.floor((float / 360) * 256) - 1, 0);
|
||||||
|
}
|
||||||
|
//return Math.max(Math.floor((float / 360) * 256), 0) - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
function map(input, inputMin, inputMax, outputMin, outputMax) {
|
||||||
|
const newv = (input - inputMin) / (inputMax - inputMin) * (outputMax - outputMin) + outputMin;
|
||||||
|
|
||||||
|
if (outputMin < outputMax) return constrain(newv, outputMin, outputMax);
|
||||||
|
else return constrain(newv, outputMax, outputMin);
|
||||||
|
}
|
||||||
|
|
||||||
|
function constrain(input, low, high) {
|
||||||
|
return Math.max(Math.min(input, high), low);
|
||||||
}
|
}
|
|
@ -1,10 +1,65 @@
|
||||||
const EntityLiving = require("./EntityLiving.js");
|
const EntityLiving = require("./EntityLiving.js");
|
||||||
|
const user = require("../user.js");
|
||||||
|
|
||||||
|
const Converter = require("../Converter.js");
|
||||||
|
const PacketMappingTable = require("../PacketMappingTable.js");
|
||||||
|
const NamedPackets = require("../NamedPackets.js");
|
||||||
|
|
||||||
class EntityPlayer extends EntityLiving {
|
class EntityPlayer extends EntityLiving {
|
||||||
constructor(EID = 0, x = 0, y = 0, z = 0) {
|
constructor(parent = new user, x = 0, y = 0, z = 0) {
|
||||||
super(EID, x, y, z);
|
super(parent.id, x, y, z);
|
||||||
|
|
||||||
|
this.lastX = 0;
|
||||||
|
this.lastY = 0;
|
||||||
|
this.lastZ = 0;
|
||||||
|
this.absX = 0;
|
||||||
|
this.absY = 0;
|
||||||
|
this.absZ = 0;
|
||||||
|
|
||||||
|
this.absYaw = 0;
|
||||||
|
this.absPitch = 0;
|
||||||
|
|
||||||
|
this.lastYaw = 0;
|
||||||
|
this.lastPitch = 0;
|
||||||
|
|
||||||
|
this.allPacket = new PacketMappingTable[NamedPackets.EntityTeleport](this.EID, this.x, this.y, this.z, this.absYaw, this.absPitch);
|
||||||
|
this.allPacket.soup();
|
||||||
|
this.allPacket.writePacket();
|
||||||
|
|
||||||
|
this.parentPlayer = parent;
|
||||||
|
}
|
||||||
|
|
||||||
|
onTick() {
|
||||||
|
super.onTick();
|
||||||
|
|
||||||
|
this.absX = Math.floor(this.x);
|
||||||
|
this.absY = Math.floor(this.y);
|
||||||
|
this.absZ = Math.floor(this.z);
|
||||||
|
|
||||||
|
this.absYaw = Math.floor(this.yaw);
|
||||||
|
this.absPitch = Math.floor(this.pitch);
|
||||||
|
|
||||||
|
if ((this.absX != this.lastX || this.absY != this.lastY || this.absZ != this.lastZ)) {
|
||||||
|
// all
|
||||||
|
this.allPacket.writer.offset = 5;
|
||||||
|
this.allPacket.writer.writeInt(Converter.toAbsoluteInt(this.x));
|
||||||
|
this.allPacket.writer.writeInt(Converter.toAbsoluteInt(this.y));
|
||||||
|
this.allPacket.writer.writeInt(Converter.toAbsoluteInt(this.z));
|
||||||
|
this.allPacket.writer.writeUByte(Converter.to360Fraction(this.absYaw));
|
||||||
|
this.allPacket.writer.writeUByte(Converter.to360Fraction(this.absPitch));
|
||||||
|
|
||||||
|
global.sendToAllPlayersButSelf(this.EID, this.allPacket.toBuffer());
|
||||||
|
} else if (this.absYaw != this.lastYaw || this.absPitch != this.lastPitch) {
|
||||||
|
// look only
|
||||||
|
global.sendToAllPlayersButSelf(this.EID, new PacketMappingTable[NamedPackets.EntityLook](this.EID, this.absYaw, this.absPitch).writePacket());
|
||||||
|
}
|
||||||
|
|
||||||
|
this.lastYaw = this.absYaw;
|
||||||
|
this.lastPitch = this.absPitch;
|
||||||
|
|
||||||
|
this.lastX = this.absX;
|
||||||
|
this.lastY = this.absY;
|
||||||
|
this.lastZ = this.absZ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -8,6 +8,8 @@ const Packet0KeepAlive = require("./Packets/Packet0KeepAlive.js"),
|
||||||
Packet13PlayerPositionAndLook = require("./Packets/Packet13PlayerPositionAndLook.js"),
|
Packet13PlayerPositionAndLook = require("./Packets/Packet13PlayerPositionAndLook.js"),
|
||||||
Packet18Animation = require("./Packets/Packet18Animation.js"),
|
Packet18Animation = require("./Packets/Packet18Animation.js"),
|
||||||
Packet20NamedEntitySpawn = require("./Packets/Packet20NamedEntitySpawn.js"),
|
Packet20NamedEntitySpawn = require("./Packets/Packet20NamedEntitySpawn.js"),
|
||||||
|
Packet32EntityLook = require("./Packets/Packet32EntityLook.js"),
|
||||||
|
Packet34EntityTeleport = require("./Packets/Packet34EntityTeleport.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");
|
Packet103SetSlot = require("./Packets/Packet103SetSlot.js");
|
||||||
|
@ -23,6 +25,8 @@ const mappingTable = {
|
||||||
0x0D: Packet13PlayerPositionAndLook,
|
0x0D: Packet13PlayerPositionAndLook,
|
||||||
0x12: Packet18Animation,
|
0x12: Packet18Animation,
|
||||||
0x14: Packet20NamedEntitySpawn,
|
0x14: Packet20NamedEntitySpawn,
|
||||||
|
0x20: Packet32EntityLook,
|
||||||
|
0x22: Packet34EntityTeleport,
|
||||||
0x32: Packet50PreChunk,
|
0x32: Packet50PreChunk,
|
||||||
0x35: Packet53BlockChange,
|
0x35: Packet53BlockChange,
|
||||||
0x67: Packet103SetSlot
|
0x67: Packet103SetSlot
|
||||||
|
|
|
@ -4,11 +4,13 @@ module.exports = class {
|
||||||
constructor(packetID = 0x00) {
|
constructor(packetID = 0x00) {
|
||||||
this.id = packetID;
|
this.id = packetID;
|
||||||
|
|
||||||
|
this.packetSize = 0;
|
||||||
|
|
||||||
this.writer = null;
|
this.writer = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
writePacket() {
|
writePacket() {
|
||||||
this.writer = new bufferStuff.Writer();
|
this.writer = new bufferStuff.Writer(this.packetSize);
|
||||||
|
|
||||||
this.writer.writeByte(this.id);
|
this.writer.writeByte(this.id);
|
||||||
|
|
||||||
|
|
|
@ -23,8 +23,8 @@ class Packet20NamedEntitySpawn extends Packet {
|
||||||
this.writer.writeInt(this.absX);
|
this.writer.writeInt(this.absX);
|
||||||
this.writer.writeInt(this.absY);
|
this.writer.writeInt(this.absY);
|
||||||
this.writer.writeInt(this.absZ);
|
this.writer.writeInt(this.absZ);
|
||||||
this.writer.writeByte(this.packedYaw);
|
this.writer.writeUByte(this.packedYaw);
|
||||||
this.writer.writeByte(this.packedPitch);
|
this.writer.writeUByte(this.packedPitch);
|
||||||
this.writer.writeShort(this.currentItem);
|
this.writer.writeShort(this.currentItem);
|
||||||
|
|
||||||
return this.toBuffer();
|
return this.toBuffer();
|
||||||
|
|
26
server/Packets/Packet32EntityLook.js
Normal file
26
server/Packets/Packet32EntityLook.js
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
const Packet = require("./Packet.js");
|
||||||
|
const Converter = require("../Converter.js");
|
||||||
|
|
||||||
|
class Packet32EntityLook extends Packet {
|
||||||
|
constructor(EID = 0, yaw = 0, pitch = 0) {
|
||||||
|
super(0x20);
|
||||||
|
|
||||||
|
this.packetSize = 7;
|
||||||
|
|
||||||
|
this.EID = EID;
|
||||||
|
this.packedYaw = Converter.to360Fraction(yaw);
|
||||||
|
this.packedPitch = Converter.to360Fraction(pitch);
|
||||||
|
}
|
||||||
|
|
||||||
|
writePacket() {
|
||||||
|
super.writePacket();
|
||||||
|
|
||||||
|
this.writer.writeInt(this.EID);
|
||||||
|
this.writer.writeUByte(this.packedYaw);
|
||||||
|
this.writer.writeUByte(this.packedPitch);
|
||||||
|
|
||||||
|
return this.toBuffer();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = Packet32EntityLook;
|
34
server/Packets/Packet34EntityTeleport.js
Normal file
34
server/Packets/Packet34EntityTeleport.js
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
const Packet = require("./Packet.js");
|
||||||
|
const Converter = require("../Converter.js");
|
||||||
|
|
||||||
|
class Packet34EntityTeleport extends Packet {
|
||||||
|
constructor(EID = 0, x = 0, y = 0, z = 0, yaw = 0, pitch = 0) {
|
||||||
|
super(0x22);
|
||||||
|
|
||||||
|
this.packetSize = 19;
|
||||||
|
|
||||||
|
this.EID = EID;
|
||||||
|
this.absX = Converter.toAbsoluteInt(x);
|
||||||
|
this.absY = Converter.toAbsoluteInt(y);
|
||||||
|
this.absZ = Converter.toAbsoluteInt(z);
|
||||||
|
this.packedYaw = Converter.to360Fraction(yaw);
|
||||||
|
this.packedPitch = Converter.to360Fraction(pitch);
|
||||||
|
}
|
||||||
|
|
||||||
|
soup() {
|
||||||
|
super.writePacket();
|
||||||
|
this.writer.writeInt(this.EID);
|
||||||
|
}
|
||||||
|
|
||||||
|
writePacket() {
|
||||||
|
this.writer.writeInt(this.absX);
|
||||||
|
this.writer.writeInt(this.absY);
|
||||||
|
this.writer.writeInt(this.absZ);
|
||||||
|
this.writer.writeUByte(this.packedYaw);
|
||||||
|
this.writer.writeUByte(this.packedPitch);
|
||||||
|
|
||||||
|
return this.toBuffer();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = Packet34EntityTeleport;
|
|
@ -22,9 +22,24 @@ global.getUserByKey = function(key) {
|
||||||
return netUsers[key];
|
return netUsers[key];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
global.sendToAllPlayers = function(buffer = Buffer.alloc(0)) {
|
||||||
|
for (let key of netUserKeys) {
|
||||||
|
const user = netUsers[key];
|
||||||
|
user.socket.write(buffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
global.sendToAllPlayersButSelf = function(id, buffer = Buffer.alloc(0)) {
|
||||||
|
for (let key of netUserKeys) {
|
||||||
|
if (key == id) continue;
|
||||||
|
const user = netUsers[key];
|
||||||
|
user.socket.write(buffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
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);
|
user.entityRef = new EntityPlayer(user, 8.5, 65.5, 8.5);
|
||||||
netUsers[user.id] = user;
|
netUsers[user.id] = user;
|
||||||
netUserKeys = Object.keys(netUsers);
|
netUserKeys = Object.keys(netUsers);
|
||||||
|
|
||||||
|
@ -95,7 +110,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();
|
if (user.loginFinished) user.entityRef.onTick();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Send queued chunks to users
|
// Send queued chunks to users
|
||||||
|
@ -177,8 +192,16 @@ module.exports.connection = async function(socket = new Socket) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Send this user to other online users
|
// Send this user to other online user
|
||||||
|
global.sendToAllPlayersButSelf(thisUser.id, new PacketMappingTable[NamedPackets.NamedEntitySpawn](thisUser.id, thisUser.username, thisUser.entityRef.x, thisUser.entityRef.y, thisUser.entityRef.z, thisUser.entityRef.yaw, thisUser.entityRef.pitch, 0).writePacket());
|
||||||
|
|
||||||
|
// send all online users to this user
|
||||||
|
for (let key of netUserKeys) {
|
||||||
|
if (key == thisUser.id) continue;
|
||||||
|
const user = netUsers[key];
|
||||||
|
|
||||||
|
socket.write(new PacketMappingTable[NamedPackets.NamedEntitySpawn](user.id, user.username, user.entityRef.x, user.entityRef.y, user.entityRef.z, user.entityRef.yaw, user.entityRef.pitch, 0).writePacket());
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case NamedPackets.Handshake:
|
case NamedPackets.Handshake:
|
||||||
|
@ -227,6 +250,27 @@ module.exports.connection = async function(socket = new Socket) {
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case NamedPackets.PlayerLook:
|
||||||
|
thisUser.entityRef.yaw = reader.readFloat() % 360 % -360;
|
||||||
|
thisUser.entityRef.pitch = reader.readFloat() % 360 % -360;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NamedPackets.PlayerPosition:
|
||||||
|
thisUser.entityRef.x = reader.readDouble();
|
||||||
|
thisUser.entityRef.y = reader.readDouble();
|
||||||
|
reader.readDouble(); // stance
|
||||||
|
thisUser.entityRef.z = reader.readDouble();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NamedPackets.PlayerPositionAndLook:
|
||||||
|
thisUser.entityRef.x = reader.readDouble();
|
||||||
|
thisUser.entityRef.y = reader.readDouble();
|
||||||
|
reader.readDouble(); // stance
|
||||||
|
thisUser.entityRef.z = reader.readDouble();
|
||||||
|
thisUser.entityRef.yaw = reader.readFloat() % 360 % -360;
|
||||||
|
thisUser.entityRef.pitch = reader.readFloat() % 360 % -360;
|
||||||
|
break;
|
||||||
|
|
||||||
case NamedPackets.Animation:
|
case NamedPackets.Animation:
|
||||||
const EID = reader.readInt();
|
const EID = reader.readInt();
|
||||||
const cachedPacket = new PacketMappingTable[NamedPackets.Animation](thisUser.id, reader.readByte()).writePacket();
|
const cachedPacket = new PacketMappingTable[NamedPackets.Animation](thisUser.id, reader.readByte()).writePacket();
|
||||||
|
|
Loading…
Reference in a new issue