Skip to content

Commit

Permalink
FEAT: Bulk recycle command, for compacting devices once you're done. (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
Yarden-zamir committed Feb 18, 2024
2 parents 0405722 + 645b04d commit 92c21b6
Show file tree
Hide file tree
Showing 3 changed files with 186 additions and 23 deletions.
162 changes: 162 additions & 0 deletions kubejs/server_scripts/base/featrues/bulkrecycle-command.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,162 @@
/**
*
* @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=>{
if(i.hasTag("forge:devices")){
let [_,type,fraction] = i.getTags()
.toList()
.filter((tag) => tag.location().path.startsWith("devices/"))[0]
.location().path.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/${fraction} devices`)
}
}
)


let anySucceeded = false;

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

let totalDevices = 0;

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

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};

//there shouldn't be two identical stacks with a single residual item. this handles that
let individualLmit = usedItems[id].c > 0 ? 0 : limit

//we need a tiny corrective figure here, because rounding errors are EVIL.
let fullDevices = Math.floor((i.count - individualLmit)/a.f + 0.000001);

totalDevices += fullDevices;

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

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

runningTally += i.count - individualLmit;

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(individualLmit);
})

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

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

for(let usedItem of Object.values(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;

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"))
}

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 } = e;
e.register(
Commands.literal("bulkrecycle")
.executes(c=>global.customCommandBulkRecycle(c,true))
.then(
Commands.literal("all")
.executes(c=>global.customCommandBulkRecycle(c,false)))
)
})
31 changes: 16 additions & 15 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 @@ -19,13 +19,13 @@ if (
],
},
{
tag: "forge:device/crafting_place_holder",
tag: "forge:devices/craftingplaceholder",
generic: "gold_nugget",
convert_back_recipe: false,
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 @@ -73,7 +73,7 @@ if (
},
},
{
tag: "forge:device/furniture",
tag: "forge:devices/furniture",
generic: "ptdye:furnished_device",
base: "minecraft:stick",
assembly: [
Expand Down Expand Up @@ -149,7 +149,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 @@ -163,7 +163,7 @@ if (
],
},
{
tag: "forge:device/smart",
tag: "forge:devices/smart",
generic: "ptdye:smart_device",
assembly: [
"#forge:plates/brass",
Expand Down Expand Up @@ -196,7 +196,7 @@ if (
],
},
{
tag: "forge:device/logic",
tag: "forge:devices/logic",
generic: "ptdye:logic_device",
amount_crafted: 8,
assembly: [
Expand Down Expand Up @@ -224,7 +224,7 @@ if (
],
},
{
tag: "forge:device/smokestack",
tag: "forge:devices/smokestack",
generic: "railways:smokestack_woodburner",
base: "minecraft:campfire",
incomplete: "minecraft:campfire",
Expand All @@ -240,7 +240,7 @@ if (
],
},
{
tag: "forge:device/locomotive",
tag: "forge:devices/locomotive",
generic: "ptdye:locomotive_device",
assembly: [
"#forge:plates/obsidian",
Expand All @@ -265,7 +265,7 @@ if (
],
},
{
tag: "forge:device/sealed",
tag: "forge:devices/sealed",
generic: "ptdye:sealed_device",
assembly: [
"#forge:plates/copper",
Expand Down Expand Up @@ -294,7 +294,7 @@ if (
],
},
{
tag: "forge:device/sturdy",
tag: "forge:devices/sturdy",
generic: "ptdye:sturdy_device",
assembly: ["cobblestone", "#forge:plates/iron"],
amount_crafted: 6,
Expand Down Expand Up @@ -327,7 +327,7 @@ if (
],
},
{
tag: "forge:device/mechanical",
tag: "forge:devices/mechanical",
generic: "ptdye:mechanical_device",
assembly: [
"create:iron_sheet",
Expand Down Expand Up @@ -386,10 +386,11 @@ 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.base = device.base || "create:cogwheel";

device.assembly_loops = device.assembly_loops || undefined;
device.tag = device.tag.startsWith("#") ? device.tag : "#" + device.tag;
device.convert_back_recipe =
Expand Down
16 changes: 8 additions & 8 deletions kubejs/server_scripts/base/featrues/hammer.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
const hammer_deviceMap = new Map([
["forge:device/mechanical", "ptdye:mechanical_device"],
["forge:device/sturdy", "ptdye:sturdy_device"],
["forge:device/logic", "ptdye:logic_device"],
["forge:device/sealed", "ptdye:sealed_device"],
["forge:device/smart", "ptdye:smart_device"],
["forge:device/locomotive", "ptdye:locomotive_device"],
["forge:device/red_stringed", "ptdye:red_stringed_device"],
["forge:device/furniture", "ptdye:furnished_device"],
["forge:devices/mechanical", "ptdye:mechanical_device"],
["forge:devices/sturdy", "ptdye:sturdy_device"],
["forge:devices/logic", "ptdye:logic_device"],
["forge:devices/sealed", "ptdye:sealed_device"],
["forge:devices/smart", "ptdye:smart_device"],
["forge:devices/locomotive", "ptdye:locomotive_device"],
["forge:devices/red_stringed", "ptdye:red_stringed_device"],
["forge:devices/furniture", "ptdye:furnished_device"],
]);

function hammer_breakBlock(block, item, player){
Expand Down

0 comments on commit 92c21b6

Please sign in to comment.