|
|
|
|
|
const { Observation } = require("./base"); |
|
|
|
|
|
class Voxels extends Observation { |
|
|
constructor(bot) { |
|
|
super(bot); |
|
|
this.name = "voxels"; |
|
|
} |
|
|
|
|
|
observe() { |
|
|
return Array.from(getSurroundingBlocks(this.bot, 8, 2, 8)); |
|
|
} |
|
|
} |
|
|
|
|
|
class BlockRecords extends Observation { |
|
|
constructor(bot) { |
|
|
super(bot); |
|
|
this.name = "blockRecords"; |
|
|
this.records = new Set(); |
|
|
this.tick = 0; |
|
|
bot.on("physicsTick", () => { |
|
|
this.tick++; |
|
|
if (this.tick >= 100) { |
|
|
const items = getInventoryItems(this.bot); |
|
|
getSurroundingBlocks(this.bot, 8, 2, 8).forEach((block) => { |
|
|
if (!items.has(block)) this.records.add(block); |
|
|
}); |
|
|
this.tick = 0; |
|
|
} |
|
|
}); |
|
|
} |
|
|
|
|
|
observe() { |
|
|
return Array.from(this.records); |
|
|
} |
|
|
|
|
|
reset() { |
|
|
this.records = new Set(); |
|
|
} |
|
|
} |
|
|
|
|
|
function getSurroundingBlocks(bot, x_distance, y_distance, z_distance) { |
|
|
const surroundingBlocks = new Set(); |
|
|
|
|
|
for (let x = -x_distance; x <= x_distance; x++) { |
|
|
for (let y = -y_distance; y <= y_distance; y++) { |
|
|
for (let z = -z_distance; z <= z_distance; z++) { |
|
|
const block = bot.blockAt(bot.entity.position.offset(x, y, z)); |
|
|
if (block && block.type !== 0) { |
|
|
surroundingBlocks.add(block.name); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
return surroundingBlocks; |
|
|
} |
|
|
|
|
|
function getInventoryItems(bot) { |
|
|
const items = new Set(); |
|
|
bot.inventory.items().forEach((item) => { |
|
|
if (item) items.add(item.name); |
|
|
}); |
|
|
return items; |
|
|
} |
|
|
|
|
|
module.exports = { Voxels, BlockRecords }; |
|
|
|