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 8c0b428ef004d87be0748584ae6a0557d43bc946..fccb76a8dfa6a0c5d704a0a8f7392beedea320c9 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -1573,6 +1573,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(bedrockPos, 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); + } + } + } + } + } +}