import { applyDelta, applyVelocity } from '../utils/func' import Module from '../utils/Module' import { IDelta, IMovable, IPosition, IRotation, ISlot, IState, IVelocity } from '../utils/types' import Time from './Time' interface IId { entityId: number } interface IPositioned extends IId, IPosition { } interface IMovableE extends IId, IMovable { } interface IMove extends IId, IDelta { } interface ILook extends IId, IRotation { } interface IMoveLook extends IMove, ILook { } interface IHead extends IId { headPitch: number } interface IVelocityE extends IId, IVelocity { } interface IObject extends IMovableE, IMetadatable { objectId: number type: number data: number } interface IOrb extends IMovableE, IMetadatable { count: number } interface IEquipment extends IId { slot: number, item: ISlot } interface IEquipable { equipment?: Map } interface IAttribute { key: string value: number modifiers: IModifier[] } interface IModifier { uuid: string amount: number operation: number } interface IAttributes extends IId { properties: IAttribute[] } interface IAttributable { attributes?: IAttribute[] } interface IMetadata { key: number type: number value: any } interface IMetadatas extends IId { metadata: IMetadata[] } interface IMetadatable { metadata?: Map } export interface IAlive extends IMovableE, IEquipable, IAttributable, IMetadatable { headPitch: number } interface ILiving extends IAlive { entityUUID: string type: number } interface IPlayerSpawn extends IPositioned { playerUUID: string } interface IPlayer extends IPlayerSpawn, IAlive { me?: boolean } /** Track entities */ export default class Entities extends Module<{}> { private _objects = new Map() public get objects() { return this._objects.values() } private _orbs = new Map() public get orbs() { return this._orbs.values() } private _livings = new Map() public get livings() { return this._livings.values() } private _players = new Map() public get players() { return this._players.values() } public getEntity(entityId: number): IMovableE | undefined { return this._players.get(entityId) || this._livings.get(entityId) || this._objects.get(entityId) || this._orbs.get(entityId) } public getAlive(entityId: number): IAlive | undefined { return this._players.get(entityId) || this._livings.get(entityId) } public getMetadatable(entityId: number): IMetadatable | undefined { return this._players.get(entityId) || this._livings.get(entityId) || this._objects.get(entityId) || this._orbs.get(entityId) } public deleteEntity(entityId: number) { return this._players.delete(entityId) || this._livings.delete(entityId) || this._objects.delete(entityId) || this._orbs.delete(entityId) } public attack(entityId: number, mainHand: boolean = true) { this.client.write('use_entity', { target: entityId, mouse: 1, hand: mainHand ? 0 : 1 }) } protected mount() { this.load