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

321 lines
9.0 KiB
JavaScript

//priority: 100
console.info("[SOCIETY] fishPond.js loaded");
const getRequestedItems = (type, population) => {
let requestedItems = {};
global.fishPondDefinitions.get(`${type}`).quests.forEach((quest) => {
if (quest.population == population) {
requestedItems = quest.requestedItems;
}
});
return requestedItems;
};
global.handleFishInsertion = (clickEvent) => {
const { item, block, player, level, server } = clickEvent;
const { facing, upgraded } = global.getPondProperties(block);
let nbt = block.getEntityData();
const { type, population, max_population, non_native_fish } = nbt.data;
if (type.equals("") && global.fishPondDefinitions.has(`${item.id}`)) {
successParticles(level, block);
block.set(block.id, {
facing: facing,
valid: true,
mature: false,
upgraded: upgraded,
quest: false,
});
nbt.merge({
data: {
type: item.id,
quest_id: 0,
population: 1,
max_population: 3,
non_native_fish: 1,
},
});
global.setBlockEntityData(block, nbt)
if (!player.isCreative()) item.count--;
} else if (type == item && population < max_population) {
server.runCommandSilent(
`playsound minecraft:entity.player.splash block @a ${block.x} ${block.y} ${block.z}`
);
level.spawnParticles(
"minecraft:splash",
true,
block.x + 0.5,
block.y + 0.9,
block.z + 0.5,
0.1 * rnd(1, 4),
0.1 * rnd(1, 4),
0.1 * rnd(1, 4),
10,
0.1
);
nbt.merge({
data: {
population: increaseStage(population),
non_native_fish: increaseStage(non_native_fish),
},
});
global.setBlockEntityData(block, nbt)
if (!player.isCreative()) item.count--;
}
};
global.handleQuestSubmission = (type, clickEvent) => {
const { item, block, player, level } = clickEvent;
const { facing, valid, mature, upgraded } = global.getPondProperties(block);
let nbt = block.getEntityData();
const { max_population, quest_id } = nbt.data;
const questContent = getRequestedItems(type, Number(max_population))[
quest_id
];
if (item && questContent && item == questContent.item) {
let checkedCount = player.stages.has("pond_house_five")
? Math.round(questContent.count / 2)
: questContent.count;
if (item.count >= checkedCount) {
successParticles(level, block);
block.set(block.id, {
facing: facing,
valid: valid,
mature: mature,
upgraded: upgraded,
quest: false,
});
nbt.merge({
data: {
quest_id: 0,
max_population: increaseStage(
max_population,
Number(max_population) === 7 ? 3 : 2
),
},
});
global.setBlockEntityData(block, nbt)
if (
player.stages.has("fishing_mastery") &&
!player.stages.has("pond_house_five") &&
Math.random() <= 0.01
) {
block.popItemFromFace("society:pond_house_five", facing);
}
clickEvent.server.scheduleInTicks(2, () => {
player.tell(
Text.translatable(
"block.society.fish_pond.fish_quest.complete"
).green()
);
});
if (!player.isCreative()) item.count = item.count - checkedCount;
} else {
clickEvent.server.scheduleInTicks(2, () => {
player.tell(
Text.translatable(
"block.society.fish_pond.fish_quest.partial",
`${checkedCount - item.count}`
).red()
);
});
}
}
};
global.handleFishPondRightClick = (clickEvent) => {
const { item, block, hand, player, server, level } = clickEvent;
const { facing, valid, mature, upgraded, quest } =
global.getPondProperties(block);
// Prevent Deployers from using artisan machines
if (player.isFake()) return;
if (hand == "OFF_HAND") return;
if (hand == "MAIN_HAND") {
let nbt = block.getEntityData();
const { type, population, quest_id } = nbt.data;
if (upgraded === false && item === "society:sea_biscut") {
if (!player.isCreative()) item.count--;
level.spawnParticles(
"farmersdelight:star",
true,
block.x,
block.y + 1,
block.z,
0.2 * rnd(1, 2),
0.2 * rnd(1, 2),
0.2 * rnd(1, 2),
3,
0.01
);
block.set(block.id, {
facing: facing,
valid: valid,
mature: false,
upgraded: true,
quest: quest,
});
}
if (!player.isCrouching()) {
if (item && quest === "true" && global.fishPondDefinitions.get(`${type}`)) {
global.handleQuestSubmission(type, clickEvent);
}
global.handleFishInsertion(clickEvent);
if (mature === "true") {
global.handleFishHarvest(block, player, server, false, player.stages);
}
if (!type.equals("") && population == "0") {
if (item && item.hasTag("forge:tools/fishing_rods")) {
block.set(block.id, {
facing: facing,
valid: valid,
mature: false,
upgraded: upgraded,
quest: false,
});
nbt.merge({
data: {
type: "",
quest_id: 0,
population: 0,
max_population: 3,
non_native_fish: 0,
},
});
} else {
player.tell(
Text.translatable("block.society.fish_pond.fishing_rod").red()
);
}
}
} else if (population > 0) {
let fishItem = global.handleFishExtraction(block, player, server, player.stages);
if (fishItem) player.give(fishItem);
}
}
};
StartupEvents.registry("block", (event) => {
event
.create("society:fish_pond", "cardinal")
.property(booleanProperty.create("valid"))
.property(booleanProperty.create("mature"))
.property(booleanProperty.create("upgraded"))
.property(booleanProperty.create("quest"))
.defaultCutout()
.tagBlock("minecraft:mineable/pickaxe")
.tagBlock("minecraft:mineable/axe")
.tagBlock("minecraft:needs_stone_tool")
.item((item) => {
item.modelJson({
parent: "society:block/kubejs/fish_pond",
});
item.fireResistant(true);
})
.defaultState((state) => {
state
.set(booleanProperty.create("valid"), true)
.set(booleanProperty.create("mature"), false)
.set(booleanProperty.create("upgraded"), false)
.set(booleanProperty.create("quest"), false);
})
.placementState((state) => {
state
.set(booleanProperty.create("valid"), true)
.set(booleanProperty.create("mature"), false)
.set(booleanProperty.create("upgraded"), false)
.set(booleanProperty.create("quest"), false);
})
.rightClick((click) => {
global.handleFishPondRightClick(click);
})
.blockEntity((blockInfo) => {
blockInfo.initialData({
type: "",
quest_id: 0,
population: 0,
max_population: 3,
non_native_fish: 0,
});
blockInfo.serverTick(fishPondTickRate, 0, (entity) => {
global.handleFishPondTick(entity);
});
}).blockstateJson = {
multipart: [
{ apply: { model: "society:block/kubejs/fish_pond_particle" } },
{
when: { facing: "north", upgraded: false },
apply: { model: "society:block/kubejs/fish_pond", y: 0, uvlock: false },
},
{
when: { facing: "east", upgraded: false },
apply: {
model: "society:block/kubejs/fish_pond",
y: 90,
uvlock: false,
},
},
{
when: { facing: "south", upgraded: false },
apply: {
model: "society:block/kubejs/fish_pond",
y: 180,
uvlock: false,
},
},
{
when: { facing: "west", upgraded: false },
apply: {
model: "society:block/kubejs/fish_pond",
y: -90,
uvlock: false,
},
},
{
when: { facing: "north", upgraded: true },
apply: {
model: "society:block/kubejs/fish_pond_upgraded",
y: 0,
uvlock: false,
},
},
{
when: { facing: "east", upgraded: true },
apply: {
model: "society:block/kubejs/fish_pond_upgraded",
y: 90,
uvlock: false,
},
},
{
when: { facing: "south", upgraded: true },
apply: {
model: "society:block/kubejs/fish_pond_upgraded",
y: 180,
uvlock: false,
},
},
{
when: { facing: "west", upgraded: true },
apply: {
model: "society:block/kubejs/fish_pond_upgraded",
y: -90,
uvlock: false,
},
},
{
when: { mature: true },
apply: { model: "society:block/kubejs/machine_done" },
},
{
when: { quest: true, mature: false },
apply: { model: "society:block/kubejs/pond_quest" },
},
{
when: { valid: false },
apply: { model: "society:block/kubejs/error" },
},
],
};
});