247 lines
7.4 KiB
JavaScript
247 lines
7.4 KiB
JavaScript
console.info("[SOCIETY] skullCavernBroken.js loaded");
|
|
|
|
const crashableHammers = [
|
|
"botania:terra_pick",
|
|
"justhammers:diamond_impact_hammer",
|
|
"justhammers:gold_impact_hammer",
|
|
"justhammers:iron_impact_hammer",
|
|
"justhammers:stone_impact_hammer",
|
|
"justhammers:netherite_hammer",
|
|
"justhammers:diamond_hammer",
|
|
"justhammers:gold_hammer",
|
|
"justhammers:iron_hammer",
|
|
"justhammers:stone_hammer",
|
|
"justhammers:netherite_impact_hammer",
|
|
];
|
|
|
|
const biomeAirTypeMap = new Map([
|
|
["society:cavern_top", 0],
|
|
["society:skull_caves", 0],
|
|
["society:lush_caverns", 0],
|
|
["society:frozen_caves", 1],
|
|
["society:frozen_maelstrom", 1],
|
|
["society:desert_caves", 2],
|
|
["society:desert_fault", 2],
|
|
["society:blackstone_caves", 3],
|
|
["society:umbra_barrens", 4],
|
|
]);
|
|
|
|
const scheduleFunction = (level, pos, server, rockType) => {
|
|
if (global.susFunctionLogging)
|
|
console.log("[SOCIETY-SUSFN] skullCavernBroken.js - Regen Air");
|
|
server.schedule(5, () => {
|
|
let toggleBit = level.persistentData.chunkParityMap[level.getChunkAt(pos).pos.toString()].toggleBit;
|
|
if (!level.isLoaded(pos)) return;
|
|
if (
|
|
level.getBlock(pos) &&
|
|
["minecraft:air", "minecraft:void_air", "minecraft:cave_air"].includes(
|
|
level.getBlock(pos).id
|
|
)
|
|
) {
|
|
level.getBlock(pos).set("society:cavern_air", {
|
|
type: String(rockType),
|
|
chunkbit: toggleBit.toString(),
|
|
});
|
|
}
|
|
});
|
|
};
|
|
BlockEvents.broken(
|
|
[
|
|
"society:stone_boulder",
|
|
"society:ice_boulder",
|
|
"society:sandstone_boulder",
|
|
"society:blackstone_boulder",
|
|
"society:end_stone_boulder",
|
|
"minecraft:deepslate_copper_ore",
|
|
"oreganized:lead_ore",
|
|
"create:zinc_ore",
|
|
"create:deepslate_zinc_ore",
|
|
"society:geode_node",
|
|
"society:magma_geode_node",
|
|
"society:omni_geode_node",
|
|
"society:earth_crystal",
|
|
"society:fire_quartz",
|
|
"minecraft:deepslate_emerald_ore",
|
|
"minecraft:emerald_ore",
|
|
"minecraft:deepslate_lapis_ore",
|
|
"minecraft:lapis_ore",
|
|
"minecraft:deepslate_diamond_ore",
|
|
"minecraft:diamond_ore",
|
|
"society:deepslate_sparkstone_ore",
|
|
"society:sparkstone_ore",
|
|
"society:deepslate_iridium_ore",
|
|
"society:iridium_ore",
|
|
"minecraft:copper_ore",
|
|
"minecraft:deepslate_iron_ore",
|
|
"minecraft:iron_ore",
|
|
"minecraft:coal_ore",
|
|
"minecraft:deepslate_coal_ore",
|
|
"minecraft:deepslate_redstone_ore",
|
|
"minecraft:redstone_ore",
|
|
"oreganized:deepslate_silver_ore",
|
|
"oreganized:silver_ore",
|
|
"minecraft:deepslate_gold_ore",
|
|
"minecraft:gold_ore",
|
|
"oreganized:deepslate_lead_ore",
|
|
"society:grimwood_supply_crate",
|
|
"society:oak_supply_crate",
|
|
"society:spruce_supply_crate",
|
|
"society:palm_supply_crate",
|
|
],
|
|
(e) => {
|
|
const { level, block, player, server } = e;
|
|
const pos = block.getPos();
|
|
if (level.dimension === "society:skull_cavern") {
|
|
if (global.disableHammersSkullCavern && crashableHammers.includes(player.getHeldItem("main_hand").id)) {
|
|
server.runCommandSilent(
|
|
`dialog ${player.username} show ${player.username} ${player.getHeldItem("main_hand").id.equals("botania:terra_pick") ? "goddess_unique_skull_cavern_shatterer" : "goddess_unique_skull_cavern_hammer"}`
|
|
);
|
|
e.cancel();
|
|
}
|
|
let rockType = biomeAirTypeMap.get(`${block.biomeId.toString()}`);
|
|
scheduleFunction(level, pos.immutable(), server, rockType);
|
|
}
|
|
}
|
|
);
|
|
|
|
const scheduleUnplaceableRegenFunction = (level, pos, server, id) => {
|
|
server.scheduleInTicks(100, () => {
|
|
if (!level.isLoaded(pos)) return;
|
|
if (level.getBlock(pos) == "minecraft:air") {
|
|
level.getBlock(pos).set(id);
|
|
level.spawnParticles(
|
|
"snowyspirit:glow_light",
|
|
true,
|
|
pos.x,
|
|
pos.y + 0.5,
|
|
pos.z,
|
|
0.2 * rnd(1, 4),
|
|
0.2 * rnd(1, 4),
|
|
0.2 * rnd(1, 4),
|
|
5,
|
|
2
|
|
);
|
|
}
|
|
});
|
|
};
|
|
// Skull Cavern unplacable tag
|
|
BlockEvents.broken(
|
|
[
|
|
"atmospheric:arid_sand",
|
|
"atmospheric:red_arid_sand",
|
|
"minecraft:sand",
|
|
"minecraft:basalt",
|
|
"minecraft:end_stone",
|
|
"minecraft:magma_block",
|
|
"oreganized:glance",
|
|
"oreganized:glance_bricks",
|
|
"oreganized:polished_glance",
|
|
"minecraft:moss_block",
|
|
"minecraft:pale_moss_block",
|
|
"oreganized:spotted_glance",
|
|
"minecraft:snow_block",
|
|
"minecraft:blue_ice",
|
|
"minecraft:packed_ice",
|
|
],
|
|
(e) => {
|
|
const { level, block, server } = e;
|
|
const unplacablePos = block.getPos();
|
|
if (level.dimension === "society:skull_cavern") {
|
|
scheduleUnplaceableRegenFunction(
|
|
level,
|
|
unplacablePos.immutable(),
|
|
server,
|
|
block.getId()
|
|
);
|
|
}
|
|
}
|
|
);
|
|
|
|
LevelEvents.beforeExplosion((e) => {
|
|
const { x, y, z, size, level, server } = e;
|
|
if (level.dimension === "society:skull_cavern") {
|
|
if (global.susFunctionLogging)
|
|
console.log("[SOCIETY-SUSFN] skullCavernBroken.js - explosion");
|
|
let range = Math.round(Math.floor((size * 1.3) / 0.225) * 0.5);
|
|
let blocks = [];
|
|
|
|
for (let xi = Math.floor(x - range); xi <= Math.ceil(x + range); xi++) {
|
|
for (let zi = Math.floor(z - range); zi <= Math.ceil(z + range); zi++) {
|
|
for (let yi = Math.floor(y - range); yi <= Math.ceil(y + range); yi++) {
|
|
let dist = Math.hypot(x - xi, y - yi, z - zi);
|
|
if (dist <= range) {
|
|
let block = level.getBlock(xi, yi, zi);
|
|
if (block.hasTag("society:skull_cavern_bomb_denied")) {
|
|
blocks.push({ xi: xi, yi: yi, zi: zi, dist: dist, id: block.id });
|
|
} else if (block.hasTag("society:skull_cavern_regens")) {
|
|
let rockType = biomeAirTypeMap.get(`${block.biomeId.toString()}`);
|
|
scheduleFunction(level, block.pos.immutable(), server, rockType);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
blocks.sort((a, b) => a.dist - b.dist);
|
|
|
|
for (let i = 0; i < blocks.length; i++) {
|
|
let { xi, yi, zi, id } = blocks[i];
|
|
server.scheduleInTicks(i, () => {
|
|
level.getBlock(xi, yi, zi).set(id);
|
|
});
|
|
}
|
|
}
|
|
});
|
|
|
|
BlockEvents.broken("society:skull_cavern_teleporter", (e) => {
|
|
const { level } = e;
|
|
if (level.dimension === "society:skull_cavern") e.cancel();
|
|
});
|
|
|
|
BlockEvents.broken(
|
|
[
|
|
"society:stone_boulder",
|
|
"society:ice_boulder",
|
|
"society:sandstone_boulder",
|
|
"society:blackstone_boulder",
|
|
"society:end_stone_boulder",
|
|
],
|
|
(e) => {
|
|
const { level, player, server, block } = e;
|
|
if (player.stages.has("moon_rope_reveal") && Math.random() < 0.15) {
|
|
const { x, y, z } = block;
|
|
let scanBlock;
|
|
let abovePos;
|
|
let radius = 8;
|
|
for (let pos of BlockPos.betweenClosed(
|
|
new BlockPos(x - radius, y - radius, z - radius),
|
|
[x + radius, y + radius, z + radius]
|
|
)) {
|
|
if (!level.isLoaded(pos)) continue;
|
|
scanBlock = level.getBlock(pos);
|
|
abovePos = scanBlock.getPos().above();
|
|
if (
|
|
scanBlock.id == "farmersdelight:rope" &&
|
|
level.getBlock(abovePos).id != "farmersdelight:rope"
|
|
) {
|
|
level.spawnParticles(
|
|
"species:spectre_pop",
|
|
true,
|
|
abovePos.x,
|
|
abovePos.y + 0.5,
|
|
abovePos.z,
|
|
0.1 * rnd(1, 4),
|
|
0.1 * rnd(1, 4),
|
|
0.1 * rnd(1, 4),
|
|
5,
|
|
0.01
|
|
);
|
|
server.runCommandSilent(
|
|
`playsound create:peculiar_bell_use block @a ${abovePos.x} ${abovePos.y} ${abovePos.z}`
|
|
);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
);
|