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

328 lines
12 KiB
JavaScript

const $Block = Java.loadClass("net.minecraft.world.level.block.Block");
const $IntegerProperty = Java.loadClass(
"net.minecraft.world.level.block.state.properties.IntegerProperty"
);
const $BooleanProperty = Java.loadClass(
"net.minecraft.world.level.block.state.properties.BooleanProperty"
);
const $CropBlock = Java.loadClass(
"net.minecraft.world.level.block.CropBlock"
);
const $SereneFertility = Java.loadClass("sereneseasons.init.ModFertility");
const $JadeCropInfo = Java.loadClass("snownee.jade.addon.vanilla.CropProgressProvider");
const $DewdropConfig = Java.loadClass("cool.bot.dewdropfarmland.Config");
const Vec2 = Java.loadClass("net.minecraft.world.phys.Vec2");
global["JadePlushieClientCallback"] = (tooltip, accessor, pluginConfig) => {
if (!global.plushies.includes(accessor.getBlock().id)) return;
const nbt = accessor.getServerData();
if (nbt.type.equals("")) return;
const type = nbt.type;
let typeData = global.plushieTraits[type];
const affection = Number(nbt.affection);
const quality = Number(nbt.quality);
let blockName = accessor.getBlock().getDescriptionId();
tooltip.clear();
tooltip.add(Component.translatable(blockName));
tooltip.add(`§6${"★".repeat(quality + 1)}§8${"☆".repeat(3 - quality)}`);
tooltip.add(${typeData.color}${global.formatName(typeData.trait)}`);
if (nbt.animal) {
tooltip.add(global.getTranslatedEntityName(String(nbt.animal)));
} else {
tooltip.add(
`§c${affection > 0 ? `❤`.repeat(affection) : ""}§8${
affection < 4 ? `❤`.repeat(4 - affection) : ""
}`
);
}
};
global["JadeShippingBinClientCallback"] = (tooltip, accessor, pluginConfig) => {
const blockId = accessor.getBlock().id;
if (blockId !== "shippingbin:basic_shipping_bin" && blockId !== "shippingbin:smart_shipping_bin") return;
const nbt = accessor.getServerData();
let customName = global.getShippingBinName(nbt, false);
if (customName) tooltip.add(customName);
};
global["JadeFishPondClientCallback"] = (tooltip, accessor, pluginConfig) => {
if (accessor.getBlock().id !== "society:fish_pond") return;
const properties = accessor.getBlockState();
const nbt = accessor.getServerData();
if (nbt.type.equals("")) return;
let fish = nbt.type;
const upgraded = properties.getValue($BooleanProperty.create("upgraded"));
let fishIcons = "";
for (let index = 0; index < nbt.max_population; index++) {
if (index < nbt.population) fishIcons += "§3⏳§r";
else fishIcons += "§7⏳§r";
}
let blockName = accessor.getBlock().getDescriptionId();
tooltip.clear();
const helper = tooltip.getElementHelper();
const fishIcon = helper
.item(Item.of(fish), 0.5)
.message(null)
.translate(Vec2(-2, -1));
tooltip.add(Component.translatable(blockName));
tooltip["add(snownee.jade.api.ui.IElement)"](fishIcon);
tooltip.append(Component.translatable(Item.of(fish).getDescriptionId()));
if (upgraded) {
tooltip["add(snownee.jade.api.ui.IElement)"](
helper
.item(Item.of("society:sea_biscut"), 0.5)
.message(null)
.translate(Vec2(-2, -1))
);
tooltip.append(fishIcons);
} else {
tooltip.add(fishIcons);
}
};
global["JadeArtisanMachineClientCallback"] = (
tooltip,
accessor,
pluginConfig
) => {
if (!global.artisanMachineIds.includes(accessor.getBlock().id)) return;
const properties = accessor.getBlockState();
const nbt = accessor.getServerData();
if (!nbt) return;
const machine = global.artisanMachineDefinitions.filter((obj) => {
return obj.id === accessor.getBlock().id;
})[0];
if (!machine) return;
const isChargingRod = accessor.getBlock().id === "society:charging_rod";
const working = properties.getValue($BooleanProperty.create("working"));
if (!working || (nbt.recipe.equals("") && !isChargingRod)) return;
const recipe = isChargingRod
? {
output: ["society:battery"],
}
: machine.recipes.get(nbt.recipe);
const stage = nbt.stage;
const upgraded = properties.getValue($BooleanProperty.create("upgraded"));
let duration = recipe.time || machine.stageCount;
if (accessor.getBlock().id == "society:aging_cask" && upgraded) {
duration = Math.round(duration / 2);
}
let progressIcons = "";
for (let index = 0; index < duration; index++) {
if (index < stage) progressIcons += "⬛";
else progressIcons += "⬜";
}
const progress = Text.translatable(
"jade.society.working_block_entity.progress",
`${Number(stage)}`,
`${duration}`
);
let blockName = accessor.getBlock().getDescriptionId();
tooltip.clear();
const helper = tooltip.getElementHelper();
const recipeIcon = helper
.item(Item.of(recipe.output[0]), 0.5)
.message(null)
.translate(Vec2(-2, -1));
tooltip.add(Component.translatable(blockName));
tooltip["add(snownee.jade.api.ui.IElement)"](recipeIcon);
tooltip.append(
Component.translatable(Item.of(recipe.output[0]).getDescriptionId())
);
if (upgraded) {
tooltip["add(snownee.jade.api.ui.IElement)"](
helper
.item(Item.of(machine.upgrade), 0.5)
.message(null)
.translate(Vec2(-2, -1))
);
tooltip.append(progress);
} else {
tooltip.add(progress);
}
tooltip["append(snownee.jade.api.ui.IElement)"](
helper
.item(Item.of("minecraft:clock"), 0.5)
.message(null)
.translate(Vec2(-2, -1))
);
};
global["JadeSocietyCropClientCallback"] = (
tooltip,
accessor,
pluginConfig
) => {
const block = accessor.getBlock();
const position = accessor.getPosition();
const level = accessor.getLevel();
const blockContainer = level.getBlock(position);
const state = accessor.getBlockState();
const name = block.getIdLocation().toString();
const strictGreenhouse = $DewdropConfig.strictGreenhouses;
const soil = (() => {
let scannedBlock;
for (let i = -2; i < 0 ; i++) {
scannedBlock = level.getBlock(position.above(i));
if (scannedBlock.getId().includes("farmland") || scannedBlock.getId().includes("garden_pot")) {
return scannedBlock;
}
}
return null;
})();
const needsFarmland = ([
"minecraft:sweet_berry_bush",
"windswept:wild_berry_bush",
"vintagedelight:gearo_berry_bush",
"farmersdelight:rice",
"farmersdelight:rice_panicles"
].includes(name));
const fertilizerNotApplies = [
"farmersdelight:rice_panicles"
];
const grapeMap = {
red: "vinery:red_grape_seeds",
white: "vinery:white_grape_seeds",
savanna_red: "vinery:savanna_grape_seeds_red",
savanna_white: "vinery:savanna_grape_seeds_white",
taiga_red: "vinery:taiga_grape_seeds_red",
taiga_white: "vinery:taiga_grape_seeds_white",
jungle_red: "vinery:jungle_grape_seeds_red",
jungle_white: "vinery:jungle_grape_seeds_white",
crimson: "nethervinery:crimson_grape_seeds",
warped: "nethervinery:warped_grape_seeds"
};
const hasGreenhouseGlass = () => {
let scannedBlock;
for (let i = 0; i < 16; i++) {
scannedBlock = level.getBlock(position.above(i + 1));
if (strictGreenhouse && scannedBlock.hasTag("dewdrop:waterable")) return false;
if (scannedBlock.hasTag("sereneseasons:greenhouse_glass")) {
return true;
}
}
return false;
};
const hasAvailableGardenPot = () => {
const pot = soil;
if (!pot || !pot.getId().includes("dew_drop_farmland_growth:garden_pot")) return false;
if (!level.canSeeSky(position.above())) return true;
return false;
};
const getGrowthDay = (age, maxAge) => {
const farmland = soil;
if (!farmland || fertilizerNotApplies.includes(name)) return {age: age, maxAge: maxAge, boosted: false};
let delta = 0;
if (farmland.hasTag("dew_drop_farmland_growth:weak_fertilized_farmland")) {
delta = 1;
}
if (farmland.hasTag("dew_drop_farmland_growth:strong_fertilized_farmland")) {
delta = 2;
}
if (farmland.hasTag("dew_drop_farmland_growth:hyper_fertilized_farmland")) {
delta = 3;
}
if (delta == 0) return {age: age, maxAge: maxAge, boosted: false};
return {age: age == 0 ? 0 : age - delta, maxAge: Math.max(1, maxAge - delta), boosted: true};
};
const isCropFertile = (cropId) => {
if (needsFarmland && !soil) return false;
return $SereneFertility.isCropFertile(cropId, level, position)
|| hasGreenhouseGlass()
|| hasAvailableGardenPot();
};
const addGrowthLevelTooltip = (current, max, isFertile) => {
const { age, maxAge, boosted } = getGrowthDay(current, max);
let ageText = Component.of(Number(age).toFixed());
let maxAgeText = Component.of(Number(maxAge).toFixed());
if(boosted) {ageText = ageText.darkGreen(); maxAgeText = maxAgeText.darkGreen()}
if (current >= max) {
tooltip.add(Component.translatable("jade.society.crop_growth.mature").darkGreen());
} else {
tooltip.add(Component.translatable("jade.society.crop_growth", ageText, maxAgeText));
}
if (!isFertile) {
tooltip.add(Component.translatable("jade.society.crop_growth.stop").red());
}
};
if ($SereneFertility.isCrop(state) && blockContainer.hasTag("dew_drop_farmland_growth:cancel_random_tick")) {
try {
if (block instanceof $CropBlock) {
addGrowthLevelTooltip(block.getAge(state), block.getMaxAge(), isCropFertile(name));
} else if (state.hasProperty(BlockProperties.AGE_7)) {
addGrowthLevelTooltip(state.getValue(BlockProperties.AGE_7), 7, isCropFertile(name));
} else if (state.hasProperty(BlockProperties.AGE_5)) {
addGrowthLevelTooltip(state.getValue(BlockProperties.AGE_5), 5, isCropFertile(name));
} else if (state.hasProperty(BlockProperties.AGE_4)) {
addGrowthLevelTooltip(state.getValue(BlockProperties.AGE_4), 4, isCropFertile(name));
} else if (state.hasProperty(BlockProperties.AGE_3)) {
addGrowthLevelTooltip(state.getValue(BlockProperties.AGE_3), 3, isCropFertile(name));
}
} catch (e) {}
} else if (name.includes("grape_bush")) {
const age = state.getValue(BlockProperties.AGE_3);
addGrowthLevelTooltip(age, 3, isCropFertile(grapeMap[name.replace("_grape_bush", "")]));
tooltip.add(Component.translatable("jade.society.crop_growth.stop").red());
if (name.includes("jungle")) tooltip.add(Component.translatable("jade.society.crop_growth.need_lattice").red());
else tooltip.add(Component.translatable("jade.society.crop_growth.need_stem").red());
} else if (name.includes("grapevine_stem") || name.match(/vinery:.+_lattice/i)) {
const age = state.getValue(BlockProperties.AGE_4);
if (age == 0) return;
addGrowthLevelTooltip(
age,
4,
isCropFertile(grapeMap[state.getValue(block.getStateDefinition().getProperty("grape")).getSerializedName()])
);
} else {
$JadeCropInfo.INSTANCE.appendTooltip(tooltip.getTooltip(), accessor, pluginConfig);
if (!blockContainer.hasTag("dew_drop_farmland_growth:cancel_random_tick") && $SereneFertility.isCrop(state) && !isCropFertile(name)) {
tooltip.add(Component.translatable("jade.society.crop_growth.stop").red());
}
}
if (needsFarmland && !soil) {
if (name.includes("rice")) tooltip.add(Component.translatable("jade.society.crop_growth.need_watered_farmland").red());
else tooltip.add(Component.translatable("jade.society.crop_growth.need_farmland").red());
}
};
JadeEvents.onClientRegistration((e) => {
e.block("society:plushie_jade", $Block).tooltip(
(tooltip, accessor, pluginConfig) => {
global["JadePlushieClientCallback"](tooltip, accessor, pluginConfig);
}
);
e.block("society:fish_pond_jade", $Block).tooltip(
(tooltip, accessor, pluginConfig) => {
global["JadeFishPondClientCallback"](tooltip, accessor, pluginConfig);
}
);
e.block("society:artisan_machine_jade", $Block).tooltip(
(tooltip, accessor, pluginConfig) => {
global["JadeArtisanMachineClientCallback"](
tooltip,
accessor,
pluginConfig
);
}
);
e.block("society:crop_growth_jade", $Block).tooltip(
(tooltip, accessor, pluginConfig) => {
global["JadeSocietyCropClientCallback"](tooltip, accessor, pluginConfig);
}
);
e.block("kubejs:shipping_bin_jade", $Block).tooltip(
(tooltip, accessor, pluginConfig) => {
global["JadeShippingBinClientCallback"](tooltip, accessor, pluginConfig);
}
);
});