9
0
mirror of https://github.com/LeavesMC/Leaves.git synced 2025-12-19 14:59:32 +00:00

Bedrock break list

This commit is contained in:
violetc
2023-03-22 17:25:42 +08:00
parent 3b89a2e795
commit 22f47b28d7

View File

@@ -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<TickTa
top.leavesmc.leaves.protocol.BBORProtocol.tick(); // Leaves - bbor
top.leavesmc.leaves.protocol.AppleSkinProtocol.tick(); // Leaves - appleskin
+ top.leavesmc.leaves.util.BreakBedrockList.endTick(); // Leaves - break bedrock list
MinecraftTimings.tickablesTimer.startTiming(); // Spigot // Paper
for (int i = 0; i < this.tickables.size(); ++i) {
diff --git a/src/main/java/net/minecraft/server/ServerScoreboard.java b/src/main/java/net/minecraft/server/ServerScoreboard.java
index 3a4a0727ad44322e3ba85512cd077808dab080b7..4a1a5f5c4672262875caa17bc7da8aa221b82742 100644
--- a/src/main/java/net/minecraft/server/ServerScoreboard.java
+++ b/src/main/java/net/minecraft/server/ServerScoreboard.java
@@ -132,6 +132,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();
}
@@ -148,6 +149,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 f456ad8a74464414f69b616a48ee9a2c1cee4d90..ab39df0ea273a5c9a67b34caa68e926230a7f7a1 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);
}
@@ -276,13 +281,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/LeavesConfig.java b/src/main/java/top/leavesmc/leaves/LeavesConfig.java
index 7619428fbc95484f6251b34dd4bd1ab82cf2e341..d616c090eb398d498c9f36940df5ef38ab0b7f3d 100644
--- a/src/main/java/top/leavesmc/leaves/LeavesConfig.java
+++ b/src/main/java/top/leavesmc/leaves/LeavesConfig.java
@@ -529,6 +529,15 @@ public final class LeavesConfig {
updateSuppressionCrashFix = getBoolean("settings.modify.fix-update-suppression-crash", updateSuppressionCrashFix);
}
+ public static boolean bedrockBreakList = false;
+ private static boolean bedrockBreakListLock = false;
+ private static void bedrockBreakList() {
+ if (!bedrockBreakListLock) {
+ bedrockBreakList = getBoolean("settings.modify.bedrock-break-list", bedrockBreakList);
+ bedrockBreakListLock = true;
+ }
+ }
+
public static final class WorldConfig {
public final String worldName;
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..d1ff9669f47674a3357580e32628f6068b2dae48
--- /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(pos, 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);
+ }
+ }
+ }
+ }
+ }
+}