Skip to content

Commit

Permalink
Feat: command for auto-compacting device items!
Browse files Browse the repository at this point in the history
  • Loading branch information
chipsams committed Jan 10, 2024
1 parent aba4ac2 commit e3025d8
Show file tree
Hide file tree
Showing 2 changed files with 179 additions and 14 deletions.
164 changes: 164 additions & 0 deletions kubejs/server_scripts/base/featrues/bulkrecycle-command.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@
/**
*
* @param {Internal.ServerPlayer} player
*/
function compactItems(player,keepOne){

let limit = keepOne ? 1 : 0;

let tallies = {}
player.inventory.allItems.toArray().forEach(
/** @param {Internal.ItemStack} i */
(i,slot)=>{
if(i.hasTag("forge:devices")){
//highly esoteric way to do it, so sorry!
let [type,fraction] = i.tags.toArray().join().match(/devices\/([^\]\s]+)]/)[1].split("/")
fraction = fraction || "1";
let fractionKey = "_"+String(fraction);
tallies[type] = tallies[type] ?? {}
tallies[type][fractionKey] = tallies[type][fractionKey] ?? {a:0,f:Number(fraction),items:[]}
tallies[type][fractionKey].a += i.count;
tallies[type][fractionKey].items.push(i);
console.log(`${i.id} ${type}, 1/${fractionKey} devices`)
}
}
)


let anySucceeded = false;

for(let [type,amounts] of Object.entries(tallies)){
let usedItems = {};

let totalDevices = 0;

Object.entries(amounts).forEach(([_,a])=>{

console.log(a.items);

let runningTally = 0;
let runningItems = [];
a.items.forEach(
/** @param {Internal.ItemStack} i */
i=>{
let id = i.id;

usedItems[id] = usedItems[id] || {c:0,name:i.displayName};

let fullDevices = Math.floor((i.count - limit)/a.f + 0.000001);

totalDevices += fullDevices;

i.setCount(i.count - fullDevices * a.f)
usedItems[id].c += fullDevices * a.f;

if(i.count>limit){
let previousTally = runningTally;

runningTally += i.count - limit;

if(runningTally>=a.f){
totalDevices++;

console.log(`${a.f} - ${previousTally} = ${a.f - previousTally}`)
let remainder = i.count - (a.f - previousTally);
runningTally = remainder;

runningItems.forEach(i=>{
i.setCount(limit);
})

if(remainder > limit){
usedItems[id].c += (i.count - remainder)
i.setCount(remainder);
runningItems = [i];
}else{
usedItems[id].c += (i.count - limit)
i.setCount(limit);
runningItems = [];
}
}else{
runningItems.push(i);
}
}else{
usedItems[id].c += (i.count - limit)
i.setCount(limit)
}
}
)
})

let usedText = [
Text.of("Used items:\n").gray()
];

console.log(Object.entries(usedItems))
for(let [id,usedItem] of Object.entries(usedItems)){
//easier to deal with it like this, but these get in here because an item automatically becomes air once it's count hits 0.
if(usedItem.c == 0) continue;

console.log("text component")
let name = Text.of(usedItem.name)
name = name.siblings.get(0)
usedText.push(name.yellow())
usedText.push(Text.of("x ").gold())
usedText.push(Text.of(usedItem.c).yellow())
usedText.push(Text.of("\n"))
}

console.log(usedText)

if(totalDevices>0){
player.tell(Text.of([
Text.of(totalDevices).yellow(),
Text.of("x ").gold(),
Text.of(type).yellow(),
Text.of(` devices created! `).gold(),
Text.of(`(`).darkGray(),
Text.of(`used`).gray().hover(Text.of(usedText)),
Text.of(`)`).darkGray()
]));




player.give(Item.of(`#forge:generics/devices/${type}`,totalDevices))

anySucceeded = true;
}
}

if(!anySucceeded){
player.tell(Text.of("Nothing to compact!").red())
}
}

/**
*
* @param {Internal.CommandContext_<Internal.CommandSourceStack>} c
* @returns
*/
global.customCommandBulkRecycle = (c,all) => {
try{
let player = c.source.player

compactItems(player,all)

}catch(e){
console.log("error!")
console.log(e.toString())
}
return 1;
}


