update: enhance security shutdown process with spawner item stashing in ender chest

This commit is contained in:
ZareMate 2026-03-14 03:35:54 +01:00
parent 4c84bfc80a
commit ea6dd9abfb

146
index.js
View File

@ -268,8 +268,17 @@ async function triggerSecurityShutdown(reason) {
const spawnerDestroyed = await breakSpawnerUntilGone(); const spawnerDestroyed = await breakSpawnerUntilGone();
const status = spawnerDestroyed ? "spawner removed" : "spawner not removed"; const status = spawnerDestroyed ? "spawner removed" : "spawner not removed";
await sleep(600);
const stashResult = await stashSpawnerDropsInEnderChest();
const stashStatus = stashResult.attempted
? stashResult.remaining === 0
? `spawners stashed (moved=${stashResult.moved})`
: `stash incomplete (moved=${stashResult.moved}, remaining=${stashResult.remaining})`
: "no spawner items to stash";
await sendDiscordWebhook(`MCBOT ALERT: ${reason} | ${status}`); await sendDiscordWebhook(
`MCBOT ALERT: ${reason} | ${status} | ${stashStatus}`,
);
try { try {
bot.quit("security shutdown"); bot.quit("security shutdown");
@ -571,6 +580,141 @@ function countItemByName(items, name) {
.reduce((sum, item) => sum + (item.count || 0), 0); .reduce((sum, item) => sum + (item.count || 0), 0);
} }
function isSpawnerItem(item) {
if (!item) return false;
return ["spawner", "mob_spawner", "trial_spawner"].includes(
String(item.name || "").toLowerCase(),
);
}
function countSpawnerItemsInInventory() {
if (!bot || !bot.inventory) return 0;
return bot.inventory
.items()
.filter((item) => isSpawnerItem(item))
.reduce((sum, item) => sum + (item.count || 0), 0);
}
function findNearbyEnderChest(maxDistance = 6) {
const blockDef = bot?.registry?.blocksByName?.ender_chest;
if (!blockDef) return null;
return bot.findBlock({
matching: blockDef.id,
maxDistance,
});
}
function getInventorySpawnerSlotsInCurrentWindow() {
if (!bot.currentWindow || !Array.isArray(bot.currentWindow.slots)) return [];
const slots = bot.currentWindow.slots;
const inventoryStart = getInventoryStart(bot.currentWindow);
const result = [];
for (let i = inventoryStart; i < slots.length; i += 1) {
const item = slots[i];
if (!isSpawnerItem(item)) continue;
result.push(i);
}
return result;
}
async function moveAllInventorySpawnersToCurrentWindow() {
if (!bot.currentWindow) return 0;
let moved = 0;
let safety = 0;
while (safety < 120) {
safety += 1;
const before = countSpawnerItemsInInventory();
if (before === 0) break;
const spawnerSlots = getInventorySpawnerSlotsInCurrentWindow();
if (spawnerSlots.length === 0) break;
let clicked = false;
for (const slot of spawnerSlots) {
try {
// mode=1 is shift-click, which moves the stack to the open container.
await bot.clickWindow(slot, 0, 1);
clicked = true;
await sleep(120);
} catch (err) {
debugLog(
`moveAllInventorySpawnersToCurrentWindow: raw shift slot=${slot} failed: ${err.message}`,
);
}
}
const after = countSpawnerItemsInInventory();
if (after < before) {
moved += before - after;
continue;
}
if (!clicked) break;
break;
}
pushLog(`moved spawners from inventory: ${moved}`);
return moved;
}
async function stashSpawnerDropsInEnderChest() {
const before = countSpawnerItemsInInventory();
if (before === 0) {
pushLog("no spawner items in inventory to stash");
return { attempted: false, moved: 0, remaining: 0 };
}
const enderChest = findNearbyEnderChest(6);
if (!enderChest) {
pushLog("no nearby ender chest found for stashing spawners");
return { attempted: true, moved: 0, remaining: before };
}
try {
await bot.lookAt(enderChest.position.offset(0.5, 0.5, 0.5), true);
const openPromise = waitForWindowOpen(5000);
closeCurrentWindow();
await bot.activateBlock(enderChest);
const opened = await openPromise;
if (!opened || !bot.currentWindow) {
pushLog("ender chest did not open");
return {
attempted: true,
moved: 0,
remaining: countSpawnerItemsInInventory(),
};
}
await sleep(150);
const moved = await moveAllInventorySpawnersToCurrentWindow();
closeCurrentWindow();
const remaining = countSpawnerItemsInInventory();
if (remaining === 0) {
pushLog("all spawner items stashed in ender chest");
} else {
pushLog(`spawner stash incomplete, remaining in inventory: ${remaining}`);
}
return { attempted: true, moved, remaining };
} catch (err) {
pushLog(`failed stashing spawners in ender chest: ${err.message}`);
closeCurrentWindow();
return {
attempted: true,
moved: 0,
remaining: countSpawnerItemsInInventory(),
};
}
}
function normalizeLabel(value) { function normalizeLabel(value) {
return String(value || "") return String(value || "")
.toLowerCase() .toLowerCase()