Drowning and damage updates

This commit is contained in:
Holly Stubbs 2023-08-20 01:17:27 +01:00
parent 310f1bd091
commit 84bbe26454
Signed by: tgpholly
GPG key ID: B8583C4B7D18119E
2 changed files with 47 additions and 2 deletions

View file

@ -37,6 +37,14 @@ export class Entity implements IEntity {
this.health = 20; this.health = 20;
} }
sendToNearby(buffer:Buffer) {
this.world.sendToNearbyClients(this, buffer);
}
sendToAllNearby(buffer:Buffer) {
this.world.sendToNearbyClients(this, buffer);
}
updateMetadata() { updateMetadata() {
const crouchStateChanged = this.crouching !== this.lastCrouchState; const crouchStateChanged = this.crouching !== this.lastCrouchState;
const fireStateChanged = this.fire > 0 !== this.lastFireState; const fireStateChanged = this.fire > 0 !== this.lastFireState;
@ -51,7 +59,7 @@ export class Entity implements IEntity {
metadata.addMetadataEntry(0, new MetadataEntry(MetadataFieldType.Byte, Number(this.fire > 0) + Number(this.crouching) * 2)); metadata.addMetadataEntry(0, new MetadataEntry(MetadataFieldType.Byte, Number(this.fire > 0) + Number(this.crouching) * 2));
} }
this.world.sendToNearbyAllNearbyClients(this, new PacketEntityMetadata(this.entityId, metadata.writeBuffer()).writeData()); this.sendToNearby(new PacketEntityMetadata(this.entityId, metadata.writeBuffer()).writeData());
this.lastCrouchState = this.crouching; this.lastCrouchState = this.crouching;
this.lastFireState = this.fire > 0; this.lastFireState = this.fire > 0;
@ -67,6 +75,10 @@ export class Entity implements IEntity {
} }
damageFrom(damage:number, entity?:IEntity) { damageFrom(damage:number, entity?:IEntity) {
if (this.health <= 0) {
return;
}
if (entity === undefined) { if (entity === undefined) {
this.health -= damage; this.health -= damage;
} }

View file

@ -1,9 +1,13 @@
import { World } from "../World"; import { World } from "../World";
import { Block } from "../blocks/Block";
import { PacketAnimation } from "../packets/Animation";
import { PacketEntityLook } from "../packets/EntityLook"; import { PacketEntityLook } from "../packets/EntityLook";
import { PacketEntityLookRelativeMove } from "../packets/EntityLookRelativeMove"; import { PacketEntityLookRelativeMove } from "../packets/EntityLookRelativeMove";
import { PacketEntityRelativeMove } from "../packets/EntityRelativeMove"; import { PacketEntityRelativeMove } from "../packets/EntityRelativeMove";
import { PacketEntityStatus } from "../packets/EntityStatus";
import { PacketEntityTeleport } from "../packets/EntityTeleport"; import { PacketEntityTeleport } from "../packets/EntityTeleport";
import { Entity } from "./Entity"; import { Entity } from "./Entity";
import { IEntity } from "./IEntity";
export class EntityLiving extends Entity { export class EntityLiving extends Entity {
public yaw:number; public yaw:number;
@ -12,6 +16,8 @@ export class EntityLiving extends Entity {
public lastPitch:number; public lastPitch:number;
public onGround:boolean; public onGround:boolean;
public fallDistance:number; public fallDistance:number;
public timeInWater:number;
public headHeight:number;
public absX:number; public absX:number;
public absY:number; public absY:number;
@ -27,8 +33,22 @@ export class EntityLiving extends Entity {
public constructor(world:World) { public constructor(world:World) {
super(world); super(world);
this.fallDistance = this.yaw = this.lastYaw = this.pitch = this.lastPitch = this.absX = this.absY = this.absZ = this.absYaw = this.absPitch = this.lastAbsX = this.lastAbsY = this.lastAbsZ = this.lastAbsYaw = this.lastAbsPitch = 0; this.fallDistance = this.yaw = this.lastYaw = this.pitch = this.lastPitch = this.absX = this.absY = this.absZ = this.absYaw = this.absPitch = this.lastAbsX = this.lastAbsY = this.lastAbsZ = this.lastAbsYaw = this.lastAbsPitch = this.timeInWater = 0;
this.onGround = true; this.onGround = true;
this.headHeight = 1.62;
}
damageFrom(damage:number, entity?:IEntity) {
if (this.health <= 0) {
return;
}
super.damageFrom(damage, entity);
// Send Damage Animation packet
this.sendToAllNearby(new PacketEntityStatus(this.entityId, 2).writeData());
}
isInWater() {
return this.world.getBlockId(this.x, this.y + this.headHeight, this.z) === Block.waterStill.blockId;
} }
private constrainRot(rot:number) { private constrainRot(rot:number) {
@ -79,6 +99,19 @@ export class EntityLiving extends Entity {
this.fallDistance this.fallDistance
} }
// Drowning
if (this.isInWater()) {
if (this.timeInWater == Number.MIN_SAFE_INTEGER) {
this.timeInWater = 320;
}
if (this.timeInWater <= 0 && this.timeInWater % 20 === 0) {
this.damageFrom(1);
}
this.timeInWater--;
} else {
this.timeInWater = Number.MIN_SAFE_INTEGER;
}
this.lastYaw = this.yaw; this.lastYaw = this.yaw;
this.lastPitch = this.pitch; this.lastPitch = this.pitch;
} }