ServerEvents.commandRegistry(e => {
const { commands: Commands, arguments: Arguments } = e;
e.register(
Commands.literal("bulkrecycle")
.executes(c=>global.customCommandBulkRecycle(c,true))
.then(
Commands.literal("all")
.executes(c=>global.customCommandBulkRecycle(c,false)))
)
})
29 changes: 15 additions & 14 deletions kubejs/server_scripts/base/featrues/devices.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ if (
) {
let deviceDefinitions = [
{
tag: "forge:device/network",
tag: "forge:devices/network",
generic: "ae2:fluix_smart_cable",
included_devices: [
"ae2:toggle_bus",
Expand All @@ -20,12 +20,12 @@ if (
],
},
{
tag: "forge:device/craftingplaceholder",
tag: "forge:devices/craftingplaceholder",
generic: "#forge:nuggets/brass",
included_devices: ["botania:placeholder", "create:crafter_slot_cover"],
},
{
tag: "forge:device/track",
tag: "forge:devices/track",
generic: "create:track",
base: "#create:sleepers",
amount_crafted: 32,
Expand Down Expand Up @@ -61,7 +61,7 @@ if (
},
},
{
tag: "forge:device/rail",
tag: "forge:devices/rail",
generic: "create:controller_rail",
base: "rail",
incomplete: "rail",
Expand All @@ -78,7 +78,7 @@ if (
},
},
{
tag: "forge:device/furniture",
tag: "forge:devices/furniture",
generic: "ptdye:furnished_device",
base: "minecraft:stick",
assembly: [
Expand Down Expand Up @@ -154,7 +154,7 @@ if (
},
},
{
tag: "forge:device/red_stringed",
tag: "forge:devices/red_stringed",
generic: "ptdye:red_stringed_device", //better to use fully qualifed names for better refactorability in future
assembly: ["botania:livingrock", "string", "red_dye"],
amount_crafted: 2,
Expand All @@ -168,7 +168,7 @@ if (
],
},
{
tag: "forge:device/smart",
tag: "forge:devices/smart",
generic: "ptdye:smart_device",
assembly: [
"#forge:plates/brass",
Expand Down Expand Up @@ -199,7 +199,7 @@ if (
],
},
{
tag: "forge:device/logic",
tag: "forge:devices/logic",
generic: "ptdye:logic_device",
amount_crafted: 8,
assembly: [
Expand Down Expand Up @@ -227,7 +227,7 @@ if (
],
},
{
tag: "forge:device/locomotive",
tag: "forge:devices/locomotive",
generic: "ptdye:locomotive_device",
assembly: [
"#forge:plates/obsidian",
Expand All @@ -248,7 +248,7 @@ if (
],
},
{
tag: "forge:device/sealed",
tag: "forge:devices/sealed",
generic: "ptdye:sealed_device",
assembly: [
"#forge:plates/copper",
Expand Down Expand Up @@ -277,7 +277,7 @@ if (
],
},
{
tag: "forge:device/sturdy",
tag: "forge:devices/sturdy",
generic: "ptdye:sturdy_device",
assembly: ["cobblestone", "#forge:plates/iron"],
amount_crafted: 4,
Expand Down Expand Up @@ -308,7 +308,7 @@ if (
],
},
{
tag: "forge:device/mechanical",
tag: "forge:devices/mechanical",
generic: "ptdye:mechanical_device",
assembly: [
"create:iron_sheet",
Expand Down Expand Up @@ -367,14 +367,15 @@ if (
let addedTagRecipes = {};

deviceDefinitions.forEach((device) => {
addToTag("forge:devices/generics", device.generic);
addToTag('forge:generics/devices', device.generic)
addToTag(`forge:generics/${device.tag.split(":")[1]}`, device.generic)
let generic_id = Item.of(device.generic).id; //support both ids and kjs items

device.incomplete =
device.incomplete ||
generic_id.split(":")[0] + ":incomplete_" + generic_id.split(":")[1];
device.base = device.base || "create:cogwheel";
console.log(device.base);
//console.log(device.base);
device.assembly_loops = device.assembly_loops || undefined;
device.tag = device.tag.startsWith("#") ? device.tag : "#" + device.tag;

Expand Down

0 comments on commit e3025d8

Please sign in to comment.