96 lines
3.8 KiB
JavaScript
96 lines
3.8 KiB
JavaScript
import PlayerEntity from "./PlayerEntity.js";
|
|
import ClientPlayerMovementPacket from "../network/packet/play/client/ClientPlayerMovementPacket.js";
|
|
import ClientPlayerRotationPacket from "../network/packet/play/client/ClientPlayerRotationPacket.js";
|
|
import ClientPlayerPositionPacket from "../network/packet/play/client/ClientPlayerPositionPacket.js";
|
|
import ClientPlayerPositionRotationPacket from "../network/packet/play/client/ClientPlayerPositionRotationPacket.js";
|
|
import ClientPlayerStatePacket from "../network/packet/play/client/ClientPlayerStatePacket.js";
|
|
import ClientSwingArmPacket from "../network/packet/play/client/ClientSwingArmPacket.js";
|
|
|
|
export default class PlayerEntityMultiplayer extends PlayerEntity {
|
|
|
|
constructor(minecraft, world, networkHandler, id) {
|
|
super(minecraft, world, id);
|
|
|
|
this.networkHandler = networkHandler;
|
|
|
|
this.positionUpdateTicks = 0;
|
|
|
|
this.lastReportedX = 0;
|
|
this.lastReportedY = 0;
|
|
this.lastReportedZ = 0;
|
|
|
|
this.lastReportedYaw = 0;
|
|
this.lastReportedPitch = 0;
|
|
|
|
this.serverSprintState = false;
|
|
this.serverSneakState = false;
|
|
}
|
|
|
|
onUpdate() {
|
|
super.onUpdate();
|
|
this.onUpdateWalkingPlayer();
|
|
}
|
|
|
|
swingArm() {
|
|
super.swingArm();
|
|
this.networkHandler.sendPacket(new ClientSwingArmPacket());
|
|
}
|
|
|
|
onUpdateWalkingPlayer() {
|
|
// Send sprinting to server
|
|
let isSprinting = this.isSprinting();
|
|
if (isSprinting !== this.serverSprintState) {
|
|
let state = isSprinting ? ClientPlayerStatePacket.START_SPRINTING : ClientPlayerStatePacket.STOP_SPRINTING;
|
|
this.networkHandler.sendPacket(new ClientPlayerStatePacket(this.id, state));
|
|
this.serverSprintState = isSprinting;
|
|
}
|
|
|
|
// Send sneaking to server
|
|
let isSneaking = this.isSneaking();
|
|
if (isSneaking !== this.serverSneakState) {
|
|
let state = isSneaking ? ClientPlayerStatePacket.START_SNEAKING : ClientPlayerStatePacket.STOP_SNEAKING;
|
|
this.networkHandler.sendPacket(new ClientPlayerStatePacket(this.id, state));
|
|
this.serverSneakState = isSneaking;
|
|
}
|
|
|
|
let movementX = this.x - this.lastReportedX;
|
|
let movementY = this.y - this.lastReportedY;
|
|
let movementZ = this.z - this.lastReportedZ;
|
|
|
|
let movementYaw = this.rotationYaw - this.lastReportedYaw;
|
|
let movementPitch = this.rotationPitch - this.lastReportedPitch;
|
|
|
|
let reportPosition = movementX * movementX + movementY * movementY + movementZ * movementZ > 9.0E-4 || this.positionUpdateTicks >= 20;
|
|
let reportRotation = movementYaw !== 0.0 || movementPitch !== 0.0;
|
|
|
|
// Send position and rotation to server
|
|
if (reportPosition && reportRotation) {
|
|
this.networkHandler.sendPacket(new ClientPlayerPositionRotationPacket(this.onGround, this.x, this.y, this.z, this.rotationYaw, this.rotationPitch));
|
|
} else if (reportPosition) {
|
|
this.networkHandler.sendPacket(new ClientPlayerPositionPacket(this.onGround, this.x, this.y, this.z));
|
|
} else if (reportRotation) {
|
|
this.networkHandler.sendPacket(new ClientPlayerRotationPacket(this.onGround, this.rotationYaw, this.rotationPitch));
|
|
} else {
|
|
this.networkHandler.sendPacket(new ClientPlayerMovementPacket(this.onGround));
|
|
}
|
|
|
|
this.positionUpdateTicks++;
|
|
|
|
if (reportPosition) {
|
|
this.lastReportedX = this.x;
|
|
this.lastReportedY = this.y;
|
|
this.lastReportedZ = this.z;
|
|
this.positionUpdateTicks = 0;
|
|
}
|
|
|
|
if (reportRotation) {
|
|
this.lastReportedYaw = this.rotationYaw;
|
|
this.lastReportedPitch = this.rotationPitch;
|
|
}
|
|
}
|
|
|
|
getNetworkHandler() {
|
|
return this.networkHandler;
|
|
}
|
|
|
|
} |