188 lines
4.2 KiB
JavaScript
188 lines
4.2 KiB
JavaScript
'use strict';
|
|
|
|
const conf = require('../conf');
|
|
const {sleep, nextTick} = require('../utils');
|
|
|
|
class Craft{
|
|
constructor(args){
|
|
this.bot = args.bot;
|
|
this.interval = args.interval;
|
|
this.target = args.target;
|
|
this.intervalStop;
|
|
this.isAction = true;
|
|
}
|
|
|
|
init(){
|
|
return new Promise(async (resolve, reject)=>{
|
|
this.bot.on('onReady', async ()=>{
|
|
try{
|
|
await sleep(500);
|
|
await this.bot.goTo({
|
|
where: this.bot.findBlockBySign('bot walk 2').position,
|
|
range: 0,
|
|
});
|
|
|
|
await this.bot.goTo({
|
|
where: this.bot.findBlockBySign('bot walk 1').position,
|
|
range: 0,
|
|
});
|
|
|
|
await this.bot.goTo({
|
|
where: this.bot.findBlockBySign('bot walk 2').position,
|
|
range: 0,
|
|
});
|
|
|
|
let hasItems = await this.getItems();
|
|
|
|
while(hasItems){
|
|
await this.craft();
|
|
hasItems = await this.getItems();
|
|
}
|
|
|
|
return resolve();
|
|
|
|
}catch(error){
|
|
reject(error);
|
|
}
|
|
|
|
});
|
|
});
|
|
}
|
|
|
|
unload(){
|
|
if(this.intervalStop){
|
|
clearInterval(this.intervalStop);
|
|
this.intervalStop = undefined;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
async getItems(){
|
|
/*
|
|
shards
|
|
*/
|
|
let prismarine_shardChest = this.bot.findChestBySign('prismarine_shard');
|
|
await this.bot.goTo({
|
|
where: prismarine_shardChest.position,
|
|
range: 2,
|
|
});
|
|
|
|
let hasShard = await this.bot.checkItemsFromContainer(
|
|
prismarine_shardChest, 'prismarine_shard', 64*4
|
|
);
|
|
|
|
/*
|
|
crystals
|
|
*/
|
|
let prismarine_crystalsChest = this.bot.findChestBySign('crystals');
|
|
await this.bot.goTo({
|
|
where: prismarine_crystalsChest.position,
|
|
range: 2,
|
|
});
|
|
|
|
let hasCrystals = await this.bot.checkItemsFromContainer(
|
|
prismarine_crystalsChest, 'prismarine_crystals', 64*5
|
|
);
|
|
|
|
if(!hasShard || !hasCrystals) return false;
|
|
|
|
/*
|
|
get
|
|
*/
|
|
await sleep(3000);
|
|
|
|
await this.bot.getItemsFromChest(
|
|
prismarine_shardChest, 'prismarine_shard', 64*4
|
|
);
|
|
await sleep(1000);
|
|
|
|
await this.bot.getItemsFromChest(
|
|
prismarine_crystalsChest, 'prismarine_crystals', 64*5
|
|
);
|
|
|
|
return true;
|
|
}
|
|
|
|
async craft(){
|
|
|
|
// Ensure the bot has enough items (4 shards and 5 crystals for 1 lantern)
|
|
let prismarineShardsCount = this.bot.bot.inventory.count(this.bot.mcData.itemsByName.prismarine_shard.id);
|
|
let prismarineCrystalsCount = this.bot.bot.inventory.count(this.bot.mcData.itemsByName.prismarine_crystals.id);
|
|
|
|
if(prismarineShardsCount < 4 || prismarineCrystalsCount < 5){
|
|
console.log("Not enough materials to craft 64 Sea Lanterns.");
|
|
return;
|
|
}else{
|
|
console.log('good to make sea_lantern!')
|
|
}
|
|
|
|
// Hold onto the closest crafting table
|
|
let craftingTable = this.bot.bot.findBlock({
|
|
matching: this.bot.mcData.blocksByName.crafting_table.id,
|
|
maxDistance: 64
|
|
});
|
|
|
|
await this.bot.goTo({
|
|
where: craftingTable.position,
|
|
range: 1,
|
|
});
|
|
|
|
// Hold onto the recipe
|
|
let recipe = this.bot.bot.recipesAll(
|
|
this.bot.mcData.itemsByName.sea_lantern.id,
|
|
null,
|
|
craftingTable
|
|
)[0];
|
|
|
|
let window = await this.bot.openCraftingTable(craftingTable);
|
|
|
|
// Move these into openCrating function
|
|
let windowOnce = (event)=> new Promise((resolve, reject)=> window.once(event, resolve));
|
|
let inventory = ()=> window.slots.slice(window.inventoryStart, window.inventoryEnd)
|
|
|
|
// Move the items into the crafting grid
|
|
let slotCount = 1;
|
|
for(let shapeRow of recipe.inShape){
|
|
for(let shape of shapeRow){
|
|
this.bot.bot.moveSlotItem(
|
|
inventory().find((element)=> element && element.type === shape.id).slot,
|
|
slotCount
|
|
);
|
|
await windowOnce(`updateSlot:${slotCount}`);
|
|
slotCount++;
|
|
}
|
|
}
|
|
|
|
// Wait for the server to catch up.
|
|
await sleep(500);
|
|
|
|
// Craft each item until all are gone.
|
|
let craftedCount = 0;
|
|
while(window.slots[0]){
|
|
await this.bot.bot.moveSlotItem(
|
|
window.craftingResultSlot,
|
|
38 // dont hard code this!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
);
|
|
craftedCount++;
|
|
await windowOnce(`updateSlot:0`);
|
|
await sleep(50); // wait for the client to catchup
|
|
}
|
|
|
|
await window.close();
|
|
|
|
/*
|
|
Dump items to chest
|
|
*/
|
|
|
|
let seaLanternChest = this.bot.findChestBySign('sea_lantern');
|
|
await this.bot.goTo({
|
|
where: seaLanternChest.position,
|
|
range: 4,
|
|
});
|
|
|
|
await this.bot.dumpToChest(seaLanternChest, 'sea_lantern')
|
|
}
|
|
}
|
|
|
|
module.exports = Craft;
|