fixing bugs with the initial blueprint validation functions

This commit is contained in:
Isadora White 2024-12-27 20:42:34 -06:00
parent acdc73ad47
commit 5b46d3ee6d
3 changed files with 49 additions and 25 deletions

View file

@ -414,6 +414,7 @@ export const actionsList = [
description: 'Check if the level is complete and what blocks still need to be placed for the blueprint',
perform: runAsAction(async (agent, levelNum) => {
return await checkLevelBlueprint(agent, levelNum);
//todo: if not complete, explain what still needs to be done
})
},
{

View file

@ -2,7 +2,7 @@ import { readFileSync } from 'fs';
import { executeCommand } from './commands/index.js';
import { getPosition } from './library/world.js'
import settings from '../../settings.js';
import { check } from 'yargs';
import { Vec3 } from 'vec3';
export class CraftTaskValidator {
constructor(data, agent) {
@ -45,11 +45,15 @@ export class ConstructionTaskValidator {
try {
//todo: somehow make this more of a percentage or something
let valid = false;
let score = 0;
this.blueprint.checkBluepint(this.agent.bot).then((result) => {
if (result.mismatches.length === 0) {
valid = true;
console.log('Task is complete');
}
let total_blocks = result.mismatches.length + result.matches.length;
score = (result.matches.length / total_blocks) * 100;
console.log(`Task is ${score}% complete`);
});
return valid;
} catch (error) {
@ -62,14 +66,14 @@ export class ConstructionTaskValidator {
export async function checkLevelBlueprint(agent, levelNum) {
const blueprint = agent.task.blueprint.data;
const bot = agent.bot;
const levelData = blueprint.levels[levelNum];
return Blueprint.checkLevelBlueprint(bot, levelData);
//todo: in addition to checking the level, explain the differences
return blueprint.checkLevel(bot, levelNum);
}
export async function checkBlueprint(agent) {
const blueprint = agent.task.blueprint.data;
const bot = agent.bot;
return Blueprint.checkBlueprint(bot, blueprint);
return blueprint.check(bot);
}
export class Blueprint {
constructor(blueprint) {
@ -103,43 +107,43 @@ export class Blueprint {
explainLevel(levelNum) {
const levelData = this.data.levels[levelNum];
var explanation = `Level ${levelData.level} `;
explanation += `at coordinates X: ${levelData.coordinates[0]}, Y: ${levelData.coordinates[1]}, Z: ${levelData.coordinates[2]}`;
explanation += `starting at coordinates X: ${levelData.coordinates[0]}, Y: ${levelData.coordinates[1]}, Z: ${levelData.coordinates[2]}`;
let placement_string = this._getPlacementString(levelData.placement);
explanation += `\n${placement_string}\n`;
return explanation;
}
async explainBlueprintDifference(bot, blueprint) {
async explainBlueprintDifference(bot) {
var explanation = "";
for (let levelData of blueprint.levels) {
let level_explanation = await this.explainLevelDifference(bot, levelData);
const levels = this.data.levels;
for (let i = 0; i < levels.length; i++) {
let level_explanation = await this.explainLevelDifference(bot, i);
explanation += level_explanation + "\n";
}
return explanation;
}
async explainLevelDifference(bot, levelData) {
const results = await this.checkLevelBlueprint(bot, levelData);
async explainLevelDifference(bot, levelNum) {
const results = await this.checkLevel(bot, levelNum);
const mismatches = results.mismatches;
const levelData = this.data.levels[levelNum];
if (mismatches.length === 0) {
return `Level ${levelData.level} is correct`;
}
var explanation = `Level ${levelData.level} `;
explanation += `at coordinates X: ${levelData.coordinates[0]}, Y: ${levelData.coordinates[1]}, Z: ${levelData.coordinates[2]}`;
// explanation += `at coordinates X: ${levelData.coordinates[0]}, Y: ${levelData.coordinates[1]}, Z: ${levelData.coordinates[2]}`;
explanation += " has the following mismatches:\n";
for (let item of mismatches) {
explanation += `At coordinates X: ${item.coordinates[0]}, Y: ${item.coordinates[1]}, Z: ${item.coordinates[2]}`;
explanation += `Expected ${item.expected}, but found ${item.actual}\n`;
explanation += `At coordinates X: ${item.coordinates[0]}, Y: ${item.coordinates[1]}, Z: ${item.coordinates[2]} `;
explanation += `expected ${item.expected}, but found ${item.actual}\n`;
}
return explanation;
}
async checkBluepint(bot) {
async check(bot) {
const levels = this.data.levels;
const mismatches = [];
const matches = [];
for (let i = 0; i < levels.length; i++) {
const levelData = levels[i];
const result = await checkLevelBlueprint(bot, levelData);
const result = await this.checkLevel(bot, i);
mismatches.push(...result.mismatches);
matches.push(...result.matches);
}
@ -148,7 +152,8 @@ export class Blueprint {
"matches": matches
};
}
async checkLevelBlueprint(bot, levelData) {
async checkLevel(bot, levelNum) {
const levelData = this.data.levels[levelNum];
const startCoords = levelData.coordinates;
const placement = levelData.placement;
const mismatches = [];

View file

@ -1,5 +1,7 @@
import mineflayer from 'mineflayer';
import { Vec3 } from 'vec3';
import { ConstructionTaskValidator, Blueprint } from '../src/agent/tasks.js';
import { Agent } from '../src/agent/agent.js';
const bot = mineflayer.createBot({
host: 'localhost', // Replace with your server IP or hostname
@ -10,14 +12,28 @@ const bot = mineflayer.createBot({
bot.on('spawn', async () => {
console.log("Bot spawned. Starting blueprint check...");
await new Promise((resolve) => setTimeout(resolve, 10000));
await new Promise((resolve) => setTimeout(resolve, 5000));
const blockAtLocation = await bot.blockAt(new Vec3(142, -60, -179));
console.log(blockAtLocation);
const results = await checkLevelBlueprint(bot, blueprintData.levels[0]);
console.log(results)
const matchesBlueprint = await checkBluepint(bot, blueprintData);
console.log(`Blueprint check result: \n`);
console.log(matchesBlueprint.mismatches)
const blueprint = new Blueprint(blueprintData);
console.log(blueprint.explain());
console.log(blueprint.explainLevel(0));
try {
const check_level = await blueprint.checkLevel(bot, 0);
console.log(check_level);
let check_blueprint = await blueprint.check(bot);
console.log(check_blueprint);
let level_diff = await blueprint.explainLevelDifference(bot, 0);
console.log(level_diff);
let blueprint_diff = await blueprint.explainBlueprintDifference(bot);
console.log(blueprint_diff);
} catch (err) {
console.error("Error checking blueprint:", err);
}
// console.log(blueprint.checkLevel(bot, 0));
// console.log(blueprint.check(bot));
// console.log(blueprint.explainBlueprintDifference(bot, blueprintData));
// console.log(blueprint.explainLevelDifference(bot, 0));
bot.quit();
});
@ -126,3 +142,5 @@ const blueprintData = {
]
};