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:
220
patches/server/0062-Bedrock-break-list.patch
Normal file
220
patches/server/0062-Bedrock-break-list.patch
Normal 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);
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
Reference in New Issue
Block a user