console.info("[SOCIETY] ribbitHut.js loaded"); const Block = Java.loadClass("net.minecraft.world.level.block.Block"); const getDrops = (block, blockState, level, pos, player) => { if (block.id.includes("vinery")) { let grape = block.getProperties().get("grape").split("_"); if (grape.length == 1) { return [ Item.of( `4x ${["crimson", "warped"].includes(grape[0]) ? "nethervinery" : "vinery" }:${grape[0]}_grape` ), ]; } return [Item.of(`4x vinery:${grape[0]}_grapes_${grape[1]}`)]; } if (block.id.equals("windswept:wild_berry_bush")) { return [Item.of(`2x windswept:wild_berries`)]; } if (block.id.equals("autumnity:tall_foul_berry_bush")) { return [Item.of(`2x autumnity:foul_berries`)]; } return Block.getDrops( blockState, level, pos, null, player, Item.of("minecraft:hoe") ); }; const getPlantData = (block, mcBlock, blockState) => { let properties = block.getProperties(); if ( !properties || !properties.get("age") || ["minecraft:torchflower", "minecraft:pitcher_crop"].includes(block.id) ) { return { maxAge: true, }; } if ( [ "windswept:wild_berry_bush", "minecraft:sweet_berry_bush", "autumnity:tall_foul_berry_bush", ].includes(block.id) ) { return { maxAge: properties.get("age").equals("3"), newAge: "minecraft:sweet_berry_bush".equals(block.id) || "autumnity:tall_foul_berry_bush".equals(block.id) ? "1" : "2", }; } if ("society:mana_fruit_crop".equals(block.id)) return { maxAge: properties.get("age").equals("7"), newAge: "0" }; if ("vintagedelight:gearo_berry_bush".equals(block.id)) return { maxAge: properties.get("age").equals("4"), newAge: "2" }; if ("minecraft:cocoa".equals(block.id)) return { maxAge: properties.get("age").equals("2"), newAge: "0" }; if ("minecraft:nether_wart".equals(block.id)) return { maxAge: properties.get("age").equals("3"), newAge: "0" }; if (block.id.includes("vinery")) { return { maxAge: properties.get("age").equals("4"), newAge: block.id.includes("lattice") ? "1" : "2", }; } if (["minecraft:melon_stem", "minecraft:pumpkin_stem"].includes(block.id)) { return { maxAge: false, newAge: "0", }; } return { maxAge: mcBlock.isMaxAge(blockState), newAge: "0" }; }; const setHarvested = (level, pos, server, block, age) => { let newProperties = block.getProperties(); if (age) { newProperties.age = `${age}`; block.set(block.id, newProperties); } else { block.set("minecraft:air"); } const { x, y, z } = pos; server.runCommandSilent( `playsound minecraft:block.grass.break block @a ${x} ${y} ${z} 0.5` ); level.spawnParticles( "ribbits:spell", true, x + 0.5, y + 0.5, z + 0.5, 0, 0.1, 0, 1, 0.0001 ); }; global.handleRibbitHarvest = (tickEvent, pos, player, delay) => { const { level, block } = tickEvent; const server = level.server; let blockState; let drops; let quality; let scannedBlock; let inserted = false; let valid = true; let plantData; if (global.susFunctionLogging) console.log("[SOCIETY-SUSFN] ribbitHut.js"); server.scheduleInTicks(delay, () => { if (!level.isLoaded(pos)) return; scannedBlock = level.getBlock(pos); if (scannedBlock && scannedBlock.hasTag("society:ribbit_hut_harvests")) { blockState = level.getBlockState(pos); plantData = getPlantData(scannedBlock, blockState.block, blockState); if ( scannedBlock.id === "supplementaries:flax" && scannedBlock.getProperties().get("half") == "lower" ) { valid = false; } if (valid && plantData.maxAge) { drops = getDrops(scannedBlock, blockState, level, pos, player); drops.forEach((drop) => { quality = global.getCropQuality(scannedBlock); // 4.0 TODO: remove effects:[] from this data if (quality > 0) { drop.nbt = `{quality_food:{effects:[],quality:${quality}}}`; } if (scannedBlock.id == "society:mana_fruit_crop") { if (player.stages.has("paradise_crop")) drop.count += 1; if (player.stages.has("crop_collector")) drop.count *= 2; } if (global.inventoryHasRoom(block, drop)) { global.insertInto(block, drop); inserted = true; } }); } if (inserted) { inserted = false; if (scannedBlock.id === "supplementaries:flax") { scannedBlock.set("minecraft:air"); level .getBlock(pos.below()) .set("supplementaries:flax", { age: "0", half: "lower" }); } else { setHarvested(level, pos, server, scannedBlock, plantData.newAge); } } } }); }; global.runRibbitHut = (tickEvent) => { const { level, block } = tickEvent; let centerBlock = global.getOpposite( block.getProperties().get("facing"), block.getPos() ); const { x, y, z } = centerBlock; let scannedBlocks = 0; let attachedPlayer; let dayTime = level.dayTime(); let morningModulo = dayTime % 24000; const ribbitHutProgTime = 1000; if ( morningModulo >= ribbitHutProgTime && morningModulo < ribbitHutProgTime + artMachineTickRate ) { level.getServer().players.forEach((p) => { if (p.getUuid().toString() === block.getEntityData().data.owner) { attachedPlayer = p; } }); if (attachedPlayer) { level.server.runCommandSilent( `playsound ribbits:entity.ribbit.ambient block @a ${x} ${y} ${z}` ); for (let pos of BlockPos.betweenClosed( new BlockPos(x - 7, y - 1, z - 7), [x + 7, y + 1, z + 7] )) { global.handleRibbitHarvest( tickEvent, pos.immutable(), attachedPlayer, scannedBlocks ); scannedBlocks++; } } } }; StartupEvents.registry("block", (e) => { e.create("society:ribbit_hut", "cardinal") .tagBlock("minecraft:mineable/pickaxe") .tagBlock("minecraft:needs_stone_tool") .soundType("shroomlight") .defaultCutout() .item((item) => { item.tooltip( Text.translatable("block.society.ribbit_hut.description").gray() ); item.tooltip( Text.translatable( "society.working_block_entity.apply_player_skill" ).gray() ); item.tooltip( Text.translatable("tooltip.society.area", `15x3x15`).green() ); item.modelJson({ parent: "minecraft:item/generated", textures: { layer0: "society:item/ribbit_hut_item", }, }); }) .lightLevel(1) .property(booleanProperty.create("upgraded")) .defaultState((state) => { state.set(booleanProperty.create("upgraded"), false); }) .placementState((state) => { state.set(booleanProperty.create("upgraded"), false); }) .soundType("stone") .model("society:block/kubejs/ribbit_hut/bottom_front_center") .blockEntity((blockInfo) => { blockInfo.inventory(9, 3); blockInfo.initialData({ owner: "-1" }); blockInfo.serverTick(artMachineTickRate, 0, (entity) => { global.runRibbitHut(entity); }), blockInfo.rightClickOpensInventory(); blockInfo.attachCapability( CapabilityBuilder.ITEM.blockEntity() .insertItem((blockEntity, slot, stack, simulate) => blockEntity.inventory.insertItem(slot, stack, simulate) ) .extractItem((blockEntity, slot, stack, simulate) => blockEntity.inventory.extractItem(slot, stack, simulate) ) .getSlotLimit((blockEntity, slot) => blockEntity.inventory.getSlotLimit(slot) ) .getSlots((blockEntity) => blockEntity.inventory.slots) .getStackInSlot((blockEntity, slot) => blockEntity.inventory.getStackInSlot(slot) ) ); }); e.create("society:ribbit_hut_block", "cardinal") .property(integerProperty.create("layer", 0, 2)) .property(integerProperty.create("depth", 0, 2)) .property(integerProperty.create("side", 0, 2)) .defaultState((state) => { state.set(integerProperty.create("layer", 0, 2), 0); state.set(integerProperty.create("depth", 0, 2), 0); state.set(integerProperty.create("side", 0, 2), 1); }) .placementState((state) => { state.set(integerProperty.create("layer", 0, 2), 0); state.set(integerProperty.create("depth", 0, 2), 0); state.set(integerProperty.create("side", 0, 2), 1); }) .resistance(3600000) .unbreakable() .item((item) => { item.modelJson({ parent: "ribbits:item/toadstool", }); }) .tagBlock("minecraft:mineable/axe") .tagBlock("minecraft:needs_stone_tool") .defaultCutout() .soundType("stone"); });