9
0
mirror of https://github.com/LeavesMC/Leaves.git synced 2025-12-22 08:29:22 +00:00
Files
LeavesMC/patches/server/0058-Bedrock-break-list.patch
2023-09-28 18:12:42 +08:00

201 lines
9.6 KiB
Diff

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<TickTa
this.profiler.popPush("server gui refresh");
top.leavesmc.leaves.protocol.core.LeavesProtocolManager.handleTick(); // Leaves - protocol
+ top.leavesmc.leaves.util.BreakBedrockList.endTick(); // Leaves - break bedrock list
for (int i = 0; i < this.tickables.size(); ++i) {
((Runnable) this.tickables.get(i)).run();
diff --git a/src/main/java/net/minecraft/server/ServerScoreboard.java b/src/main/java/net/minecraft/server/ServerScoreboard.java
index 03d13c2425170a6513ea7442a4a12fc9aa6e211d..c54b8779e099b642bbbbb9f380377a167ebf25cb 100644
--- a/src/main/java/net/minecraft/server/ServerScoreboard.java
+++ b/src/main/java/net/minecraft/server/ServerScoreboard.java
@@ -135,6 +135,7 @@ public class ServerScoreboard extends Scoreboard {
@Override
public void onObjectiveAdded(Objective objective) {
super.onObjectiveAdded(objective);
+ top.leavesmc.leaves.util.BreakBedrockList.onScoreboardAdd(objective); // Leaves - break bedrock list
this.setDirty();
}
@@ -151,6 +152,7 @@ public class ServerScoreboard extends Scoreboard {
@Override
public void onObjectiveRemoved(Objective objective) {
super.onObjectiveRemoved(objective);
+ top.leavesmc.leaves.util.BreakBedrockList.onScoreboardRemove(objective); // Leaves - break bedrock list
if (this.trackedObjectives.contains(objective)) {
this.stopTrackingObjective(objective);
}
diff --git a/src/main/java/net/minecraft/world/level/block/piston/PistonBaseBlock.java b/src/main/java/net/minecraft/world/level/block/piston/PistonBaseBlock.java
index 5acf0e1fba2967e67bdb208ef73ae8fa84ffe35d..8c48d6815150ae21522c0b99c8eac08c01b2aa38 100644
--- a/src/main/java/net/minecraft/world/level/block/piston/PistonBaseBlock.java
+++ b/src/main/java/net/minecraft/world/level/block/piston/PistonBaseBlock.java
@@ -92,6 +92,11 @@ public class PistonBaseBlock extends DirectionalBlock {
@Override
public void setPlacedBy(Level world, BlockPos pos, BlockState state, LivingEntity placer, ItemStack itemStack) {
if (!world.isClientSide) {
+ // Leaves start - break bedrock list
+ if (placer instanceof Player player) {
+ top.leavesmc.leaves.util.BreakBedrockList.onPlayerPlacePiston(world, player, pos);
+ }
+ // Leaves end - break bedrock list
this.checkIfExtend(world, pos, state);
}
@@ -277,13 +282,24 @@ public class PistonBaseBlock extends DirectionalBlock {
}
}
// Paper end
- world.removeBlock(pos.relative(enumdirection), false);
+ // Leaves start - break bedrock list
+ BlockPos pos1 = pos.relative(enumdirection);
+ if (world.getBlockState(pos1).getBlock() == Blocks.BEDROCK) {
+ top.leavesmc.leaves.util.BreakBedrockList.onPistonBreakBedrock(world, pos1);
+ }
+ world.removeBlock(pos1, false);
+ // Leaves end - break bedrock list
}
}
} else {
// Paper start - fix headless pistons breaking blocks
BlockPos headPos = pos.relative(enumdirection);
if (io.papermc.paper.configuration.GlobalConfiguration.get().unsupportedSettings.allowPermanentBlockBreakExploits || world.getBlockState(headPos) == Blocks.PISTON_HEAD.defaultBlockState().setValue(FACING, enumdirection)) { // double check to make sure we're not a headless piston.
+ // Leaves start - break bedrock list
+ if (world.getBlockState(headPos).getBlock() == Blocks.BEDROCK) {
+ top.leavesmc.leaves.util.BreakBedrockList.onPistonBreakBedrock(world, headPos);
+ }
+ // Leaves end - break bedrock list
world.removeBlock(headPos, false);
} else {
((ServerLevel)world).getChunkSource().blockChanged(headPos); // ... fix client desync
diff --git a/src/main/java/top/leavesmc/leaves/util/BreakBedrockList.java b/src/main/java/top/leavesmc/leaves/util/BreakBedrockList.java
new file mode 100644
index 0000000000000000000000000000000000000000..a1194aca9f70a44472d1f2ce0cbd6a3e0463eba9
--- /dev/null
+++ b/src/main/java/top/leavesmc/leaves/util/BreakBedrockList.java
@@ -0,0 +1,114 @@
+package top.leavesmc.leaves.util;
+
+import net.minecraft.core.BlockPos;
+import net.minecraft.core.Direction;
+import net.minecraft.world.entity.player.Player;
+import net.minecraft.world.level.Level;
+import net.minecraft.world.level.block.Blocks;
+import net.minecraft.world.level.block.DirectionalBlock;
+import net.minecraft.world.scores.Objective;
+import net.minecraft.world.scores.criteria.ObjectiveCriteria;
+import org.jetbrains.annotations.NotNull;
+import top.leavesmc.leaves.LeavesConfig;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class BreakBedrockList {
+
+ private static final Map<Level, Map<BlockPos, Player>> pistonCache = new HashMap<>();
+ private static final List<Objective> BBL = new ArrayList<>();
+ private static final List<Objective> MBB = new ArrayList<>();
+ private static final List<Objective> 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<BlockPos, Player> 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);
+ }
+ }
+ }
+ }
+ }
+}