Files
2026-07-31 10:34:32 +09:00

287 lines
8.8 KiB
JavaScript

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