diff --git a/patches/server/0062-Bedrock-break-list.patch b/patches/server/0062-Bedrock-break-list.patch new file mode 100644 index 00000000..86fce313 --- /dev/null +++ b/patches/server/0062-Bedrock-break-list.patch @@ -0,0 +1,220 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: violetc <58360096+s-yh-china@users.noreply.github.com> +Date: Wed, 22 Mar 2023 17:18:23 +0800 +Subject: [PATCH] Bedrock break list + + +diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java +index 74e223322b7ad7485164bc3671dcb98cbe23539c..6eed06e31494ffde47ce0cf9d5deff9d7a29ea58 100644 +--- a/src/main/java/net/minecraft/server/MinecraftServer.java ++++ b/src/main/java/net/minecraft/server/MinecraftServer.java +@@ -1602,6 +1602,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop> pistonCache = new HashMap<>(); ++ private static final List BBL = new ArrayList<>(); ++ private static final List MBB = new ArrayList<>(); ++ private static final List LBL = new ArrayList<>(); ++ ++ public static void endTick() { ++ for (var map : pistonCache.values()) { ++ if (!map.isEmpty()) { ++ map.clear(); ++ } ++ } ++ } ++ ++ public static void onPlayerPlacePiston(Level level, Player player, BlockPos pos) { ++ if (LeavesConfig.bedrockBreakList) { ++ Direction pistonFacing = level.getBlockState(pos).getValue(DirectionalBlock.FACING); ++ BlockPos bedrockPos = pos.relative(pistonFacing); ++ if (level.getBlockState(bedrockPos).getBlock() == Blocks.BEDROCK) { ++ pistonCache.computeIfAbsent(level, k -> new HashMap<>()).put(pos, player); ++ } ++ } ++ } ++ ++ public static void onPistonBreakBedrock(Level level, BlockPos bedrock) { ++ if (LeavesConfig.bedrockBreakList) { ++ Map map = pistonCache.get(level); ++ ++ boolean flag = map != null && map.get(bedrock) != null; ++ ++ if (flag) { ++ if (!BBL.isEmpty()) { ++ String player = map.get(bedrock).getScoreboardName(); ++ for (Objective objective : BBL) { ++ level.getScoreboard().getOrCreatePlayerScore(player, objective).increment(); ++ } ++ } ++ } else { ++ if (!MBB.isEmpty()) { ++ String world = "$" + level.dimension().location(); ++ for (Objective objective : MBB) { ++ level.getScoreboard().getOrCreatePlayerScore(world, objective).increment(); ++ level.getScoreboard().getOrCreatePlayerScore("$total", objective).increment(); ++ } ++ } ++ } ++ ++ if (!LBL.isEmpty() && !level.players().isEmpty()) { ++ Player closestPlayer = level.getNearestPlayer(bedrock.getX(), bedrock.getY(), bedrock.getZ(), 10.5, null); ++ if (closestPlayer != null) { ++ String player = closestPlayer.getScoreboardName(); ++ for (Objective objective : LBL) { ++ level.getScoreboard().getOrCreatePlayerScore(player, objective).increment(); ++ } ++ } ++ } ++ } ++ } ++ ++ public static void onScoreboardAdd(@NotNull Objective objective) { ++ if (LeavesConfig.bedrockBreakList) { ++ if (objective.getCriteria() == ObjectiveCriteria.DUMMY) { ++ String name = objective.getName(); ++ ++ int i = name.length() - 4; ++ if (i >= 0) { ++ String suffix = name.substring(i); ++ switch (suffix) { ++ case ".bbl" -> BBL.add(objective); ++ case ".mbb" -> MBB.add(objective); ++ case ".lbl" -> LBL.add(objective); ++ } ++ } ++ } ++ } ++ } ++ ++ public static void onScoreboardRemove(@NotNull Objective objective) { ++ if (LeavesConfig.bedrockBreakList) { ++ if (objective.getCriteria() == ObjectiveCriteria.DUMMY) { ++ String name = objective.getName(); ++ ++ int i = name.length() - 4; ++ if (i >= 0) { ++ String suffix = name.substring(i); ++ switch (suffix) { ++ case ".bbl" -> BBL.remove(objective); ++ case ".mbb" -> MBB.remove(objective); ++ case ".lbl" -> LBL.remove(objective); ++ } ++ } ++ } ++ } ++ } ++}