restructure entity update
(cherry picked from commit 21c460ee8e62fb81cdd9ac607b1e8e9c2eabc211)
This commit is contained in:
@@ -173,7 +173,7 @@ window.Minecraft = class {
|
|||||||
this.world.onTick();
|
this.world.onTick();
|
||||||
|
|
||||||
// Tick the player
|
// Tick the player
|
||||||
this.player.onTick();
|
this.player.onUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update loading progress
|
// Update loading progress
|
||||||
|
|||||||
@@ -1,7 +1,50 @@
|
|||||||
window.Entity = class {
|
window.Entity = class {
|
||||||
|
|
||||||
constructor() {
|
constructor(minecraft, world) {
|
||||||
|
this.minecraft = minecraft;
|
||||||
|
this.world = world;
|
||||||
|
|
||||||
this.group = new THREE.Object3D();
|
this.group = new THREE.Object3D();
|
||||||
|
|
||||||
|
this.x = 0;
|
||||||
|
this.y = 0;
|
||||||
|
this.z = 0;
|
||||||
|
|
||||||
|
this.motionX = 0;
|
||||||
|
this.motionY = 0;
|
||||||
|
this.motionZ = 0;
|
||||||
|
|
||||||
|
this.onGround = false;
|
||||||
|
|
||||||
|
this.sneaking = false;
|
||||||
|
|
||||||
|
this.yaw = 0;
|
||||||
|
this.pitch = 0;
|
||||||
|
this.renderYawOffset = 0;
|
||||||
|
|
||||||
|
this.prevX = 0;
|
||||||
|
this.prevY = 0;
|
||||||
|
this.prevZ = 0;
|
||||||
|
|
||||||
|
this.prevYaw = 0;
|
||||||
|
this.prevPitch = 0;
|
||||||
|
this.prevRenderYawOffset = 0;
|
||||||
|
|
||||||
|
this.distanceWalked = 0;
|
||||||
|
this.nextStepDistance = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
onUpdate() {
|
||||||
|
this.onEntityUpdate();
|
||||||
|
}
|
||||||
|
|
||||||
|
onEntityUpdate() {
|
||||||
|
this.prevX = this.x;
|
||||||
|
this.prevY = this.y;
|
||||||
|
this.prevZ = this.z;
|
||||||
|
|
||||||
|
this.prevPitch = this.pitch;
|
||||||
|
this.prevYaw = this.yaw;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,82 @@
|
|||||||
|
window.EntityLiving = class extends Entity {
|
||||||
|
|
||||||
|
constructor(minecraft, world) {
|
||||||
|
super(minecraft, world);
|
||||||
|
|
||||||
|
this.jumpTicks = 0;
|
||||||
|
|
||||||
|
this.jumping = false;
|
||||||
|
|
||||||
|
this.moveForward = 0.0;
|
||||||
|
this.moveStrafing = 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
onUpdate() {
|
||||||
|
super.onUpdate();
|
||||||
|
this.onLivingUpdate();
|
||||||
|
|
||||||
|
while (this.renderYawOffset - this.prevRenderYawOffset < -180.0) {
|
||||||
|
this.prevRenderYawOffset -= 360.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (this.renderYawOffset - this.prevRenderYawOffset >= 180.0) {
|
||||||
|
this.prevRenderYawOffset += 360.0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
onLivingUpdate() {
|
||||||
|
if (this.jumpTicks > 0) {
|
||||||
|
--this.jumpTicks;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Stop if too slow
|
||||||
|
if (Math.abs(this.motionX) < 0.003) {
|
||||||
|
this.motionX = 0.0;
|
||||||
|
}
|
||||||
|
if (Math.abs(this.motionY) < 0.003) {
|
||||||
|
this.motionY = 0.0;
|
||||||
|
}
|
||||||
|
if (Math.abs(this.motionZ) < 0.003) {
|
||||||
|
this.motionZ = 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Jump
|
||||||
|
if (this.jumping) {
|
||||||
|
if (this.isInWater()) {
|
||||||
|
this.motionY += 0.04;
|
||||||
|
} else if (this.onGround && this.jumpTicks === 0) {
|
||||||
|
this.jump();
|
||||||
|
this.jumpTicks = 10;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this.jumpTicks = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.moveForward *= 0.98;
|
||||||
|
this.moveStrafing *= 0.98;
|
||||||
|
|
||||||
|
this.moveEntityWithHeading(this.moveForward, this.moveStrafing);
|
||||||
|
}
|
||||||
|
|
||||||
|
moveEntityWithHeading(moveForward, moveStrafing) {
|
||||||
|
if (this.flying) {
|
||||||
|
this.travelFlying(moveForward, 0, moveStrafing);
|
||||||
|
} else {
|
||||||
|
if (this.isInWater()) {
|
||||||
|
// Is inside of water
|
||||||
|
this.travelInWater(moveForward, 0, moveStrafing);
|
||||||
|
} else {
|
||||||
|
// Is on land
|
||||||
|
this.travel(moveForward, 0, moveStrafing);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
onEntityUpdate() {
|
||||||
|
this.prevRenderYawOffset = this.renderYawOffset;
|
||||||
|
|
||||||
|
super.onEntityUpdate();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,29 +1,9 @@
|
|||||||
window.PlayerEntity = class extends Entity {
|
window.PlayerEntity = class extends EntityLiving {
|
||||||
|
|
||||||
static name = "PlayerEntity";
|
static name = "PlayerEntity";
|
||||||
|
|
||||||
constructor(minecraft, world) {
|
constructor(minecraft, world) {
|
||||||
super();
|
super(minecraft, world);
|
||||||
|
|
||||||
this.minecraft = minecraft;
|
|
||||||
this.world = world;
|
|
||||||
|
|
||||||
this.prevX = 0;
|
|
||||||
this.prevY = 0;
|
|
||||||
this.prevZ = 0;
|
|
||||||
|
|
||||||
this.x = 0;
|
|
||||||
this.y = 0;
|
|
||||||
this.z = 0;
|
|
||||||
|
|
||||||
this.motionX = 0;
|
|
||||||
this.motionY = 0;
|
|
||||||
this.motionZ = 0;
|
|
||||||
|
|
||||||
this.yaw = 0;
|
|
||||||
this.pitch = 0;
|
|
||||||
|
|
||||||
this.onGround = false;
|
|
||||||
|
|
||||||
this.collision = false;
|
this.collision = false;
|
||||||
|
|
||||||
@@ -32,24 +12,15 @@ window.PlayerEntity = class extends Entity {
|
|||||||
this.flySpeed = 0.05;
|
this.flySpeed = 0.05;
|
||||||
this.stepHeight = 0.5;
|
this.stepHeight = 0.5;
|
||||||
|
|
||||||
this.moveForward = 0.0;
|
|
||||||
this.moveStrafing = 0.0;
|
|
||||||
|
|
||||||
this.jumpTicks = 0;
|
|
||||||
this.flyToggleTimer = 0;
|
this.flyToggleTimer = 0;
|
||||||
this.sprintToggleTimer = 0;
|
this.sprintToggleTimer = 0;
|
||||||
|
|
||||||
this.jumping = false;
|
|
||||||
this.sprinting = false;
|
this.sprinting = false;
|
||||||
this.sneaking = false;
|
|
||||||
this.flying = false;
|
this.flying = false;
|
||||||
|
|
||||||
this.prevFovModifier = 0;
|
this.prevFovModifier = 0;
|
||||||
this.fovModifier = 0;
|
this.fovModifier = 0;
|
||||||
this.timeFovChanged = 0;
|
this.timeFovChanged = 0;
|
||||||
|
|
||||||
this.distanceWalked = 0;
|
|
||||||
this.nextStepDistance = 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
respawn() {
|
respawn() {
|
||||||
@@ -92,7 +63,18 @@ window.PlayerEntity = class extends Entity {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
onTick() {
|
onUpdate() {
|
||||||
|
super.onUpdate();
|
||||||
|
}
|
||||||
|
|
||||||
|
onLivingUpdate() {
|
||||||
|
if (this.sprintToggleTimer > 0) {
|
||||||
|
--this.sprintToggleTimer;
|
||||||
|
}
|
||||||
|
if (this.flyToggleTimer > 0) {
|
||||||
|
--this.flyToggleTimer;
|
||||||
|
}
|
||||||
|
|
||||||
let prevMoveForward = this.moveForward;
|
let prevMoveForward = this.moveForward;
|
||||||
let prevJumping = this.jumping;
|
let prevJumping = this.jumping;
|
||||||
|
|
||||||
@@ -122,70 +104,18 @@ window.PlayerEntity = class extends Entity {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.jumpTicks > 0) {
|
if (this.sprinting && (this.moveForward <= 0 || this.collision || this.sneaking)) {
|
||||||
--this.jumpTicks;
|
this.sprinting = false;
|
||||||
|
|
||||||
|
this.updateFOVModifier();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.flyToggleTimer > 0) {
|
super.onLivingUpdate();
|
||||||
--this.flyToggleTimer;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.sprintToggleTimer > 0) {
|
|
||||||
--this.sprintToggleTimer;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.prevX = this.x;
|
|
||||||
this.prevY = this.y;
|
|
||||||
this.prevZ = this.z;
|
|
||||||
|
|
||||||
// Stop if too slow
|
|
||||||
if (Math.abs(this.motionX) < 0.003) {
|
|
||||||
this.motionX = 0.0;
|
|
||||||
}
|
|
||||||
if (Math.abs(this.motionY) < 0.003) {
|
|
||||||
this.motionY = 0.0;
|
|
||||||
}
|
|
||||||
if (Math.abs(this.motionZ) < 0.003) {
|
|
||||||
this.motionZ = 0.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Jump
|
|
||||||
if (this.jumping) {
|
|
||||||
if (this.isInWater()) {
|
|
||||||
this.motionY += 0.04;
|
|
||||||
} else if (this.onGround && this.jumpTicks === 0) {
|
|
||||||
this.jump();
|
|
||||||
this.jumpTicks = 10;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
this.jumpTicks = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.moveStrafing *= 0.98;
|
|
||||||
this.moveForward *= 0.98;
|
|
||||||
|
|
||||||
if (this.flying) {
|
|
||||||
this.travelFlying(this.moveForward, 0, this.moveStrafing);
|
|
||||||
} else {
|
|
||||||
if (this.isInWater()) {
|
|
||||||
// Is inside of water
|
|
||||||
this.travelInWater(this.moveForward, 0, this.moveStrafing);
|
|
||||||
} else {
|
|
||||||
// Is on land
|
|
||||||
this.travel(this.moveForward, 0, this.moveStrafing);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
this.jumpMovementFactor = this.speedInAir;
|
this.jumpMovementFactor = this.speedInAir;
|
||||||
|
|
||||||
if (this.sprinting) {
|
if (this.sprinting) {
|
||||||
this.jumpMovementFactor = this.jumpMovementFactor + this.speedInAir * 0.3;
|
this.jumpMovementFactor = this.jumpMovementFactor + this.speedInAir * 0.3;
|
||||||
|
|
||||||
if (this.moveForward <= 0 || this.collision || this.sneaking) {
|
|
||||||
this.sprinting = false;
|
|
||||||
|
|
||||||
this.updateFOVModifier();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -11,6 +11,9 @@ window.EntityRenderer = class {
|
|||||||
render(entity, partialTicks) {
|
render(entity, partialTicks) {
|
||||||
let group = entity.group;
|
let group = entity.group;
|
||||||
|
|
||||||
|
let rotationOffset = this.interpolateRotation(entity.prevRenderYawOffset, entity.renderYawOffset, partialTicks);
|
||||||
|
let rotationHead = this.interpolateRotation(entity.prevRotationYawHead, entity.rotationYawHead, partialTicks);
|
||||||
|
|
||||||
// Interpolate entity position
|
// Interpolate entity position
|
||||||
let interpolatedX = entity.prevX + (entity.x - entity.prevX) * partialTicks;
|
let interpolatedX = entity.prevX + (entity.x - entity.prevX) * partialTicks;
|
||||||
let interpolatedY = entity.prevY + (entity.y - entity.prevY) * partialTicks;
|
let interpolatedY = entity.prevY + (entity.y - entity.prevY) * partialTicks;
|
||||||
@@ -33,4 +36,13 @@ window.EntityRenderer = class {
|
|||||||
this.model.render(group, time);
|
this.model.render(group, time);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interpolateRotation(prevValue, value, partialTicks) {
|
||||||
|
let factor;
|
||||||
|
for (factor = value - prevValue; factor < -180.0; factor += 360.0) {}
|
||||||
|
while (factor >= 180.0) {
|
||||||
|
factor -= 360.0;
|
||||||
|
}
|
||||||
|
return prevValue + partialTicks * factor;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -127,6 +127,7 @@ loadTexture([
|
|||||||
"src/js/net/minecraft/client/world/generator/noise/NoiseGeneratorCombined.js",
|
"src/js/net/minecraft/client/world/generator/noise/NoiseGeneratorCombined.js",
|
||||||
"src/js/net/minecraft/client/world/generator/WorldGenerator.js",
|
"src/js/net/minecraft/client/world/generator/WorldGenerator.js",
|
||||||
"src/js/net/minecraft/client/entity/Entity.js",
|
"src/js/net/minecraft/client/entity/Entity.js",
|
||||||
|
"src/js/net/minecraft/client/entity/EntityLiving.js",
|
||||||
"src/js/net/minecraft/client/entity/PlayerEntity.js",
|
"src/js/net/minecraft/client/entity/PlayerEntity.js",
|
||||||
"src/js/net/minecraft/client/inventory/Inventory.js",
|
"src/js/net/minecraft/client/inventory/Inventory.js",
|
||||||
"src/js/net/minecraft/client/GameSettings.js",
|
"src/js/net/minecraft/client/GameSettings.js",
|
||||||
|
|||||||
Reference in New Issue
Block a user