From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: MC_XiaoHei Date: Wed, 8 May 2024 22:19:25 +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 0923285d7a03de762cba8929682f94a5be156ae9..b82b45f57cdd7a98f3c29cc6c80b4d8aedece681 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -1793,6 +1793,8 @@ 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()) { + Player player = map.get(bedrock); + for (Objective objective : BBL) { + level.getScoreboard().getOrCreatePlayerScore(player, objective).increment(); + } + } + } else { + if (!MBB.isEmpty()) { + ScoreHolder world = ScoreHolder.forNameOnly("$" + level.dimension().location()); + for (Objective objective : MBB) { + level.getScoreboard().getOrCreatePlayerScore(world, objective).increment(); + level.getScoreboard().getOrCreatePlayerScore(ScoreHolder.forNameOnly("$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) { + for (Objective objective : LBL) { + level.getScoreboard().getOrCreatePlayerScore(closestPlayer, 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); + } + } + } + } + } +}