101 lines
3.0 KiB
JavaScript
101 lines
3.0 KiB
JavaScript
console.info("[SOCIETY] placeNbtMachine.js loaded");
|
|
|
|
const getSideCalc = (facing, initialPos, comparePos) => {
|
|
switch (facing) {
|
|
case "north":
|
|
return initialPos.x - comparePos.x + 1;
|
|
case "south":
|
|
return comparePos.x - initialPos.x + 1;
|
|
case "east":
|
|
return initialPos.z - comparePos.z + 1;
|
|
case "west":
|
|
return comparePos.z - initialPos.z + 1;
|
|
}
|
|
};
|
|
const getDepthCalc = (facing, initialPos, comparePos) => {
|
|
switch (facing) {
|
|
case "north":
|
|
return comparePos.z - initialPos.z + 1;
|
|
case "south":
|
|
return initialPos.z - comparePos.z + 1;
|
|
case "east":
|
|
return initialPos.x - comparePos.x + 1;
|
|
case "west":
|
|
return comparePos.x - initialPos.x + 1;
|
|
}
|
|
};
|
|
const scanArea = (level, block) => {
|
|
let scannedBlock;
|
|
for (let pos of BlockPos.betweenClosed(
|
|
new BlockPos(block.x - 1, block.y, block.z - 1),
|
|
[block.x + 1, block.y + 2, block.z + 1]
|
|
)) {
|
|
if (!level.isLoaded(pos)) continue;
|
|
scannedBlock = level.getBlock(pos);
|
|
if (
|
|
scannedBlock.id !== "minecraft:air" &&
|
|
scannedBlock.id !== "society:ribbit_hut"
|
|
) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
};
|
|
const setRibbitHutBlocks = (level, block, player, server) => {
|
|
let facing = block.getProperties().get("facing");
|
|
for (let pos of BlockPos.betweenClosed(
|
|
new BlockPos(block.x - 1, block.y, block.z - 1),
|
|
[block.x + 1, block.y + 2, block.z + 1]
|
|
)) {
|
|
level.getBlock(pos).set("society:ribbit_hut_block", {
|
|
layer: (pos.y - block.y).toString(),
|
|
side: getSideCalc(facing, block, pos).toString(),
|
|
depth: getDepthCalc(facing, block, pos).toString(),
|
|
facing: facing,
|
|
});
|
|
}
|
|
const hutBlock = global.getFacing(facing, block.getPos());
|
|
level.getBlock(hutBlock).set("society:ribbit_hut", { facing: facing });
|
|
server.scheduleInTicks(0, () => {
|
|
server.scheduleInTicks(10, () => {
|
|
let nbt = level.getBlock(hutBlock).getEntityData();
|
|
nbt.merge({ data: { owner: player.getUuid().toString() } });
|
|
level.getBlock(hutBlock).setEntityData(nbt);
|
|
});
|
|
});
|
|
};
|
|
|
|
BlockEvents.placed("society:ribbit_hut", (e) => {
|
|
const { player, level, block, server } = e;
|
|
let space = scanArea(level, block);
|
|
|
|
if (!space) {
|
|
player.tell(
|
|
Text.translatable("block.society.ribbit_hut.not_enough_room").red()
|
|
);
|
|
player.inventoryMenu.broadcastFullState();
|
|
e.cancel();
|
|
} else {
|
|
setRibbitHutBlocks(level, block, player, server);
|
|
}
|
|
});
|
|
|
|
BlockEvents.leftClicked(["society:ribbit_hut_block"], (e) => {
|
|
e.player.tell(Text.translatable("block.society.ribbit_hut.break").red());
|
|
});
|
|
|
|
BlockEvents.broken(["society:ribbit_hut"], (e) => {
|
|
const { level, player, block } = e;
|
|
let centerBlock = global.getOpposite(
|
|
block.getProperties().get("facing"),
|
|
block.getPos()
|
|
);
|
|
for (let pos of BlockPos.betweenClosed(
|
|
new BlockPos(centerBlock.x - 1, centerBlock.y, centerBlock.z - 1),
|
|
[centerBlock.x + 1, centerBlock.y + 2, centerBlock.z + 1]
|
|
)) {
|
|
level.getBlock(pos).set("minecraft:air");
|
|
}
|
|
player.give("society:ribbit_hut");
|
|
});
|