Files
jgl_sunlit_patch/kubejs/startup_scripts/powerfulMachines/feedingTrough.js
T
2026-07-31 10:34:32 +09:00

294 lines
8.0 KiB
JavaScript

console.info("[SOCIETY] feedingTrough.js loaded");
const feedFunction = (
level,
animal,
day,
inventory,
hasAnimalFeed,
hasCandiedFeed,
hasManaFeed
) => {
let data = animal.persistentData;
if (!data.getInt("ageLastFed") || day < data.getInt("ageLastFed")) {
data.ageLastFed = day;
}
if (day > data.ageLastFed) {
let fed = false;
let boost = 0;
// prefer candied > mana > normal
if (
hasCandiedFeed &&
global.useInventoryItems(inventory, "society:candied_animal_feed", 1) == 1
) {
fed = true;
boost = 100;
} else if (hasManaFeed && global.useInventoryItems(inventory, "society:mana_feed", 1) == 1) {
fed = true;
boost = 30;
} else if (
hasAnimalFeed &&
global.useInventoryItems(inventory, "society:animal_feed", 1) == 1
) {
fed = true;
}
if (fed) {
animal.heal(4);
data.ageLastFed = day;
if (boost > 0) data.affection = data.getInt("affection") + boost;
level.spawnParticles(
"legendarycreatures:wisp_particle",
true,
animal.x,
animal.y + 1.5,
animal.z,
0.1 * rnd(1, 4),
0.1 * rnd(1, 4),
0.1 * rnd(1, 4),
5,
0.01
);
}
}
};
global.runFeedingTrough = (be, inventory, block, level) => {
let radius = 6;
let hasAnimalFeed = global.inventoryHasItems(inventory, "society:animal_feed", 1) == 1;
let hasCandiedFeed = global.inventoryHasItems(inventory, "society:candied_animal_feed", 1) == 1;
let hasManaFeed = global.inventoryHasItems(inventory, "society:mana_feed", 1) == 1;
if (!(hasAnimalFeed || hasCandiedFeed || hasManaFeed)) return;
let slots = inventory.getSlots();
let feedCount = 0;
let nearbyFarmAnimals;
let day = global.getDay(level);
nearbyFarmAnimals = level
.getEntitiesWithin(AABB.ofBlock(block).inflate(radius))
.filter((entity) => global.checkEntityTag(entity, "society:husbandry_animal"));
nearbyFarmAnimals.forEach((animal) => {
feedFunction(level, animal, day, inventory, hasAnimalFeed, hasCandiedFeed, hasManaFeed);
});
// Handle visual
for (let i = 0; i < slots; i++) {
if (inventory.getStackInSlot(i).hasTag("society:animal_feed"))
feedCount += inventory.getStackInSlot(i).count;
}
let fill = 0;
if (feedCount >= 512) fill = 4;
else if (feedCount >= 256) fill = 3;
else if (feedCount >= 128) fill = 2;
else if (feedCount >= 8) fill = 1;
be.block.set(be.block.id, {
facing: be.block.properties.facing,
fill: String(fill),
});
};
StartupEvents.registry("block", (event) => {
event
.create("society:feeding_trough", "cardinal")
.property(integerProperty.create("fill", 0, 4))
.tagBlock("minecraft:mineable/axe")
.tagBlock("minecraft:needs_stone_tool")
.box(0, 0, 2, 16, 12, 14)
.defaultCutout()
.item((item) => {
item.tooltip(Text.translatable("block.society.feeding_trough.description").gray());
item.tooltip(Text.translatable("tooltip.society.area", `13x13x13`).green());
item.modelJson({
parent: "farm_and_charm:block/feeding_trough_size_0",
});
})
.defaultState((state) => {
state.set(integerProperty.create("fill", 0, 4), 0);
})
.placementState((state) => {
state.set(integerProperty.create("fill", 0, 4), 0);
})
.blockEntity((blockInfo) => {
blockInfo.inventory(9, 1);
blockInfo.initialData({ fill: "0" });
blockInfo.serverTick(300, 0, (entity) => {
const { inventory, block, level } = entity;
global.runFeedingTrough(entity, inventory, block, level);
}),
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))
);
}).blockstateJson = {
multipart: [
{
when: { fill: 0, facing: "north" },
apply: {
model: "farm_and_charm:block/feeding_trough_size_0",
y: 0,
uvlock: false,
},
},
{
when: { fill: 0, facing: "east" },
apply: {
model: "farm_and_charm:block/feeding_trough_size_0",
y: 90,
uvlock: false,
},
},
{
when: { fill: 0, facing: "south" },
apply: {
model: "farm_and_charm:block/feeding_trough_size_0",
y: 180,
uvlock: false,
},
},
{
when: { fill: 0, facing: "west" },
apply: {
model: "farm_and_charm:block/feeding_trough_size_0",
y: -90,
uvlock: false,
},
},
{
when: { fill: 1, facing: "north" },
apply: {
model: "farm_and_charm:block/feeding_trough_size_1",
y: 0,
uvlock: false,
},
},
{
when: { fill: 1, facing: "east" },
apply: {
model: "farm_and_charm:block/feeding_trough_size_1",
y: 90,
uvlock: false,
},
},
{
when: { fill: 1, facing: "south" },
apply: {
model: "farm_and_charm:block/feeding_trough_size_1",
y: 180,
uvlock: false,
},
},
{
when: { fill: 1, facing: "west" },
apply: {
model: "farm_and_charm:block/feeding_trough_size_1",
y: -90,
uvlock: false,
},
},
{
when: { fill: 2, facing: "north" },
apply: {
model: "farm_and_charm:block/feeding_trough_size_2",
y: 0,
uvlock: false,
},
},
{
when: { fill: 2, facing: "east" },
apply: {
model: "farm_and_charm:block/feeding_trough_size_2",
y: 90,
uvlock: false,
},
},
{
when: { fill: 2, facing: "south" },
apply: {
model: "farm_and_charm:block/feeding_trough_size_2",
y: 180,
uvlock: false,
},
},
{
when: { fill: 2, facing: "west" },
apply: {
model: "farm_and_charm:block/feeding_trough_size_2",
y: -90,
uvlock: false,
},
},
{
when: { fill: 3, facing: "north" },
apply: {
model: "farm_and_charm:block/feeding_trough_size_3",
y: 0,
uvlock: false,
},
},
{
when: { fill: 3, facing: "east" },
apply: {
model: "farm_and_charm:block/feeding_trough_size_3",
y: 90,
uvlock: false,
},
},
{
when: { fill: 3, facing: "south" },
apply: {
model: "farm_and_charm:block/feeding_trough_size_3",
y: 180,
uvlock: false,
},
},
{
when: { fill: 3, facing: "west" },
apply: {
model: "farm_and_charm:block/feeding_trough_size_3",
y: -90,
uvlock: false,
},
},
{
when: { fill: 4, facing: "north" },
apply: {
model: "farm_and_charm:block/feeding_trough_size_4",
y: 0,
uvlock: false,
},
},
{
when: { fill: 4, facing: "east" },
apply: {
model: "farm_and_charm:block/feeding_trough_size_4",
y: 90,
uvlock: false,
},
},
{
when: { fill: 4, facing: "south" },
apply: {
model: "farm_and_charm:block/feeding_trough_size_4",
y: 180,
uvlock: false,
},
},
{
when: { fill: 4, facing: "west" },
apply: {
model: "farm_and_charm:block/feeding_trough_size_4",
y: -90,
uvlock: false,
},
},
],
};
});