mirror of
https://github.com/kolbytn/mindcraft.git
synced 2025-08-13 02:35:34 +02:00
fixing issues with the bot not receiving the messages properly:
This commit is contained in:
parent
5b46d3ee6d
commit
3f728957c4
6 changed files with 169 additions and 60 deletions
|
@ -58,7 +58,7 @@
|
||||||
"blueprint": {
|
"blueprint": {
|
||||||
"materials": {
|
"materials": {
|
||||||
"plank": {
|
"plank": {
|
||||||
"id": "oak_plank",
|
"id": "oak_planks",
|
||||||
"number": 40
|
"number": 40
|
||||||
},
|
},
|
||||||
"door": {
|
"door": {
|
||||||
|
@ -72,10 +72,10 @@
|
||||||
"coordinates": [142, -60, -179],
|
"coordinates": [142, -60, -179],
|
||||||
"placement":
|
"placement":
|
||||||
[
|
[
|
||||||
["plank", "plank", "door", "plank", "plank"],
|
["oak_planks", "oak_planks", "oak_door", "oak_planks", "oak_planks"],
|
||||||
["plank", "air", "air", "air", "plank"],
|
["oak_planks", "air", "air", "air", "oak_planks"],
|
||||||
["plank", "air", "air", "air", "plank"],
|
["oak_planks", "air", "air", "air", "oak_planks"],
|
||||||
["plank", "plank", "plank", "plank", "plank"]
|
["oak_planks", "oak_planks", "oak_planks", "oak_planks", "oak_planks"]
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -83,10 +83,10 @@
|
||||||
"coordinates": [142, -59, -179],
|
"coordinates": [142, -59, -179],
|
||||||
"placement":
|
"placement":
|
||||||
[
|
[
|
||||||
["plank", "plank", "air", "plank", "plank"],
|
["oak_planks", "oak_planks", "oak_door", "oak_planks", "oak_planks"],
|
||||||
["plank", "air", "air", "air", "plank"],
|
["oak_planks", "air", "air", "air", "oak_planks"],
|
||||||
["plank", "air", "air", "air", "plank"],
|
["oak_planks", "air", "air", "air", "oak_planks"],
|
||||||
["plank", "plank", "plank", "plank", "plank"]
|
["oak_planks", "oak_planks", "oak_planks", "oak_planks", "oak_planks"]
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -94,10 +94,10 @@
|
||||||
"coordinates": [142, -58, -179],
|
"coordinates": [142, -58, -179],
|
||||||
"placement":
|
"placement":
|
||||||
[
|
[
|
||||||
["plank", "plank", "plank", "plank", "plank"],
|
["oak_planks", "oak_planks", "oak_planks", "oak_planks", "oak_planks"],
|
||||||
["plank", "plank", "plank", "plank", "plank"],
|
["oak_planks", "oak_planks", "oak_planks", "oak_planks", "oak_planks"],
|
||||||
["plank", "plank", "plank", "plank", "plank"],
|
["oak_planks", "oak_planks", "oak_planks", "oak_planks", "oak_planks"],
|
||||||
["plank", "plank", "plank", "plank", "plank"]
|
["oak_planks", "oak_planks", "oak_planks", "oak_planks", "oak_planks"]
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
@ -129,7 +129,7 @@
|
||||||
"coordinates": [142, -60, -179],
|
"coordinates": [142, -60, -179],
|
||||||
"placement":
|
"placement":
|
||||||
[
|
[
|
||||||
["stone", "stone", "door", "stone", "stone"],
|
["stone", "stone", "oak_door", "stone", "stone"],
|
||||||
["stone", "air", "air", "air", "stone"],
|
["stone", "air", "air", "air", "stone"],
|
||||||
["stone", "air", "air", "air", "stone"],
|
["stone", "air", "air", "air", "stone"],
|
||||||
["stone", "stone", "stone", "stone", "stone"]
|
["stone", "stone", "stone", "stone", "stone"]
|
||||||
|
@ -140,7 +140,7 @@
|
||||||
"coordinates": [142, -59, -179],
|
"coordinates": [142, -59, -179],
|
||||||
"placement":
|
"placement":
|
||||||
[
|
[
|
||||||
["stone", "stone", "air", "stone", "stone"],
|
["stone", "stone", "oak_door", "stone", "stone"],
|
||||||
["stone", "air", "air", "air", "stone"],
|
["stone", "air", "air", "air", "stone"],
|
||||||
["stone", "air", "air", "air", "stone"],
|
["stone", "air", "air", "air", "stone"],
|
||||||
["stone", "stone", "stone", "stone", "stone"]
|
["stone", "stone", "stone", "stone", "stone"]
|
||||||
|
@ -151,10 +151,10 @@
|
||||||
"coordinates": [142, -58, -179],
|
"coordinates": [142, -58, -179],
|
||||||
"placement":
|
"placement":
|
||||||
[
|
[
|
||||||
["plank", "plank", "plank", "plank", "plank"],
|
["oak_planks", "oak_planks", "oak_planks", "oak_planks", "oak_planks"],
|
||||||
["plank", "plank", "plank", "plank", "plank"],
|
["oak_planks", "oak_planks", "oak_planks", "oak_planks", "oak_planks"],
|
||||||
["plank", "plank", "plank", "plank", "plank"],
|
["oak_planks", "oak_planks", "oak_planks", "oak_planks", "oak_planks"],
|
||||||
["plank", "plank", "plank", "plank", "plank"]
|
["oak_planks", "oak_planks", "oak_planks", "oak_planks", "oak_planks"]
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
|
@ -12,7 +12,7 @@ export default
|
||||||
|
|
||||||
"profiles": [
|
"profiles": [
|
||||||
"./andy.json",
|
"./andy.json",
|
||||||
"./jill.json",
|
// "./jill.json",
|
||||||
// "./profiles/gpt.json",
|
// "./profiles/gpt.json",
|
||||||
// "./profiles/claude.json",
|
// "./profiles/claude.json",
|
||||||
// "./profiles/gemini.json",
|
// "./profiles/gemini.json",
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import * as skills from '../library/skills.js';
|
import * as skills from '../library/skills.js';
|
||||||
import settings from '../../../settings.js';
|
import settings from '../../../settings.js';
|
||||||
import convoManager from '../conversation.js';
|
import convoManager from '../conversation.js';
|
||||||
import { checkLevelBlueprint, checkBlueprint } from '../tasks.js';
|
|
||||||
|
|
||||||
function runAsAction (actionFn, resume = false, timeout = -1) {
|
function runAsAction (actionFn, resume = false, timeout = -1) {
|
||||||
let actionLabel = null; // Will be set on first use
|
let actionLabel = null; // Will be set on first use
|
||||||
|
@ -412,32 +412,15 @@ export const actionsList = [
|
||||||
{
|
{
|
||||||
name: '!checkLevelComplete',
|
name: '!checkLevelComplete',
|
||||||
description: 'Check if the level is complete and what blocks still need to be placed for the blueprint',
|
description: 'Check if the level is complete and what blocks still need to be placed for the blueprint',
|
||||||
|
params: {
|
||||||
|
'levelNum': { type: 'int', description: 'The level number to check.', domain: [0, Number.MAX_SAFE_INTEGER] }
|
||||||
|
},
|
||||||
perform: runAsAction(async (agent, levelNum) => {
|
perform: runAsAction(async (agent, levelNum) => {
|
||||||
return await checkLevelBlueprint(agent, levelNum);
|
const result = await checkLevelBlueprint(agent, levelNum);
|
||||||
//todo: if not complete, explain what still needs to be done
|
console.log(result);
|
||||||
|
return result;
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
{
|
|
||||||
name: '!checkBlueprint',
|
|
||||||
description: 'Check what blocks still need to be placed for the blueprint',
|
|
||||||
perform: runAsAction(async (agent) => {
|
|
||||||
return await checkBlueprint(agent);
|
|
||||||
})
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: '!getBlueprint',
|
|
||||||
description: 'Get the blueprint for the building',
|
|
||||||
perform: runAsAction(async (agent) => {
|
|
||||||
return await agent.task.blueprint.explain();
|
|
||||||
})
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: '!getBlueprintLevel',
|
|
||||||
description: 'Get the blueprint for the building',
|
|
||||||
perform: runAsAction(async (agent, levelNum) => {
|
|
||||||
return await agent.task.blueprint.explainLevel(levelNum);
|
|
||||||
})
|
|
||||||
}
|
|
||||||
// { // commented for now, causes confusion with goal command
|
// { // commented for now, causes confusion with goal command
|
||||||
// name: '!npcGoal',
|
// name: '!npcGoal',
|
||||||
// description: 'Set a simple goal for an item or building to automatically work towards. Do not use for complex goals.',
|
// description: 'Set a simple goal for an item or building to automatically work towards. Do not use for complex goals.',
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import * as world from '../library/world.js';
|
import * as world from '../library/world.js';
|
||||||
import * as mc from '../../utils/mcdata.js';
|
import * as mc from '../../utils/mcdata.js';
|
||||||
import convoManager from '../conversation.js';
|
import convoManager from '../conversation.js';
|
||||||
|
import { checkLevelBlueprint, checkBlueprint } from '../tasks.js';
|
||||||
|
|
||||||
const pad = (str) => {
|
const pad = (str) => {
|
||||||
return '\n' + str + '\n';
|
return '\n' + str + '\n';
|
||||||
|
@ -167,5 +168,45 @@ export const queryList = [
|
||||||
perform: async function (agent) {
|
perform: async function (agent) {
|
||||||
return "Saved place names: " + agent.memory_bank.getKeys();
|
return "Saved place names: " + agent.memory_bank.getKeys();
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '!checkLevelComplete',
|
||||||
|
description: 'Check if the level is complete and what blocks still need to be placed for the blueprint',
|
||||||
|
params: {
|
||||||
|
'levelNum': { type: 'int', description: 'The level number to check.', domain: [0, Number.MAX_SAFE_INTEGER] }
|
||||||
|
},
|
||||||
|
perform: function (agent, levelNum) {
|
||||||
|
let res = checkLevelBlueprint(agent, levelNum);
|
||||||
|
console.log(res);
|
||||||
|
return pad(res);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '!checkBlueprint',
|
||||||
|
description: 'Check what blocks still need to be placed for the blueprint',
|
||||||
|
perform: function (agent) {
|
||||||
|
let res = checkBlueprint(agent);
|
||||||
|
return pad(res);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '!getBlueprint',
|
||||||
|
description: 'Get the blueprint for the building',
|
||||||
|
perform: function (agent) {
|
||||||
|
let res = agent.task.blueprint.explain();
|
||||||
|
return pad(res);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '!getBlueprintLevel',
|
||||||
|
description: 'Get the blueprint for the building',
|
||||||
|
params: {
|
||||||
|
'levelNum': { type: 'int', description: 'The level number to check.', domain: [0, Number.MAX_SAFE_INTEGER] }
|
||||||
|
},
|
||||||
|
perform: function (agent, levelNum) {
|
||||||
|
let res = agent.task.blueprint.explainLevel(levelNum);
|
||||||
|
console.log(res);
|
||||||
|
return pad(res);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
|
|
@ -4,6 +4,8 @@ import { getPosition } from './library/world.js'
|
||||||
import settings from '../../settings.js';
|
import settings from '../../settings.js';
|
||||||
import { Vec3 } from 'vec3';
|
import { Vec3 } from 'vec3';
|
||||||
|
|
||||||
|
//todo: modify validator code to return an object with valid and score -> do more testing hahah
|
||||||
|
//todo: figure out how to log these things to the same place as bots/histories
|
||||||
export class CraftTaskValidator {
|
export class CraftTaskValidator {
|
||||||
constructor(data, agent) {
|
constructor(data, agent) {
|
||||||
this.target = data.target;
|
this.target = data.target;
|
||||||
|
@ -44,9 +46,10 @@ export class ConstructionTaskValidator {
|
||||||
validate() {
|
validate() {
|
||||||
try {
|
try {
|
||||||
//todo: somehow make this more of a percentage or something
|
//todo: somehow make this more of a percentage or something
|
||||||
|
console.log('Validating task...');
|
||||||
let valid = false;
|
let valid = false;
|
||||||
let score = 0;
|
let score = 0;
|
||||||
this.blueprint.checkBluepint(this.agent.bot).then((result) => {
|
this.blueprint.check(this.agent.bot).then((result) => {
|
||||||
if (result.mismatches.length === 0) {
|
if (result.mismatches.length === 0) {
|
||||||
valid = true;
|
valid = true;
|
||||||
console.log('Task is complete');
|
console.log('Task is complete');
|
||||||
|
@ -63,17 +66,30 @@ export class ConstructionTaskValidator {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function checkLevelBlueprint(agent, levelNum) {
|
export function checkLevelBlueprint(agent, levelNum) {
|
||||||
const blueprint = agent.task.blueprint.data;
|
const blueprint = agent.task.blueprint;
|
||||||
const bot = agent.bot;
|
const bot = agent.bot;
|
||||||
//todo: in addition to checking the level, explain the differences
|
const result = blueprint.checkLevel(bot, levelNum);
|
||||||
return blueprint.checkLevel(bot, levelNum);
|
if (result.mismatches.length === 0) {
|
||||||
|
return `Level ${levelNum} is correct`;
|
||||||
|
} else {
|
||||||
|
let explanation = blueprint.explainLevelDifference(bot, levelNum);
|
||||||
|
return explanation;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function checkBlueprint(agent) {
|
export function checkBlueprint(agent) {
|
||||||
const blueprint = agent.task.blueprint.data;
|
console.log('Checking blueprint...');
|
||||||
|
console.log(agent);
|
||||||
|
const blueprint = agent.task.blueprint;
|
||||||
const bot = agent.bot;
|
const bot = agent.bot;
|
||||||
return blueprint.check(bot);
|
const result = blueprint.check(bot);
|
||||||
|
if (result.mismatches.length === 0) {
|
||||||
|
return "Blueprint is correct";
|
||||||
|
} else {
|
||||||
|
let explanation = blueprint.explainBlueprintDifference(bot);
|
||||||
|
return explanation;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
export class Blueprint {
|
export class Blueprint {
|
||||||
constructor(blueprint) {
|
constructor(blueprint) {
|
||||||
|
@ -112,17 +128,17 @@ export class Blueprint {
|
||||||
explanation += `\n${placement_string}\n`;
|
explanation += `\n${placement_string}\n`;
|
||||||
return explanation;
|
return explanation;
|
||||||
}
|
}
|
||||||
async explainBlueprintDifference(bot) {
|
explainBlueprintDifference(bot) {
|
||||||
var explanation = "";
|
var explanation = "";
|
||||||
const levels = this.data.levels;
|
const levels = this.data.levels;
|
||||||
for (let i = 0; i < levels.length; i++) {
|
for (let i = 0; i < levels.length; i++) {
|
||||||
let level_explanation = await this.explainLevelDifference(bot, i);
|
let level_explanation = this.explainLevelDifference(bot, i);
|
||||||
explanation += level_explanation + "\n";
|
explanation += level_explanation + "\n";
|
||||||
}
|
}
|
||||||
return explanation;
|
return explanation;
|
||||||
}
|
}
|
||||||
async explainLevelDifference(bot, levelNum) {
|
explainLevelDifference(bot, levelNum) {
|
||||||
const results = await this.checkLevel(bot, levelNum);
|
const results = this.checkLevel(bot, levelNum);
|
||||||
const mismatches = results.mismatches;
|
const mismatches = results.mismatches;
|
||||||
const levelData = this.data.levels[levelNum];
|
const levelData = this.data.levels[levelNum];
|
||||||
|
|
||||||
|
@ -138,12 +154,12 @@ export class Blueprint {
|
||||||
}
|
}
|
||||||
return explanation;
|
return explanation;
|
||||||
}
|
}
|
||||||
async check(bot) {
|
check(bot) {
|
||||||
const levels = this.data.levels;
|
const levels = this.data.levels;
|
||||||
const mismatches = [];
|
const mismatches = [];
|
||||||
const matches = [];
|
const matches = [];
|
||||||
for (let i = 0; i < levels.length; i++) {
|
for (let i = 0; i < levels.length; i++) {
|
||||||
const result = await this.checkLevel(bot, i);
|
const result = this.checkLevel(bot, i);
|
||||||
mismatches.push(...result.mismatches);
|
mismatches.push(...result.mismatches);
|
||||||
matches.push(...result.matches);
|
matches.push(...result.matches);
|
||||||
}
|
}
|
||||||
|
@ -152,7 +168,7 @@ export class Blueprint {
|
||||||
"matches": matches
|
"matches": matches
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
async checkLevel(bot, levelNum) {
|
checkLevel(bot, levelNum) {
|
||||||
const levelData = this.data.levels[levelNum];
|
const levelData = this.data.levels[levelNum];
|
||||||
const startCoords = levelData.coordinates;
|
const startCoords = levelData.coordinates;
|
||||||
const placement = levelData.placement;
|
const placement = levelData.placement;
|
||||||
|
@ -169,7 +185,7 @@ export class Blueprint {
|
||||||
const z = startCoords[2] + zOffset;
|
const z = startCoords[2] + zOffset;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const blockAtLocation = await bot.blockAt(new Vec3(x, y, z));
|
const blockAtLocation = bot.blockAt(new Vec3(x, y, z));
|
||||||
if (!blockAtLocation || blockAtLocation.name !== blockName) {
|
if (!blockAtLocation || blockAtLocation.name !== blockName) {
|
||||||
mismatches.push({
|
mismatches.push({
|
||||||
level: levelData.level,
|
level: levelData.level,
|
||||||
|
|
69
test/test_agent_check_blocks.js
Normal file
69
test/test_agent_check_blocks.js
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
import mineflayer from 'mineflayer';
|
||||||
|
import { Vec3 } from 'vec3';
|
||||||
|
import { ConstructionTaskValidator, Blueprint, checkBlueprint, checkLevelBlueprint } from '../src/agent/tasks.js';
|
||||||
|
import { Agent } from '../src/agent/agent.js';
|
||||||
|
|
||||||
|
try {
|
||||||
|
const agent = new Agent("../andy.json",
|
||||||
|
false,
|
||||||
|
null,
|
||||||
|
0,
|
||||||
|
"../example_tasks.json",
|
||||||
|
"construction_house");
|
||||||
|
await new Promise((resolve) => setTimeout(resolve, 10000));
|
||||||
|
let result = await checkBlueprint(agent);
|
||||||
|
// console.log(result);
|
||||||
|
// const levelResult = await checkLevelBlueprint(agent, 0);
|
||||||
|
// console.log(levelResult);
|
||||||
|
} catch (error) {
|
||||||
|
console.error('An error occurred:', error);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// const validator = new ConstructionTaskValidator();
|
||||||
|
|
||||||
|
const blueprintData = {
|
||||||
|
"materials": {
|
||||||
|
"oak_planks": 20,
|
||||||
|
"oak_door": 1,
|
||||||
|
"stone": 26,
|
||||||
|
},
|
||||||
|
"levels": [
|
||||||
|
{
|
||||||
|
"level": 0,
|
||||||
|
"coordinates": [142, -60, -179],
|
||||||
|
"placement":
|
||||||
|
[
|
||||||
|
["stone", "stone", "oak_door", "stone", "stone"],
|
||||||
|
["stone", "air", "air", "air", "stone"],
|
||||||
|
["stone", "air", "air", "air", "stone"],
|
||||||
|
["stone", "stone", "stone", "stone", "stone"]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"level": 1,
|
||||||
|
"coordinates": [142, -59, -179],
|
||||||
|
"placement":
|
||||||
|
[
|
||||||
|
["stone", "stone", "oak_door", "stone", "stone"],
|
||||||
|
["stone", "air", "air", "air", "stone"],
|
||||||
|
["stone", "air", "air", "air", "stone"],
|
||||||
|
["stone", "stone", "stone", "stone", "stone"]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"level": 2,
|
||||||
|
"coordinates": [142, -58, -179],
|
||||||
|
"placement":
|
||||||
|
[
|
||||||
|
["oak_planks", "oak_planks", "oak_planks", "oak_planks", "oak_planks"],
|
||||||
|
["oak_planks", "oak_planks", "oak_planks", "oak_planks", "oak_planks"],
|
||||||
|
["oak_planks", "oak_planks", "oak_planks", "oak_planks", "oak_planks"],
|
||||||
|
["oak_planks", "oak_planks", "oak_planks", "oak_planks", "oak_planks"]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
};
|
Loading…
Add table
Reference in a new issue