| const Observation = require("./base.js").Observation; |
|
|
| class Status extends Observation { |
| constructor(bot) { |
| super(bot); |
| this.name = "status"; |
| } |
|
|
| observe() { |
| return { |
| health: this.bot.health, |
| food: this.bot.food, |
| saturation: this.bot.foodSaturation, |
| oxygen: this.bot.oxygenLevel, |
| position: this.bot.entity.position, |
| velocity: this.bot.entity.velocity, |
| yaw: this.bot.entity.yaw, |
| pitch: this.bot.entity.pitch, |
| onGround: this.bot.entity.onGround, |
| equipment: this.getEquipment(), |
| name: this.bot.entity.username, |
| timeSinceOnGround: this.bot.entity.timeSinceOnGround, |
| isInWater: this.bot.entity.isInWater, |
| isInLava: this.bot.entity.isInLava, |
| isInWeb: this.bot.entity.isInWeb, |
| isCollidedHorizontally: this.bot.entity.isCollidedHorizontally, |
| isCollidedVertically: this.bot.entity.isCollidedVertically, |
| biome: this.bot.blockAt(this.bot.entity.position) |
| ? this.bot.blockAt(this.bot.entity.position).biome.name |
| : "None", |
| entities: this.getEntities(), |
| timeOfDay: this.getTime(), |
| inventoryUsed: this.bot.inventoryUsed(), |
| elapsedTime: this.bot.globalTickCounter, |
| }; |
| } |
|
|
| itemToObs(item) { |
| if (!item) return null; |
| return item.name; |
| } |
|
|
| getTime() { |
| const timeOfDay = this.bot.time.timeOfDay; |
| let time = ""; |
| if (timeOfDay < 1000) { |
| time = "sunrise"; |
| } else if (timeOfDay < 6000) { |
| time = "day"; |
| } else if (timeOfDay < 12000) { |
| time = "noon"; |
| } else if (timeOfDay < 13000) { |
| time = "sunset"; |
| } else if (timeOfDay < 18000) { |
| time = "night"; |
| } else if (timeOfDay < 22000) { |
| time = "midnight"; |
| } else { |
| time = "sunrise"; |
| } |
| return time; |
| } |
|
|
| |
| |
| getEquipment() { |
| const slots = this.bot.inventory.slots; |
| const mainHand = this.bot.heldItem; |
| return slots |
| .slice(5, 9) |
| .concat(mainHand, slots[45]) |
| .map(this.itemToObs); |
| } |
|
|
| getEntities() { |
| const entities = this.bot.entities; |
| if (!entities) return {}; |
| |
| const mobs = {}; |
| for (const id in entities) { |
| const entity = entities[id]; |
| if (!entity.displayName) continue; |
| if (entity.name === "player" || entity.name === "item") continue; |
| if (entity.position.distanceTo(this.bot.entity.position) < 32) { |
| if (!mobs[entity.name]) { |
| mobs[entity.name] = entity.position.distanceTo( |
| this.bot.entity.position |
| ); |
| } else if ( |
| mobs[entity.name] > |
| entity.position.distanceTo(this.bot.entity.position) |
| ) { |
| mobs[entity.name] = entity.position.distanceTo( |
| this.bot.entity.position |
| ); |
| } |
| } |
| } |
| return mobs; |
| } |
| } |
|
|
| module.exports = Status; |
|
|