294 lines
8.0 KiB
JavaScript
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,
|
|
},
|
|
},
|
|
],
|
|
};
|
|
});
|