diff --git a/patches/api/0002-Set-BlockData-without-light-update.patch b/patches/api/0002-Set-BlockData-without-light-update.patch deleted file mode 100644 index 02bbae461..000000000 --- a/patches/api/0002-Set-BlockData-without-light-update.patch +++ /dev/null @@ -1,39 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Tom -Date: Mon, 28 Feb 2022 08:40:41 -0600 -Subject: [PATCH] Set BlockData without light update - - -diff --git a/src/main/java/org/bukkit/block/Block.java b/src/main/java/org/bukkit/block/Block.java -index 3e980c630452c8ea72227bc4cd92c605253cd41b..fe23d144175b3bd55564a4a266b98cd2fc70a08a 100644 ---- a/src/main/java/org/bukkit/block/Block.java -+++ b/src/main/java/org/bukkit/block/Block.java -@@ -297,6 +297,28 @@ public interface Block extends Metadatable, net.kyori.adventure.translation.Tran - */ - void setBlockData(@NotNull BlockData data, boolean applyPhysics); - -+ /** -+ * Sets the complete data for this block -+ * -+ *
-+ * Note that applyPhysics = false is not in general safe. It should only be -+ * used when you need to avoid triggering a physics update of neighboring -+ * blocks, for example when creating a {@link Bisected} block. If you are -+ * using a custom populator, then this parameter may also be required to -+ * prevent triggering infinite chunk loads on border blocks. This method -+ * should NOT be used to "hack" physics by placing blocks in impossible -+ * locations. Such blocks are liable to be removed on various events such as -+ * world upgrades. Furthermore setting large amounts of such blocks in close -+ * proximity may overload the server physics engine if an update is -+ * triggered at a later point. If this occurs, the resulting behavior is -+ * undefined. -+ * -+ * @param data new block specific data -+ * @param applyPhysics false to cancel physics from the changed block -+ * @param checkLight false to prevent a light-check update -+ */ -+ void setBlockData(@NotNull BlockData data, boolean applyPhysics, boolean checkLight); -+ - /** - * Sets the type of this block - * diff --git a/patches/api/0004-Add-Player-to-SpongeAbsorbEvent.patch b/patches/api/0004-Add-Player-to-SpongeAbsorbEvent.patch deleted file mode 100644 index 9731072c9..000000000 --- a/patches/api/0004-Add-Player-to-SpongeAbsorbEvent.patch +++ /dev/null @@ -1,52 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Cryptite -Date: Mon, 28 Feb 2022 08:55:29 -0600 -Subject: [PATCH] Add Player to SpongeAbsorbEvent - - -diff --git a/src/main/java/org/bukkit/event/block/SpongeAbsorbEvent.java b/src/main/java/org/bukkit/event/block/SpongeAbsorbEvent.java -index 7029cfcd00ed5d9c7f06898ec2b81238ec775a70..0e2f21e0f1983d2e8b67deebf4d12d25107d1582 100644 ---- a/src/main/java/org/bukkit/event/block/SpongeAbsorbEvent.java -+++ b/src/main/java/org/bukkit/event/block/SpongeAbsorbEvent.java -@@ -7,6 +7,7 @@ import org.bukkit.block.BlockState; - import org.bukkit.event.Cancellable; - import org.bukkit.event.HandlerList; - import org.jetbrains.annotations.NotNull; -+import org.jetbrains.annotations.Nullable; // Paper - - /** - * Called when a sponge absorbs water from the world. -@@ -21,11 +22,13 @@ public class SpongeAbsorbEvent extends BlockEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - private boolean cancelled; -+ private final org.bukkit.entity.Player player; // Paper - private final List blocks; - -- public SpongeAbsorbEvent(@NotNull Block block, @NotNull List waterblocks) { -+ public SpongeAbsorbEvent(@NotNull Block block, @Nullable org.bukkit.entity.Player player, @NotNull List waterblocks) { // Paper - super(block); - this.blocks = waterblocks; -+ this.player = player; // Paper - } - - /** -@@ -41,6 +44,18 @@ public class SpongeAbsorbEvent extends BlockEvent implements Cancellable { - return blocks; - } - -+ // Paper start -+ /** -+ * Gets the Player that placed the Sponge Block -+ * -+ * @return The Player that placed the sponge block causing the absorb event, or null if no Player was involved -+ */ -+ @Nullable -+ public org.bukkit.entity.Player getPlayer() { -+ return player; -+ } -+ // Paper end -+ - @Override - public boolean isCancelled() { - return cancelled; diff --git a/patches/api/0005-Add-provided-Material-to-getDrops.patch b/patches/api/0005-Add-provided-Material-to-getDrops.patch deleted file mode 100644 index 7e0be4f6b..000000000 --- a/patches/api/0005-Add-provided-Material-to-getDrops.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Cryptite -Date: Mon, 28 Feb 2022 08:56:16 -0600 -Subject: [PATCH] Add provided Material to getDrops - - -diff --git a/src/main/java/org/bukkit/block/Block.java b/src/main/java/org/bukkit/block/Block.java -index 3fc35a559ea53f045f2f72b272bc8ba34d1b2994..7fbd9c223bf34feb35f7836b42a3bd220c4cbbc5 100644 ---- a/src/main/java/org/bukkit/block/Block.java -+++ b/src/main/java/org/bukkit/block/Block.java -@@ -624,6 +624,20 @@ public interface Block extends Metadatable, net.kyori.adventure.translation.Tran - @NotNull - Collection getDrops(@NotNull ItemStack tool, @Nullable Entity entity); - -+ // Slice start -+ /** -+ * Returns a list of items which would drop by the entity destroying this -+ * block as though it were a given Material with a specific tool -+ * -+ * @param blockType The block type to use as the source loot -+ * @param tool The tool or item in hand used for digging -+ * @param entity the entity destroying the block -+ * @return a list of dropped items for this type of block -+ */ -+ @NotNull -+ Collection getDrops(@NotNull Material blockType, @NotNull ItemStack tool, @Nullable Entity entity); -+ // Slice end -+ - /** - * Returns if the given item is a preferred choice to break this Block. - * diff --git a/patches/api/0006-World-Instance-flag.patch b/patches/api/0006-World-Instance-flag.patch deleted file mode 100644 index f1ea94d5e..000000000 --- a/patches/api/0006-World-Instance-flag.patch +++ /dev/null @@ -1,22 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Cryptite -Date: Mon, 28 Feb 2022 09:17:28 -0600 -Subject: [PATCH] World Instance flag - - -diff --git a/src/main/java/org/bukkit/World.java b/src/main/java/org/bukkit/World.java -index 340f3e569a411e7603fba8d38b79446da0ab4a93..dbb8718e7e62135dc05315be3db01d1a037c1f78 100644 ---- a/src/main/java/org/bukkit/World.java -+++ b/src/main/java/org/bukkit/World.java -@@ -2600,6 +2600,11 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient - */ - public void setAutoSave(boolean value); - -+ // Slice start -+ public boolean isInstance(); -+ public void setInstance(boolean value); -+ // Slice end -+ - /** - * Sets the Difficulty of the world. - * diff --git a/patches/api/0008-Add-player-data-saving-events.patch b/patches/api/0008-Add-player-data-saving-events.patch deleted file mode 100644 index 58341af0e..000000000 --- a/patches/api/0008-Add-player-data-saving-events.patch +++ /dev/null @@ -1,133 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Tom -Date: Mon, 28 Feb 2022 09:36:31 -0600 -Subject: [PATCH] Add player data saving events - - -diff --git a/src/main/java/com/destroystokyo/paper/event/player/PlayerLoadDataEvent.java b/src/main/java/com/destroystokyo/paper/event/player/PlayerLoadDataEvent.java -new file mode 100644 -index 0000000000000000000000000000000000000000..ae0132d9c7ae17b478d1d504961e1fd6b479f6d0 ---- /dev/null -+++ b/src/main/java/com/destroystokyo/paper/event/player/PlayerLoadDataEvent.java -@@ -0,0 +1,63 @@ -+package com.destroystokyo.paper.event.player; -+ -+import com.google.gson.JsonObject; -+import org.bukkit.event.Event; -+import org.bukkit.event.HandlerList; -+import org.jetbrains.annotations.NotNull; -+import org.jetbrains.annotations.Nullable; -+ -+import java.util.UUID; -+ -+/** -+ * Calls an event in which playerdata can be provided. If null, will load from disk, otherwise will use provided data -+ */ -+public class PlayerLoadDataEvent extends Event { -+ private static final HandlerList handlers = new HandlerList(); -+ private final UUID playerId; -+ private Object playerData; -+ private JsonObject statistics; -+ -+ public PlayerLoadDataEvent(@NotNull UUID playerId) { -+ super(); -+ this.playerId = playerId; -+ } -+ -+ /** -+ * Gets the player's unique ID. -+ * -+ * @return The unique ID -+ */ -+ @NotNull -+ public UUID getUniqueId() { -+ return playerId; -+ } -+ -+ @Nullable -+ public Object getPlayerData() { -+ return playerData; -+ } -+ -+ public void setPlayerData(@NotNull Object playerData) { -+ this.playerData = playerData; -+ } -+ -+ @Nullable -+ public JsonObject getStatistics() { -+ return statistics; -+ } -+ -+ public void setStatistics(@NotNull JsonObject statistics) { -+ this.statistics = statistics; -+ } -+ -+ @NotNull -+ @Override -+ public HandlerList getHandlers() { -+ return handlers; -+ } -+ -+ @NotNull -+ public static HandlerList getHandlerList() { -+ return handlers; -+ } -+} -diff --git a/src/main/java/com/destroystokyo/paper/event/player/PlayerSaveDataEvent.java b/src/main/java/com/destroystokyo/paper/event/player/PlayerSaveDataEvent.java -new file mode 100644 -index 0000000000000000000000000000000000000000..c706201394d89f4a6f795ebbbac3d1041f395104 ---- /dev/null -+++ b/src/main/java/com/destroystokyo/paper/event/player/PlayerSaveDataEvent.java -@@ -0,0 +1,52 @@ -+package com.destroystokyo.paper.event.player; -+ -+import org.bukkit.entity.Player; -+import org.bukkit.event.Cancellable; -+import org.bukkit.event.Event; -+import org.bukkit.event.HandlerList; -+import org.jetbrains.annotations.NotNull; -+ -+/** -+ * Calls whenever playerdata is attempted to be saved. This is fired even if SpigotConfig.disablePlayerDataSaving is true -+ */ -+public class PlayerSaveDataEvent extends Event implements Cancellable { -+ private static final HandlerList handlers = new HandlerList(); -+ private final Player player; -+ private boolean cancel; -+ -+ public PlayerSaveDataEvent(@NotNull Player player) { -+ super(); -+ this.player = player; -+ } -+ -+ /** -+ * Gets the player -+ * -+ * @return The player -+ */ -+ @NotNull -+ public Player getPlayer() { -+ return player; -+ } -+ -+ @NotNull -+ @Override -+ public HandlerList getHandlers() { -+ return handlers; -+ } -+ -+ @NotNull -+ public static HandlerList getHandlerList() { -+ return handlers; -+ } -+ -+ @Override -+ public boolean isCancelled() { -+ return cancel; -+ } -+ -+ @Override -+ public void setCancelled(boolean cancel) { -+ this.cancel = cancel; -+ } -+} diff --git a/patches/api/0007-Add-PlayerTrackEntityEvent.patch b/patches/api/0009-Add-PlayerEntityTrackEvent.patch similarity index 94% rename from patches/api/0007-Add-PlayerTrackEntityEvent.patch rename to patches/api/0009-Add-PlayerEntityTrackEvent.patch index d64f6a4cb..b315dceef 100644 --- a/patches/api/0007-Add-PlayerTrackEntityEvent.patch +++ b/patches/api/0009-Add-PlayerEntityTrackEvent.patch @@ -1,7 +1,7 @@ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Cryptite -Date: Mon, 28 Feb 2022 09:33:54 -0600 -Subject: [PATCH] Add PlayerTrackEntityEvent +Date: Sat, 13 Aug 2022 08:33:02 -0500 +Subject: [PATCH] Add PlayerEntityTrackEvent diff --git a/src/main/java/org/bukkit/event/player/PlayerTrackEntityEvent.java b/src/main/java/org/bukkit/event/player/PlayerTrackEntityEvent.java diff --git a/patches/api/0009-Add-PlayerGetRespawnLocationEvent.patch b/patches/api/0009-Add-PlayerGetRespawnLocationEvent.patch deleted file mode 100644 index 259eee493..000000000 --- a/patches/api/0009-Add-PlayerGetRespawnLocationEvent.patch +++ /dev/null @@ -1,65 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Cryptite -Date: Sun, 3 Apr 2022 08:28:24 -0500 -Subject: [PATCH] Add PlayerGetRespawnLocationEvent - - -diff --git a/src/main/java/org/bukkit/event/player/PlayerGetRespawnLocationEvent.java b/src/main/java/org/bukkit/event/player/PlayerGetRespawnLocationEvent.java -new file mode 100644 -index 0000000000000000000000000000000000000000..dd7ecdb59e1a7e89ea63767a688337bb22f9cf59 ---- /dev/null -+++ b/src/main/java/org/bukkit/event/player/PlayerGetRespawnLocationEvent.java -@@ -0,0 +1,53 @@ -+package org.bukkit.event.player; -+ -+import org.apache.commons.lang.Validate; -+import org.bukkit.Location; -+import org.bukkit.entity.Player; -+import org.bukkit.event.HandlerList; -+import org.jetbrains.annotations.NotNull; -+import org.jetbrains.annotations.Nullable; -+ -+/** -+ * Called when a respawn event tries to determine the location of a respawn -+ */ -+public class PlayerGetRespawnLocationEvent extends PlayerEvent { -+ private static final HandlerList handlers = new HandlerList(); -+ private Location respawnLocation; -+ -+ public PlayerGetRespawnLocationEvent(@NotNull final Player respawnPlayer) { -+ super(respawnPlayer); -+ } -+ -+ /** -+ * Gets the current respawn location -+ * -+ * @return Location current respawn location -+ */ -+ @Nullable -+ public Location getRespawnLocation() { -+ return this.respawnLocation; -+ } -+ -+ /** -+ * Sets the new respawn location -+ * -+ * @param respawnLocation new location for the respawn -+ */ -+ public void setRespawnLocation(@NotNull Location respawnLocation) { -+ Validate.notNull(respawnLocation, "Respawn location can not be null"); -+ Validate.notNull(respawnLocation.getWorld(), "Respawn world can not be null"); -+ -+ this.respawnLocation = respawnLocation; -+ } -+ -+ @NotNull -+ @Override -+ public HandlerList getHandlers() { -+ return handlers; -+ } -+ -+ @NotNull -+ public static HandlerList getHandlerList() { -+ return handlers; -+ } -+} diff --git a/patches/api/0010-Set-multiple-Team-settings-with-a-single-packet.patch b/patches/api/0010-Set-multiple-Team-settings-at-once.patch similarity index 85% rename from patches/api/0010-Set-multiple-Team-settings-with-a-single-packet.patch rename to patches/api/0010-Set-multiple-Team-settings-at-once.patch index ce5499abe..c71774a45 100644 --- a/patches/api/0010-Set-multiple-Team-settings-with-a-single-packet.patch +++ b/patches/api/0010-Set-multiple-Team-settings-at-once.patch @@ -1,14 +1,14 @@ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Cryptite -Date: Thu, 7 Apr 2022 16:35:36 -0500 -Subject: [PATCH] Set multiple Team settings with a single packet +Date: Sat, 13 Aug 2022 08:40:03 -0500 +Subject: [PATCH] Set multiple Team settings at once diff --git a/src/main/java/org/bukkit/scoreboard/Team.java b/src/main/java/org/bukkit/scoreboard/Team.java -index 0f5c49d41c9460da0ba913b4ca8bef375f2c23df..30d2c56d71244e595afccdd47899548f6fb13886 100644 +index 06a5d3177ca7ab90c3fd9d2053b2ec5e887c7c62..31e2756c134462debfcfa768d2d0ccb988046d72 100644 --- a/src/main/java/org/bukkit/scoreboard/Team.java +++ b/src/main/java/org/bukkit/scoreboard/Team.java -@@ -534,6 +534,24 @@ public interface Team { +@@ -532,6 +532,24 @@ public interface Team { boolean hasEntity(@NotNull org.bukkit.entity.Entity entity) throws IllegalStateException, IllegalArgumentException; // Paper end diff --git a/patches/api/0011-Smooth-Teleports.patch b/patches/api/0011-Smooth-Teleports.patch new file mode 100644 index 000000000..f1505b0d9 --- /dev/null +++ b/patches/api/0011-Smooth-Teleports.patch @@ -0,0 +1,30 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Cryptite +Date: Sat, 13 Aug 2022 08:58:21 -0500 +Subject: [PATCH] Smooth Teleports + + +diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java +index b607c229cfb1e95b17b6a0073380089ef5e1b675..fedd1c0f93946f08a395413b68bf959ed4e6b3f4 100644 +--- a/src/main/java/org/bukkit/entity/Player.java ++++ b/src/main/java/org/bukkit/entity/Player.java +@@ -2727,6 +2727,19 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM + String getClientBrandName(); + // Paper end + ++ /** ++ * This abuses some of how Minecraft works and allows teleporting a player to another world without ++ * triggering typical respawn packets. All of natural state of chunk resends, entity adds/removes, etc still ++ * happen but the visual "refresh" of a world change is hidden. Depending on the destination location/world, ++ * this can act as a "smooth teleport" to a world if the new world is very similar looking to the old one. ++ * ++ * @param location New location to teleport this Player to ++ */ ++ // Slice start ++ @org.jetbrains.annotations.ApiStatus.Experimental ++ void teleportWithoutRespawn(Location location); ++ // Slice end ++ + // Paper start - Teleport API + /** + * Sets the player's rotation. diff --git a/patches/server/0001-Build-changes.patch b/patches/server/0001-Build-changes.patch deleted file mode 100644 index 1192608ff..000000000 --- a/patches/server/0001-Build-changes.patch +++ /dev/null @@ -1,82 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: MiniDigger -Date: Sat, 12 Jun 2021 16:40:34 +0200 -Subject: [PATCH] Build changes - - -diff --git a/build.gradle.kts b/build.gradle.kts -index dd8f449dddbe0838835ae8f8d5033aa422db403d..8ef71d6f8c531841bbc8979f634277f7f7d19889 100644 ---- a/build.gradle.kts -+++ b/build.gradle.kts -@@ -9,8 +9,12 @@ plugins { - } - - dependencies { -- implementation(project(":paper-api")) -- implementation(project(":paper-mojangapi")) -+ // Slice start -+ implementation(project(":slice-api")) -+ implementation("io.papermc.paper:paper-mojangapi:1.18-R0.1-SNAPSHOT") { -+ exclude("io.papermc.paper", "paper-api") -+ } -+ // Slice end - // Paper start - implementation("org.jline:jline-terminal-jansi:3.21.0") - implementation("net.minecrell:terminalconsoleappender:1.3.0") -@@ -59,7 +63,7 @@ tasks.jar { - attributes( - "Main-Class" to "org.bukkit.craftbukkit.Main", - "Implementation-Title" to "CraftBukkit", -- "Implementation-Version" to "git-Paper-$implementationVersion", -+ "Implementation-Version" to "git-Slice-$implementationVersion", // Slice - "Implementation-Vendor" to date, // Paper - "Specification-Title" to "Bukkit", - "Specification-Version" to project.version, -@@ -147,7 +151,7 @@ fun TaskContainer.registerRunTask( - name: String, - block: JavaExec.() -> Unit - ): TaskProvider = register(name) { -- group = "paper" -+ group = "paperweight" - mainClass.set("org.bukkit.craftbukkit.Main") - standardInput = System.`in` - workingDir = rootProject.layout.projectDirectory -diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index c8d56947305c981a3268ce4ae3e975db350ceff2..ce51ebeb5df07abc4a8bb31bc737ab3e4214ce83 100644 ---- a/src/main/java/net/minecraft/server/MinecraftServer.java -+++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -1693,7 +1693,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop // Spigot - Spigot > // CraftBukkit - cb > vanilla! -+ return "Slice"; // Slice - Slice > // Paper - Paper > // Spigot - Spigot > // CraftBukkit - cb > vanilla! - } - - public SystemReport fillSystemReport(SystemReport details) { -diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index 15278bb897e6169bc5d02bf47b455634baec7be1..d107cb53b2b32d755692045abfd299c732ab045d 100644 ---- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java -+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -249,7 +249,7 @@ import javax.annotation.Nullable; // Paper - import javax.annotation.Nonnull; // Paper - - public final class CraftServer implements Server { -- private final String serverName = "Paper"; // Paper -+ private final String serverName = "Slice"; // Slice // Paper - private final String serverVersion; - private final String bukkitVersion = Versioning.getBukkitVersion(); - private final Logger logger = Logger.getLogger("Minecraft"); -diff --git a/src/main/java/org/bukkit/craftbukkit/util/Versioning.java b/src/main/java/org/bukkit/craftbukkit/util/Versioning.java -index 774556a62eb240da42e84db4502e2ed43495be17..fdd8fa9ec021b4846b59e1693e32d4d02a712efe 100644 ---- a/src/main/java/org/bukkit/craftbukkit/util/Versioning.java -+++ b/src/main/java/org/bukkit/craftbukkit/util/Versioning.java -@@ -11,7 +11,7 @@ public final class Versioning { - public static String getBukkitVersion() { - String result = "Unknown-Version"; - -- InputStream stream = Bukkit.class.getClassLoader().getResourceAsStream("META-INF/maven/io.papermc.paper/paper-api/pom.properties"); -+ InputStream stream = Bukkit.class.getClassLoader().getResourceAsStream("META-INF/maven/com.lokamc.slice/slice-api/pom.properties"); // Slice - Properties properties = new Properties(); - - if (stream != null) { diff --git a/patches/server/0003-Set-BlockData-without-light-update.patch b/patches/server/0003-Set-BlockData-without-light-update.patch deleted file mode 100644 index 95a9a164f..000000000 --- a/patches/server/0003-Set-BlockData-without-light-update.patch +++ /dev/null @@ -1,177 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Tom -Date: Mon, 28 Feb 2022 08:40:41 -0600 -Subject: [PATCH] Set BlockData without light update - - -diff --git a/src/main/java/net/minecraft/server/level/WorldGenRegion.java b/src/main/java/net/minecraft/server/level/WorldGenRegion.java -index 1e656438d9ee89b97c660f3b3ec671be6546c6b7..787c14495616c2ccc6cbb41a44010f1ede1ff16d 100644 ---- a/src/main/java/net/minecraft/server/level/WorldGenRegion.java -+++ b/src/main/java/net/minecraft/server/level/WorldGenRegion.java -@@ -225,7 +225,7 @@ public class WorldGenRegion implements WorldGenLevel { - Block.dropResources(iblockdata, this.level, pos, tileentity, breakingEntity, ItemStack.EMPTY); - } - -- return this.setBlock(pos, Blocks.AIR.defaultBlockState(), 3, maxUpdateDepth); -+ return this.setBlock(pos, Blocks.AIR.defaultBlockState(), 3, maxUpdateDepth, true); - } - } - -@@ -300,7 +300,7 @@ public class WorldGenRegion implements WorldGenLevel { - } - - @Override -- public boolean setBlock(BlockPos pos, BlockState state, int flags, int maxUpdateDepth) { -+ public boolean setBlock(BlockPos pos, BlockState state, int flags, int maxUpdateDepth, boolean checkLight) { - if (!this.ensureCanWrite(pos)) { - return false; - } else { -diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index 160c0f37aa3aaf7598f852acf9bd444f79444c97..8b6ea24dc8d0286c0814c86dcf4c51cacc572854 100644 ---- a/src/main/java/net/minecraft/world/level/Level.java -+++ b/src/main/java/net/minecraft/world/level/Level.java -@@ -495,12 +495,12 @@ public abstract class Level implements LevelAccessor, AutoCloseable { - } - - @Override -- public final boolean setBlock(BlockPos pos, BlockState state, int flags) { // Paper - final for inline -- return this.setBlock(pos, state, flags, 512); -+ public final boolean setBlock(BlockPos pos, BlockState state, int flags, boolean checkLight) { // Paper - final for inline -+ return this.setBlock(pos, state, flags, 512, checkLight); - } - - @Override -- public boolean setBlock(BlockPos pos, BlockState state, int flags, int maxUpdateDepth) { -+ public boolean setBlock(BlockPos pos, BlockState state, int flags, int maxUpdateDepth, boolean checkLight) { - // CraftBukkit start - tree generation - if (this.captureTreeGeneration) { - // Paper start -@@ -547,7 +547,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { - } else { - BlockState iblockdata2 = this.getBlockState(pos); - -- if ((flags & 128) == 0 && iblockdata2 != iblockdata1 && (iblockdata2.getLightBlock(this, pos) != iblockdata1.getLightBlock(this, pos) || iblockdata2.getLightEmission() != iblockdata1.getLightEmission() || iblockdata2.useShapeForLightOcclusion() || iblockdata1.useShapeForLightOcclusion())) { -+ if (checkLight && (flags & 128) == 0 && iblockdata2 != iblockdata1 && (iblockdata2.getLightBlock(this, pos) != iblockdata1.getLightBlock(this, pos) || iblockdata2.getLightEmission() != iblockdata1.getLightEmission() || iblockdata2.useShapeForLightOcclusion() || iblockdata1.useShapeForLightOcclusion())) { - this.getProfiler().push("queueCheckLight"); - this.getChunkSource().getLightEngine().checkBlock(pos); - this.getProfiler().pop(); -@@ -694,7 +694,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { - Block.dropResources(iblockdata, this, pos, tileentity, breakingEntity, ItemStack.EMPTY); - } - -- boolean flag1 = this.setBlock(pos, fluid.createLegacyBlock(), 3, maxUpdateDepth); -+ boolean flag1 = this.setBlock(pos, fluid.createLegacyBlock(), 3, maxUpdateDepth, true); - - if (flag1) { - this.gameEvent(breakingEntity, GameEvent.BLOCK_DESTROY, pos); -diff --git a/src/main/java/net/minecraft/world/level/LevelWriter.java b/src/main/java/net/minecraft/world/level/LevelWriter.java -index 134e5ec79bf2dddd4e31930f8a7cb2c02fa29518..fd72d278a2719911a46b6bc9e7da2dc24bbe681e 100644 ---- a/src/main/java/net/minecraft/world/level/LevelWriter.java -+++ b/src/main/java/net/minecraft/world/level/LevelWriter.java -@@ -7,10 +7,14 @@ import net.minecraft.world.level.block.state.BlockState; - - public interface LevelWriter { - -- boolean setBlock(BlockPos pos, BlockState state, int flags, int maxUpdateDepth); -+ boolean setBlock(BlockPos pos, BlockState state, int flags, int maxUpdateDepth, boolean checkLight); - - default boolean setBlock(BlockPos pos, BlockState state, int flags) { -- return this.setBlock(pos, state, flags, 512); -+ return this.setBlock(pos, state, flags, 512, true); -+ } -+ -+ default boolean setBlock(BlockPos pos, BlockState state, int flags, boolean checkLight) { -+ return this.setBlock(pos, state, flags, 512, checkLight); - } - - boolean removeBlock(BlockPos pos, boolean move); -diff --git a/src/main/java/net/minecraft/world/level/block/Block.java b/src/main/java/net/minecraft/world/level/block/Block.java -index a80f4dc0a642c744223a155232291ace6e007636..fda1cb8ac3fa78375d90d6bc9f05a78f58d18193 100644 ---- a/src/main/java/net/minecraft/world/level/block/Block.java -+++ b/src/main/java/net/minecraft/world/level/block/Block.java -@@ -196,7 +196,7 @@ public class Block extends BlockBehaviour implements ItemLike { - world.destroyBlock(pos, (flags & 32) == 0, (Entity) null, maxUpdateDepth); - } - } else { -- world.setBlock(pos, newState, flags & -33, maxUpdateDepth); -+ world.setBlock(pos, newState, flags & -33, maxUpdateDepth, true); - } - } - -diff --git a/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java b/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java -index e231636403a70f28e7e4bf51542608872234ce94..47b067f820dbe1d6304e30721afd7a8fd05d2032 100644 ---- a/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java -+++ b/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java -@@ -270,7 +270,7 @@ public abstract class CraftRegionAccessor implements RegionAccessor { - BlockPos pos = new BlockPos(x, y, z); - net.minecraft.world.level.block.state.BlockState old = this.getHandle().getBlockState(pos); - -- CraftBlock.setTypeAndData(world, pos, old, ((CraftBlockData) blockData).getState(), true); -+ CraftBlock.setTypeAndData(world, pos, old, ((CraftBlockData) blockData).getState(), true, true); - } - - @Override -diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java -index a52e76c8870b1dd578c4332930c6f2fd3b31d471..1ed2dcb6f28a391689b5dd10073422bae1dcd8bb 100644 ---- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java -+++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java -@@ -187,15 +187,20 @@ public class CraftBlock implements Block { - - @Override - public void setBlockData(BlockData data, boolean applyPhysics) { -+ setBlockData(data, applyPhysics, true); -+ } -+ -+ @Override -+ public void setBlockData(BlockData data, boolean applyPhysics, boolean checkLight) { - Preconditions.checkArgument(data != null, "BlockData cannot be null"); -- this.setTypeAndData(((CraftBlockData) data).getState(), applyPhysics); -+ this.setTypeAndData(((CraftBlockData) data).getState(), applyPhysics, checkLight); - } - -- boolean setTypeAndData(final net.minecraft.world.level.block.state.BlockState blockData, final boolean applyPhysics) { -- return CraftBlock.setTypeAndData(this.world, this.position, this.getNMS(), blockData, applyPhysics); -+ boolean setTypeAndData(final net.minecraft.world.level.block.state.BlockState blockData, final boolean applyPhysics, boolean checkLight) { -+ return CraftBlock.setTypeAndData(this.world, this.position, this.getNMS(), blockData, applyPhysics, checkLight); - } - -- public static boolean setTypeAndData(LevelAccessor world, BlockPos position, net.minecraft.world.level.block.state.BlockState old, net.minecraft.world.level.block.state.BlockState blockData, boolean applyPhysics) { -+ public static boolean setTypeAndData(LevelAccessor world, BlockPos position, net.minecraft.world.level.block.state.BlockState old, net.minecraft.world.level.block.state.BlockState blockData, boolean applyPhysics, boolean checkLight) { - // SPIGOT-611: need to do this to prevent glitchiness. Easier to handle this here (like /setblock) than to fix weirdness in tile entity cleanup - if (old.hasBlockEntity() && blockData.getBlock() != old.getBlock()) { // SPIGOT-3725 remove old tile entity if block changes - // SPIGOT-4612: faster - just clear tile -@@ -209,7 +214,7 @@ public class CraftBlock implements Block { - if (applyPhysics) { - return world.setBlock(position, blockData, 3); - } else { -- boolean success = world.setBlock(position, blockData, 2 | 16 | 1024); // NOTIFY | NO_OBSERVER | NO_PLACE (custom) -+ boolean success = world.setBlock(position, blockData, 2 | 16 | 1024, checkLight); // NOTIFY | NO_OBSERVER | NO_PLACE (custom) - if (success && world instanceof net.minecraft.world.level.Level) { - world.getMinecraftWorld().sendBlockUpdated( - position, -diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java -index 966ac60daebb7bb211ab8096fc0c5f33db67320a..d68b046e30d0f3d186ed90b7c36086ccd889de1f 100644 ---- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java -+++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java -@@ -213,7 +213,7 @@ public class CraftBlockState implements BlockState { - } - - net.minecraft.world.level.block.state.BlockState newBlock = this.data; -- block.setTypeAndData(newBlock, applyPhysics); -+ block.setTypeAndData(newBlock, applyPhysics, true); - if (access instanceof net.minecraft.world.level.Level) { - this.world.getHandle().sendBlockUpdated( - position, -diff --git a/src/main/java/org/bukkit/craftbukkit/util/DummyGeneratorAccess.java b/src/main/java/org/bukkit/craftbukkit/util/DummyGeneratorAccess.java -index 34e2e14ebb007cceb8b64d3eb321646e834215d4..c0428b6e1cc9f2ca84b3ee718e28b15ce496261c 100644 ---- a/src/main/java/org/bukkit/craftbukkit/util/DummyGeneratorAccess.java -+++ b/src/main/java/org/bukkit/craftbukkit/util/DummyGeneratorAccess.java -@@ -238,7 +238,7 @@ public class DummyGeneratorAccess implements WorldGenLevel { - } - - @Override -- public boolean setBlock(BlockPos pos, BlockState state, int flags, int maxUpdateDepth) { -+ public boolean setBlock(BlockPos pos, BlockState state, int flags, int maxUpdateDepth, boolean checkLight) { - return false; - } - diff --git a/patches/server/0004-Don-t-send-equipment-updates-if-only-durability-chan.patch b/patches/server/0004-Don-t-send-equipment-updates-if-only-durability-chan.patch deleted file mode 100644 index 82ffe3078..000000000 --- a/patches/server/0004-Don-t-send-equipment-updates-if-only-durability-chan.patch +++ /dev/null @@ -1,19 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Cryptite -Date: Mon, 28 Feb 2022 08:43:22 -0600 -Subject: [PATCH] Don't send equipment updates if only durability changed - - -diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index fdd76d1a1636f30f519c434b41061d826c4a8261..39980b411528f148ed27099669d1acc6cb332c18 100644 ---- a/src/main/java/net/minecraft/world/entity/LivingEntity.java -+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -3031,7 +3031,7 @@ public abstract class LivingEntity extends Entity { - - ItemStack itemstack1 = this.getItemBySlot(enumitemslot); - -- if (!ItemStack.matches(itemstack1, itemstack)) { -+ if (!ItemStack.isSameIgnoreDurability(itemstack1, itemstack)) { - // Paper start - PlayerArmorChangeEvent - if (this instanceof ServerPlayer && enumitemslot.getType() == EquipmentSlot.Type.ARMOR) { - final org.bukkit.inventory.ItemStack oldItem = CraftItemStack.asBukkitCopy(itemstack); diff --git a/patches/server/0005-Allow-opening-covered-chests.patch b/patches/server/0005-Allow-opening-covered-chests.patch deleted file mode 100644 index 58e7a32be..000000000 --- a/patches/server/0005-Allow-opening-covered-chests.patch +++ /dev/null @@ -1,43 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Cryptite -Date: Mon, 28 Feb 2022 08:45:30 -0600 -Subject: [PATCH] Allow opening covered chests - - -diff --git a/src/main/java/net/minecraft/world/level/block/ChestBlock.java b/src/main/java/net/minecraft/world/level/block/ChestBlock.java -index db726697b00afdee6078849fd224263483349912..cc415e4dd2093aa658817589f4f286c1a3ee63ad 100644 ---- a/src/main/java/net/minecraft/world/level/block/ChestBlock.java -+++ b/src/main/java/net/minecraft/world/level/block/ChestBlock.java -@@ -356,9 +356,10 @@ public class ChestBlock extends AbstractChestBlock implements - } - - private static boolean isBlockedChestByBlock(BlockGetter world, BlockPos pos) { -- BlockPos blockposition1 = pos.above(); -- -- return world.getBlockState(blockposition1).isRedstoneConductor(world, blockposition1); -+ return false; -+// BlockPos blockposition1 = pos.above(); -+// -+// return world.getBlockState(blockposition1).isRedstoneConductor(world, blockposition1); - } - - private static boolean isCatSittingOnChest(LevelAccessor world, BlockPos pos) { -diff --git a/src/main/java/net/minecraft/world/level/block/EnderChestBlock.java b/src/main/java/net/minecraft/world/level/block/EnderChestBlock.java -index 16d677234616daec24e7250ff3e93aa3a83e9715..ee12ef106fa2dcbbac0161d96f383efbdd96bf94 100644 ---- a/src/main/java/net/minecraft/world/level/block/EnderChestBlock.java -+++ b/src/main/java/net/minecraft/world/level/block/EnderChestBlock.java -@@ -77,10 +77,10 @@ public class EnderChestBlock extends AbstractChestBlock i - PlayerEnderChestContainer playerEnderChestContainer = player.getEnderChestInventory(); - BlockEntity blockEntity = world.getBlockEntity(pos); - if (playerEnderChestContainer != null && blockEntity instanceof EnderChestBlockEntity) { -- BlockPos blockPos = pos.above(); -- if (world.getBlockState(blockPos).isRedstoneConductor(world, blockPos)) { -- return InteractionResult.sidedSuccess(world.isClientSide); -- } else if (world.isClientSide) { -+// BlockPos blockPos = pos.above(); -+// if (world.getBlockState(blockPos).isRedstoneConductor(world, blockPos)) { -+// return InteractionResult.sidedSuccess(world.isClientSide); -+ if (world.isClientSide) { - return InteractionResult.SUCCESS; - } else { - EnderChestBlockEntity enderChestBlockEntity = (EnderChestBlockEntity)blockEntity; diff --git a/patches/server/0006-Don-t-send-fire-packets-if-player-has-Fire-Resistanc.patch b/patches/server/0006-Don-t-send-fire-packets-if-player-has-Fire-Resistanc.patch deleted file mode 100644 index 960707a10..000000000 --- a/patches/server/0006-Don-t-send-fire-packets-if-player-has-Fire-Resistanc.patch +++ /dev/null @@ -1,23 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Cryptite -Date: Mon, 28 Feb 2022 08:46:13 -0600 -Subject: [PATCH] Don't send fire packets if player has Fire Resistance - - -diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 49cf3601df7b145d49b1fe9a71ba0bc60c5394b3..382d32045417174f5ef3fe556762146d07e30e17 100644 ---- a/src/main/java/net/minecraft/world/entity/Entity.java -+++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -780,7 +780,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { - - this.checkOutOfWorld(); - if (!this.level.isClientSide) { -- this.setSharedFlagOnFire(this.remainingFireTicks > 0); -+ if (this instanceof net.minecraft.world.entity.LivingEntity livingEntity) { -+ this.setSharedFlagOnFire(this.remainingFireTicks > 0 && !livingEntity.hasEffect(net.minecraft.world.effect.MobEffects.FIRE_RESISTANCE)); -+ } else { -+ this.setSharedFlagOnFire(this.remainingFireTicks > 0); -+ } - } - - this.firstTick = false; diff --git a/patches/server/0007-Track-Player-throughout-block-destroy.patch b/patches/server/0007-Track-Player-throughout-block-destroy.patch deleted file mode 100644 index 38a9e48ad..000000000 --- a/patches/server/0007-Track-Player-throughout-block-destroy.patch +++ /dev/null @@ -1,139 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Cryptite -Date: Mon, 28 Feb 2022 08:53:55 -0600 -Subject: [PATCH] Track Player throughout block destroy - - -diff --git a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java -index 415b6c2bbf11c5a2ac75d18f52b93f80b9e14fe4..a33431984b6051efd39f0077c55186da789d1d60 100644 ---- a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java -+++ b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java -@@ -451,6 +451,7 @@ public class ServerPlayerGameMode { - org.bukkit.block.BlockState state = bblock.getState(); - level.captureDrops = new ArrayList<>(); - // CraftBukkit end -+ level.pendingPlayerBlockEvents.put(pos, new Level.PendingBlockEvent(pos, this.player)); // Paper - block.playerWillDestroy(this.level, pos, iblockdata, this.player); - boolean flag = this.level.removeBlock(pos, false); - -@@ -479,6 +480,7 @@ public class ServerPlayerGameMode { - // CraftBukkit start - java.util.List itemsToDrop = level.captureDrops; // Paper - store current list - level.captureDrops = null; // Paper - Remove this earlier so that we can actually drop stuff -+ level.pendingPlayerBlockEvents.remove(pos); // Paper - if (event.isDropItems()) { - org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockDropItemEvent(bblock, state, this.player, itemsToDrop); // Paper - use stored ref - } -diff --git a/src/main/java/net/minecraft/world/item/ItemStack.java b/src/main/java/net/minecraft/world/item/ItemStack.java -index 6837c965592d4584cfc958a1008b98791a0fc780..070dab06db870f3c67dffe7637fe1a92c7eaa6a8 100644 ---- a/src/main/java/net/minecraft/world/item/ItemStack.java -+++ b/src/main/java/net/minecraft/world/item/ItemStack.java -@@ -333,6 +333,7 @@ public final class ItemStack { - } - } - Item item = this.getItem(); -+ if (entityhuman != null) world.pendingPlayerBlockEvents.put(blockposition, new Level.PendingBlockEvent(blockposition, entityhuman)); // Paper - InteractionResult enuminteractionresult = item.useOn(itemactioncontext); - CompoundTag newData = this.getTagClone(); - int newCount = this.getCount(); -diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index b2fd675cfe9301b0cfc42a8e9bba3fb8356b4789..be12155798e5ad6ae8bf47acfbfdb5b20ad45fe5 100644 ---- a/src/main/java/net/minecraft/world/level/Level.java -+++ b/src/main/java/net/minecraft/world/level/Level.java -@@ -172,6 +172,27 @@ public abstract class Level implements LevelAccessor, AutoCloseable { - public final Map explosionDensityCache = new HashMap<>(); // Paper - Optimize explosions - public java.util.ArrayDeque redstoneUpdateInfos; // Paper - Move from Map in BlockRedstoneTorch to here - -+ // Paper start - Holder class used to track what Player is responsible the last block event -+ public static class PendingBlockEvent { -+ -+ public final BlockPos block; -+ public final Player player; -+ public @Nullable BlockPos sourceBlock; -+ -+ public PendingBlockEvent(BlockPos block, Player player) { -+ this(block, player, null); -+ } -+ -+ public PendingBlockEvent(BlockPos block, Player player, @Nullable BlockPos sourceBlock) { -+ this.block = block; -+ this.player = player; -+ this.sourceBlock = sourceBlock; -+ } -+ -+ } -+ public final Map pendingPlayerBlockEvents = new HashMap<>(); -+ // Paper end -+ - // Paper start - fix and optimise world upgrading - // copied from below - public static ResourceKey getDimensionKey(DimensionType manager) { -@@ -649,6 +670,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { - if (!this.preventPoiUpdated) { - this.onBlockStateChange(blockposition, iblockdata1, iblockdata2); - } -+ pendingPlayerBlockEvents.remove(blockposition); // Paper - // CraftBukkit end - } - } -@@ -754,8 +776,20 @@ public abstract class Level implements LevelAccessor, AutoCloseable { - public void neighborChanged(BlockPos pos, Block sourceBlock, BlockPos neighborPos) { - if (!this.isClientSide) { - BlockState iblockdata = this.getBlockState(pos); -+ org.bukkit.block.Block blockAt = world.getBlockAt(pos.getX(), pos.getY(), pos.getZ()); // Paper - - try { -+ // Paper start - If this is a non-air block being set to an air block, get (remove, if exists) -+ // our PendingBlockEvent -+ if (blockAt.getType() != org.bukkit.Material.AIR && iblockdata.getMaterial() == net.minecraft.world.level.material.Material.AIR) { -+ PendingBlockEvent blockEvent = pendingPlayerBlockEvents.remove(pos); -+ if (blockEvent != null) { -+ //Would fire a future BlockDestroyedByNeighborEvent here, but must have this conditional block -+ //because it's important to remove from pendingPlayerBlockEvents -+ } -+ } -+ // Paper end -+ - // CraftBukkit start - CraftWorld world = ((ServerLevel) this).getWorld(); - if (world != null && ((ServerLevel)this).hasPhysicsEvent) { // Paper -diff --git a/src/main/java/net/minecraft/world/level/block/DoublePlantBlock.java b/src/main/java/net/minecraft/world/level/block/DoublePlantBlock.java -index e12b76238cb52a1007f2102473b7f892f8521b62..301dfb74fec49b7f6f0452e4c49c8f1df43c0180 100644 ---- a/src/main/java/net/minecraft/world/level/block/DoublePlantBlock.java -+++ b/src/main/java/net/minecraft/world/level/block/DoublePlantBlock.java -@@ -104,6 +104,12 @@ public class DoublePlantBlock extends BushBlock { - BlockPos blockposition1 = pos.below(); - BlockState iblockdata1 = world.getBlockState(blockposition1); - -+ Level.PendingBlockEvent blockEvent = world.pendingPlayerBlockEvents.remove(pos); -+ if (blockEvent != null) { -+ //Would fire a future BlockDestroyedByNeighborEvent here, but must have this conditional block -+ //because it's important to remove from pendingPlayerBlockEvents -+ } -+ - if (iblockdata1.is(state.getBlock()) && iblockdata1.getValue(DoublePlantBlock.HALF) == DoubleBlockHalf.LOWER) { - BlockState iblockdata2 = iblockdata1.hasProperty(BlockStateProperties.WATERLOGGED) && (Boolean) iblockdata1.getValue(BlockStateProperties.WATERLOGGED) ? Blocks.WATER.defaultBlockState() : Blocks.AIR.defaultBlockState(); - -diff --git a/src/main/java/net/minecraft/world/level/block/state/BlockBehaviour.java b/src/main/java/net/minecraft/world/level/block/state/BlockBehaviour.java -index 7f83c9390823b42fc30d04e1d3222e2825eaad50..a099fcaabe26378157c429ad899714fd3227f9ef 100644 ---- a/src/main/java/net/minecraft/world/level/block/state/BlockBehaviour.java -+++ b/src/main/java/net/minecraft/world/level/block/state/BlockBehaviour.java -@@ -988,6 +988,18 @@ public abstract class BlockBehaviour { - - blockposition_mutableblockposition.setWithOffset(pos, enumdirection); - BlockState iblockdata = world.getBlockState(blockposition_mutableblockposition); -+ -+ // Paper start - Propagate the PendingBlockEvent from the current blockPos to the next block -+ // if it will break (!canSurvive) -+ if (this.getMaterial() == Material.AIR && !iblockdata.canSurvive(world, blockposition_mutableblockposition)) { -+ Level.PendingBlockEvent blockEvent = ((Level) world).pendingPlayerBlockEvents.get(pos); -+ if (blockEvent != null) { -+ BlockPos blockPosCopy = blockposition_mutableblockposition.immutable(); -+ ((Level) world).pendingPlayerBlockEvents.put(blockPosCopy, new Level.PendingBlockEvent(blockPosCopy, blockEvent.player, pos)); -+ } -+ } -+ // Paper end -+ - BlockState iblockdata1 = iblockdata.updateShape(enumdirection.getOpposite(), this.asState(), world, blockposition_mutableblockposition, pos); - - Block.updateOrDestroy(iblockdata, iblockdata1, world, blockposition_mutableblockposition, flags, maxUpdateDepth); diff --git a/patches/server/0008-Add-BlockDestroyedByNeighborEvent.patch b/patches/server/0008-Add-BlockDestroyedByNeighborEvent.patch deleted file mode 100644 index f38a3d355..000000000 --- a/patches/server/0008-Add-BlockDestroyedByNeighborEvent.patch +++ /dev/null @@ -1,46 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Cryptite -Date: Mon, 28 Feb 2022 08:54:52 -0600 -Subject: [PATCH] Add BlockDestroyedByNeighborEvent - - -diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index 6764f174d0685c02d5e81aa38228d02a77bf9632..0bd21a1eeb33ffb7e3299d864e8160627d6f88d9 100644 ---- a/src/main/java/net/minecraft/world/level/Level.java -+++ b/src/main/java/net/minecraft/world/level/Level.java -@@ -692,6 +692,17 @@ public abstract class Level implements LevelAccessor, AutoCloseable { - if (iblockdata.isAir()) { - return false; - } else { -+ // Paper start -+ PendingBlockEvent blockEvent = pendingPlayerBlockEvents.get(pos); -+ if (blockEvent != null && blockEvent.sourceBlock != null) { -+ io.papermc.paper.event.block.BlockDestroyedByNeighborEvent event = -+ new io.papermc.paper.event.block.BlockDestroyedByNeighborEvent(org.bukkit.craftbukkit.block.CraftBlock.at(this, pos), -+ (org.bukkit.entity.Player) blockEvent.player.getBukkitEntity(), -+ org.bukkit.craftbukkit.block.CraftBlock.at(this, blockEvent.sourceBlock)); -+ event.callEvent(); -+ } -+ // Paper end -+ - FluidState fluid = this.getFluidState(pos); - // Paper start - while the above setAir method is named same and looks very similar - // they are NOT used with same intent and the above should not fire this event. The above method is more of a BlockSetToAirEvent, -diff --git a/src/main/java/net/minecraft/world/level/block/DoublePlantBlock.java b/src/main/java/net/minecraft/world/level/block/DoublePlantBlock.java -index 301dfb74fec49b7f6f0452e4c49c8f1df43c0180..6b63bc56bfa757a17f9a6f98b31861a7f350be80 100644 ---- a/src/main/java/net/minecraft/world/level/block/DoublePlantBlock.java -+++ b/src/main/java/net/minecraft/world/level/block/DoublePlantBlock.java -@@ -106,8 +106,11 @@ public class DoublePlantBlock extends BushBlock { - - Level.PendingBlockEvent blockEvent = world.pendingPlayerBlockEvents.remove(pos); - if (blockEvent != null) { -- //Would fire a future BlockDestroyedByNeighborEvent here, but must have this conditional block -- //because it's important to remove from pendingPlayerBlockEvents -+ io.papermc.paper.event.block.BlockDestroyedByNeighborEvent event = -+ new io.papermc.paper.event.block.BlockDestroyedByNeighborEvent(org.bukkit.craftbukkit.block.CraftBlock.at(world, blockposition1), -+ (org.bukkit.entity.Player) blockEvent.player.getBukkitEntity(), -+ org.bukkit.craftbukkit.block.CraftBlock.at(world, pos)); -+ if (!event.callEvent()) return; - } - - if (iblockdata1.is(state.getBlock()) && iblockdata1.getValue(DoublePlantBlock.HALF) == DoubleBlockHalf.LOWER) { diff --git a/patches/server/0010-Add-provided-Material-to-getDrops.patch b/patches/server/0010-Add-provided-Material-to-getDrops.patch deleted file mode 100644 index d68324da7..000000000 --- a/patches/server/0010-Add-provided-Material-to-getDrops.patch +++ /dev/null @@ -1,38 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Cryptite -Date: Mon, 28 Feb 2022 08:56:16 -0600 -Subject: [PATCH] Add provided Material to getDrops - - -diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java -index 21131dd9b2858c912712d5ded9e2fff274d439d2..982e879bc0478a2faf41b28a56a48ea5fc69c5ab 100644 ---- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java -+++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java -@@ -592,7 +592,18 @@ public class CraftBlock implements Block { - - @Override - public Collection getDrops(ItemStack item, Entity entity) { -- net.minecraft.world.level.block.state.BlockState iblockdata = this.getNMS(); -+ return getDrops(null, item, entity); // Slice start -+ } -+ -+ @Override -+ public Collection getDrops(Material blockType, ItemStack item, Entity entity) { -+ net.minecraft.world.level.block.state.BlockState iblockdata; -+ if (blockType == null) { -+ iblockdata = this.getNMS(); -+ } else { -+ iblockdata = ((CraftBlockData) blockType.createBlockData()).getState(); -+ } -+ - net.minecraft.world.item.ItemStack nms = CraftItemStack.asNMSCopy(item); - - // Modelled off EntityHuman#hasBlock -@@ -603,6 +614,7 @@ public class CraftBlock implements Block { - return Collections.emptyList(); - } - } -+ // Slice end - - @Override - public boolean isPreferredTool(ItemStack item) { diff --git a/patches/server/0011-Allow-access-to-LightEngine.patch b/patches/server/0011-Allow-access-to-LightEngine.patch deleted file mode 100644 index 033081e31..000000000 --- a/patches/server/0011-Allow-access-to-LightEngine.patch +++ /dev/null @@ -1,19 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Cryptite -Date: Mon, 28 Feb 2022 08:56:44 -0600 -Subject: [PATCH] Allow access to LightEngine - - -diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java -index edc6235288f0843608dae4552e05915e4067cbf2..73548e5fa318b84e9299ccac02a326bea86a6b11 100644 ---- a/src/main/java/net/minecraft/server/level/ChunkMap.java -+++ b/src/main/java/net/minecraft/server/level/ChunkMap.java -@@ -644,7 +644,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider - return !ChunkMap.isChunkInRange(x1, z1, x2, z2, distance) ? false : (!ChunkMap.isChunkInRange(x1 + 1, z1, x2, z2, distance) ? true : (!ChunkMap.isChunkInRange(x1, z1 + 1, x2, z2, distance) ? true : (!ChunkMap.isChunkInRange(x1 - 1, z1, x2, z2, distance) ? true : !ChunkMap.isChunkInRange(x1, z1 - 1, x2, z2, distance)))); - } - -- protected ThreadedLevelLightEngine getLightEngine() { -+ public ThreadedLevelLightEngine getLightEngine() { // Slice (public) - return this.lightEngine; - } - diff --git a/patches/server/0012-Packet-obfuscation-and-reduction.patch b/patches/server/0012-Packet-obfuscation-and-reduction.patch deleted file mode 100644 index ea9e5978c..000000000 --- a/patches/server/0012-Packet-obfuscation-and-reduction.patch +++ /dev/null @@ -1,195 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Cryptite -Date: Mon, 28 Feb 2022 09:01:45 -0600 -Subject: [PATCH] Packet obfuscation and reduction - - -diff --git a/src/main/java/net/minecraft/network/protocol/game/ClientboundSetEntityDataPacket.java b/src/main/java/net/minecraft/network/protocol/game/ClientboundSetEntityDataPacket.java -index 3e17f6131bf590d7c4a16b79c1c145cb4f565bc9..e1233fa58d068448d0accef7a7f6725fcb902848 100644 ---- a/src/main/java/net/minecraft/network/protocol/game/ClientboundSetEntityDataPacket.java -+++ b/src/main/java/net/minecraft/network/protocol/game/ClientboundSetEntityDataPacket.java -@@ -22,6 +22,13 @@ public class ClientboundSetEntityDataPacket implements Packet> packedItems) { -+ this.id = id; -+ this.packedItems = packedItems; -+ } -+ // Slice end -+ - public ClientboundSetEntityDataPacket(FriendlyByteBuf buf) { - this.id = buf.readVarInt(); - this.packedItems = SynchedEntityData.unpack(buf); -diff --git a/src/main/java/net/minecraft/network/syncher/SynchedEntityData.java b/src/main/java/net/minecraft/network/syncher/SynchedEntityData.java -index 1d88edfd09a909044f6e3175af652914b4d06311..e4f8403c6544e1a00571f28954458a1412a6de58 100644 ---- a/src/main/java/net/minecraft/network/syncher/SynchedEntityData.java -+++ b/src/main/java/net/minecraft/network/syncher/SynchedEntityData.java -@@ -136,6 +136,11 @@ public class SynchedEntityData { - } - - public void set(EntityDataAccessor key, T value) { -+ //Slice start -+ set(key, value, null); -+ } -+ -+ public void set(EntityDataAccessor key, T value, @Nullable T foreignValue) { // Slice end - SynchedEntityData.DataItem datawatcher_item = this.getItem(key); - - if (ObjectUtils.notEqual(value, datawatcher_item.getValue())) { -@@ -145,6 +150,11 @@ public class SynchedEntityData { - this.isDirty = true; - } - -+ // Slice start -+ if (foreignValue != null && ObjectUtils.notEqual(foreignValue, datawatcher_item.getForeignValue())) { -+ datawatcher_item.setForeignValue(foreignValue); -+ } -+ // Slice end - } - - // CraftBukkit start - add method from above -@@ -200,6 +210,28 @@ public class SynchedEntityData { - return list; - } - -+ // Slice start -+ @Nullable -+ public List> packForeignDirty(List> unpackedData) { -+ List> list = null; -+ -+ for (DataItem dataItem : unpackedData) { -+ DataItem item = itemsById.get(dataItem.accessor.getId()); -+ if (item.isDirty(true)) { -+ item.setForeignDirty(false); -+ -+ if (list == null) { -+ list = Lists.newArrayList(); -+ } -+ -+ list.add(item.copy(true)); -+ } -+ } -+ -+ return list; -+ } -+ // Slice end -+ - @Nullable - public List> getAll() { - List> list = null; -@@ -313,11 +345,14 @@ public class SynchedEntityData { - final EntityDataAccessor accessor; - T value; - private boolean dirty; -+ @Nullable T foreignValue = null; // Slice -+ private boolean foreignDirty; // Slice - - public DataItem(EntityDataAccessor data, T value) { - this.accessor = data; - this.value = value; - this.dirty = true; -+ this.foreignDirty = true; // Slice - } - - public EntityDataAccessor getAccessor() { -@@ -343,5 +378,34 @@ public class SynchedEntityData { - public SynchedEntityData.DataItem copy() { - return new SynchedEntityData.DataItem<>(this.accessor, this.accessor.getSerializer().copy(this.value)); - } -+ -+ // Slice start -+ public void setForeignValue(T foreignValue) { -+ this.foreignValue = foreignValue; -+ this.foreignDirty = true; -+ } -+ -+ public @Nullable T getForeignValue() { -+ return foreignValue; -+ } -+ -+ public boolean isDirty(boolean foreign) { -+ if (foreign) { -+ //There must be a foreign value in order for this to be dirty, otherwise we consider this a normal -+ //value and check the normal dirty flag. -+ return foreignValue == null || this.foreignDirty; -+ } -+ -+ return this.dirty; -+ } -+ -+ public void setForeignDirty(boolean dirty) { -+ this.foreignDirty = dirty; -+ } -+ -+ public SynchedEntityData.DataItem copy(boolean foreign) { -+ return new SynchedEntityData.DataItem<>(this.accessor, this.accessor.getSerializer().copy((foreign && this.foreignValue != null ? this.foreignValue : this.value))); -+ } -+ // Slice end - } - } -diff --git a/src/main/java/net/minecraft/server/level/ServerEntity.java b/src/main/java/net/minecraft/server/level/ServerEntity.java -index f91e1a876ad4c46a7c92cead18947a941b4d9e68..13973b8803afefd491dc05e1df6e9b10174e0108 100644 ---- a/src/main/java/net/minecraft/server/level/ServerEntity.java -+++ b/src/main/java/net/minecraft/server/level/ServerEntity.java -@@ -371,7 +371,19 @@ public class ServerEntity { - SynchedEntityData datawatcher = this.entity.getEntityData(); - - if (datawatcher.isDirty()) { -- this.broadcastAndSend(new ClientboundSetEntityDataPacket(this.entity.getId(), datawatcher, false)); -+ // Slice start -+ ClientboundSetEntityDataPacket dataPacket = new ClientboundSetEntityDataPacket(this.entity.getId(), datawatcher, false); -+ if (this.entity instanceof ServerPlayer serverPlayer) { -+ serverPlayer.connection.send(dataPacket); -+ } -+ -+ //Get the packedData that the original packet has, and then determine if any of those are changed in -+ //the foreign version. If null, nothing to notify foreign trackers about. -+ List> dirtyItems = datawatcher.packForeignDirty(dataPacket.getUnpackedData()); -+ if (dirtyItems != null) { -+ this.broadcast(new ClientboundSetEntityDataPacket(this.entity.getId(), dirtyItems)); -+ } -+ // Slice end - } - - if (this.entity instanceof LivingEntity) { -diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 5b222edfda19c1446f1fe6ad67b2248f003ff0b0..be293253c6e90c1f109b5e270c527a4e2b0cff2f 100644 ---- a/src/main/java/net/minecraft/world/entity/Entity.java -+++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -2986,7 +2986,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { - this.entityData.markDirty(Entity.DATA_AIR_SUPPLY_ID); - return; - } -- this.entityData.set(Entity.DATA_AIR_SUPPLY_ID, event.getAmount()); -+ this.entityData.set(Entity.DATA_AIR_SUPPLY_ID, event.getAmount(), getMaxAirSupply()); // Slice - // CraftBukkit end - } - -diff --git a/src/main/java/net/minecraft/world/entity/player/Player.java b/src/main/java/net/minecraft/world/entity/player/Player.java -index 0156525637f8aa2e4e639bc493d8617b5af4cc32..1c598a97ed78a744907ae310f3568c447aad0949 100644 ---- a/src/main/java/net/minecraft/world/entity/player/Player.java -+++ b/src/main/java/net/minecraft/world/entity/player/Player.java -@@ -632,7 +632,7 @@ public abstract class Player extends LivingEntity { - public void increaseScore(int score) { - int j = this.getScore(); - -- this.entityData.set(Player.DATA_SCORE_ID, j + score); -+ this.entityData.set(Player.DATA_SCORE_ID, j + score, 0); // Slice - } - - public void startAutoSpinAttack(int riptideTicks) { -diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index f12efe51b14ed3637a8ba45def9c94634a6f5e8f..b3a7ec12abe8228e6394fc085059eaa3dd488a19 100644 ---- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -2190,7 +2190,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { - this.sendHealthUpdate(); - } - } -- this.getHandle().getEntityData().set(net.minecraft.world.entity.LivingEntity.DATA_HEALTH_ID, (float) this.getScaledHealth()); -+ this.getHandle().getEntityData().set(net.minecraft.world.entity.LivingEntity.DATA_HEALTH_ID, (float) this.getScaledHealth(), isDead() ? 0f : 20f); // Slice - - this.getHandle().maxHealthCache = getMaxHealth(); - } diff --git a/patches/server/0014-World-Instance-flag.patch b/patches/server/0014-World-Instance-flag.patch deleted file mode 100644 index fed261bd5..000000000 --- a/patches/server/0014-World-Instance-flag.patch +++ /dev/null @@ -1,41 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Cryptite -Date: Mon, 28 Feb 2022 09:17:28 -0600 -Subject: [PATCH] World Instance flag - - -diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index 98209532ad3e692d7e459640123f78bbd9a65889..9b3af8f2a433368d722cd442c07b2a2cfb16dc54 100644 ---- a/src/main/java/net/minecraft/server/level/ServerLevel.java -+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java -@@ -212,6 +212,7 @@ public class ServerLevel extends Level implements WorldGenLevel { - public final UUID uuid; - public boolean hasPhysicsEvent = true; // Paper - public boolean hasEntityMoveEvent = false; // Paper -+ public boolean instance; // Slice - private final alternate.current.wire.WireHandler wireHandler = new alternate.current.wire.WireHandler(this); // Paper - optimize redstone (Alternate Current) - public static Throwable getAddToWorldStackTrace(Entity entity) { - return new Throwable(entity + " Added to world at " + new java.util.Date()); -diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java -index 48825eaba9677a8b1e4fff80738e17d08e3307f8..64e2b9554d7a9911e1eff121d4f56d71e97aca68 100644 ---- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java -+++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java -@@ -1274,6 +1274,18 @@ public class CraftWorld extends CraftRegionAccessor implements World { - world.noSave = !value; - } - -+ // Slice start -+ @Override -+ public boolean isInstance() { -+ return world.instance; -+ } -+ -+ @Override -+ public void setInstance(boolean value) { -+ world.instance = value; -+ } -+ // Slice end -+ - @Override - public void setDifficulty(Difficulty difficulty) { - this.getHandle().serverLevelData.setDifficulty(net.minecraft.world.Difficulty.byId(difficulty.getValue())); diff --git a/patches/server/0015-Add-PlayerTrackEntityEvent.patch b/patches/server/0015-Add-PlayerEntityTrackEvent.patch similarity index 74% rename from patches/server/0015-Add-PlayerTrackEntityEvent.patch rename to patches/server/0015-Add-PlayerEntityTrackEvent.patch index 52ce2d3c6..c62ee25f9 100644 --- a/patches/server/0015-Add-PlayerTrackEntityEvent.patch +++ b/patches/server/0015-Add-PlayerEntityTrackEvent.patch @@ -1,14 +1,14 @@ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Cryptite -Date: Mon, 28 Feb 2022 09:33:53 -0600 -Subject: [PATCH] Add PlayerTrackEntityEvent +Date: Sat, 13 Aug 2022 08:32:55 -0500 +Subject: [PATCH] Add PlayerEntityTrackEvent diff --git a/src/main/java/net/minecraft/server/level/ServerEntity.java b/src/main/java/net/minecraft/server/level/ServerEntity.java -index e4ba278cf42c4a946ddd3e1fefd07ae3b696cdc0..a0e84c988021c99309495d27f455e9c74c8b1053 100644 +index 201574cfdd6abbbf346c2feb468409028b4ce7f0..95587048f8aa51cd0247d419d5d51f358db360b1 100644 --- a/src/main/java/net/minecraft/server/level/ServerEntity.java +++ b/src/main/java/net/minecraft/server/level/ServerEntity.java -@@ -365,6 +365,7 @@ public class ServerEntity { +@@ -354,6 +354,7 @@ public class ServerEntity { } } diff --git a/patches/server/0016-Add-player-data-saving-events.patch b/patches/server/0016-Add-player-data-saving-events.patch deleted file mode 100644 index e8ea96418..000000000 --- a/patches/server/0016-Add-player-data-saving-events.patch +++ /dev/null @@ -1,121 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Tom -Date: Mon, 28 Feb 2022 09:36:31 -0600 -Subject: [PATCH] Add player data saving events - - -diff --git a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java -index a33431984b6051efd39f0077c55186da789d1d60..6df88cd4a86a85c0f4abd8fd50f576081b822925 100644 ---- a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java -+++ b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java -@@ -627,6 +627,8 @@ public class ServerPlayerGameMode { - enuminteractionresult1 = stack.useOn(itemactioncontext, hand); - } - -+ world.pendingPlayerBlockEvents.remove(blockposition); // Paper -+ - if (enuminteractionresult1.consumesAction()) { - CriteriaTriggers.ITEM_USED_ON_BLOCK.trigger(player, blockposition, itemstack1); - } -diff --git a/src/main/java/net/minecraft/stats/ServerStatsCounter.java b/src/main/java/net/minecraft/stats/ServerStatsCounter.java -index c59f98ca3adfdd90cdc5999aeadbb0834efedc0f..6e819bd376eb9edee6bf8bd8c08a755599f1514a 100644 ---- a/src/main/java/net/minecraft/stats/ServerStatsCounter.java -+++ b/src/main/java/net/minecraft/stats/ServerStatsCounter.java -@@ -201,7 +201,12 @@ public class ServerStatsCounter extends StatsCounter { - return nbttagcompound; - } - -- protected String toJson() { -+ // Slice start - OBFHELPER -+ public String toJson() { -+ return serialize().toString(); -+ } -+ -+ public JsonObject serialize() { // Slice end - Map, JsonObject> map = Maps.newHashMap(); - ObjectIterator objectiterator = this.stats.object2IntEntrySet().iterator(); - -@@ -227,7 +232,7 @@ public class ServerStatsCounter extends StatsCounter { - - jsonobject1.add("stats", jsonobject); - jsonobject1.addProperty("DataVersion", SharedConstants.getCurrentVersion().getWorldVersion()); -- return jsonobject1.toString(); -+ return jsonobject1; // Slice - } - - private static ResourceLocation getKey(Stat stat) { -diff --git a/src/main/java/net/minecraft/world/level/storage/PlayerDataStorage.java b/src/main/java/net/minecraft/world/level/storage/PlayerDataStorage.java -index 601f8099f74e81c17600566b3c9b7a6dd39c9bcb..cde84f45b67b88ecc410cdff924170b5b5366823 100644 ---- a/src/main/java/net/minecraft/world/level/storage/PlayerDataStorage.java -+++ b/src/main/java/net/minecraft/world/level/storage/PlayerDataStorage.java -@@ -33,6 +33,7 @@ public class PlayerDataStorage { - - public void save(Player player) { - if (org.spigotmc.SpigotConfig.disablePlayerDataSaving) return; // Spigot -+ if (!new com.destroystokyo.paper.event.player.PlayerSaveDataEvent((org.bukkit.entity.Player) player.getBukkitEntity()).callEvent()) return; // Slice - try { - CompoundTag nbttagcompound = player.saveWithoutId(new CompoundTag()); - File file = File.createTempFile(player.getStringUUID() + "-", ".dat", this.playerDir); -@@ -52,32 +53,40 @@ public class PlayerDataStorage { - public CompoundTag load(Player player) { - CompoundTag nbttagcompound = null; - -- try { -- File file = new File(this.playerDir, player.getStringUUID() + ".dat"); -- // Spigot Start -- boolean usingWrongFile = false; -- if ( org.bukkit.Bukkit.getOnlineMode() && !file.exists() ) // Paper - Check online mode first -- { -- file = new File( this.playerDir, java.util.UUID.nameUUIDFromBytes( ( "OfflinePlayer:" + player.getScoreboardName() ).getBytes( "UTF-8" ) ).toString() + ".dat"); -- if ( file.exists() ) -+ // Slice start - If event supplies playerdata, use it. Otherwise just load from disk as usual -+ com.destroystokyo.paper.event.player.PlayerLoadDataEvent event = new com.destroystokyo.paper.event.player.PlayerLoadDataEvent(player.getUUID()); -+ org.bukkit.Bukkit.getPluginManager().callEvent(event); -+ -+ Object playerData = event.getPlayerData(); -+ if (playerData != null) { -+ nbttagcompound = (CompoundTag) playerData; -+ } else { -+ try { -+ File file = new File(this.playerDir, player.getStringUUID() + ".dat"); -+ // Spigot Start -+ boolean usingWrongFile = false; -+ if (org.bukkit.Bukkit.getOnlineMode() && !file.exists()) // Paper - Check online mode first - { -- usingWrongFile = true; -- org.bukkit.Bukkit.getServer().getLogger().warning( "Using offline mode UUID file for player " + player.getScoreboardName() + " as it is the only copy we can find." ); -+ file = new File(this.playerDir, java.util.UUID.nameUUIDFromBytes(("OfflinePlayer:" + player.getScoreboardName()).getBytes("UTF-8")).toString() + ".dat"); -+ if (file.exists()) { -+ usingWrongFile = true; -+ org.bukkit.Bukkit.getServer().getLogger().warning("Using offline mode UUID file for player " + player.getScoreboardName() + " as it is the only copy we can find."); -+ } - } -- } -- // Spigot End -+ // Spigot End - -- if (file.exists() && file.isFile()) { -- nbttagcompound = NbtIo.readCompressed(file); -- } -- // Spigot Start -- if ( usingWrongFile ) -- { -- file.renameTo( new File( file.getPath() + ".offline-read" ) ); -+ if (file.exists() && file.isFile()) { -+ nbttagcompound = NbtIo.readCompressed(file); -+ } -+ // Spigot Start -+ if (usingWrongFile) { -+ file.renameTo(new File(file.getPath() + ".offline-read")); -+ } -+ // Spigot End -+ } catch (Exception exception) { -+ PlayerDataStorage.LOGGER.warn("Failed to load player data for {}", player.getName().getString()); - } -- // Spigot End -- } catch (Exception exception) { -- PlayerDataStorage.LOGGER.warn("Failed to load player data for {}", player.getName().getString()); -+ // Slice end - } - - if (nbttagcompound != null) { diff --git a/patches/server/0023-Set-multiple-Team-settings-with-a-single-packet.patch b/patches/server/0016-Set-multiple-Team-settings-at-once.patch similarity index 91% rename from patches/server/0023-Set-multiple-Team-settings-with-a-single-packet.patch rename to patches/server/0016-Set-multiple-Team-settings-at-once.patch index d1d9a3b63..576ba2cd0 100644 --- a/patches/server/0023-Set-multiple-Team-settings-with-a-single-packet.patch +++ b/patches/server/0016-Set-multiple-Team-settings-at-once.patch @@ -1,11 +1,11 @@ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Cryptite -Date: Thu, 7 Apr 2022 16:35:36 -0500 -Subject: [PATCH] Set multiple Team settings with a single packet +Date: Sat, 13 Aug 2022 08:40:09 -0500 +Subject: [PATCH] Set multiple Team settings at once diff --git a/src/main/java/net/minecraft/world/scores/PlayerTeam.java b/src/main/java/net/minecraft/world/scores/PlayerTeam.java -index defff79eb28adc52851fa781d4d4a7745a884bdc..fb48bfbce1bca47d71a0ed35af1b1296529fa2bd 100644 +index 9464054912e19fc78dd965b71fce20a18564b351..1624a0f8ea211a4c43fd01612674ca501c10d7e6 100644 --- a/src/main/java/net/minecraft/world/scores/PlayerTeam.java +++ b/src/main/java/net/minecraft/world/scores/PlayerTeam.java @@ -28,6 +28,7 @@ public class PlayerTeam extends Team { @@ -17,7 +17,7 @@ index defff79eb28adc52851fa781d4d4a7745a884bdc..fb48bfbce1bca47d71a0ed35af1b1296 public PlayerTeam(Scoreboard scoreboard, String name) { this.scoreboard = scoreboard; @@ -36,6 +37,12 @@ public class PlayerTeam extends Team { - this.displayNameStyle = Style.EMPTY.withInsertion(name).withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new TextComponent(name))); + this.displayNameStyle = Style.EMPTY.withInsertion(name).withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Component.literal(name))); } + // Slice start @@ -39,7 +39,7 @@ index defff79eb28adc52851fa781d4d4a7745a884bdc..fb48bfbce1bca47d71a0ed35af1b1296 } public void setPlayerPrefix(@Nullable Component prefix) { - this.playerPrefix = prefix == null ? TextComponent.EMPTY : prefix; + this.playerPrefix = prefix == null ? CommonComponents.EMPTY : prefix; - this.scoreboard.onTeamChanged(this); + if (updateTeamChangeInstantly) this.scoreboard.onTeamChanged(this); // Slice } @@ -48,7 +48,7 @@ index defff79eb28adc52851fa781d4d4a7745a884bdc..fb48bfbce1bca47d71a0ed35af1b1296 @@ -79,7 +86,7 @@ public class PlayerTeam extends Team { public void setPlayerSuffix(@Nullable Component suffix) { - this.playerSuffix = suffix == null ? TextComponent.EMPTY : suffix; + this.playerSuffix = suffix == null ? CommonComponents.EMPTY : suffix; - this.scoreboard.onTeamChanged(this); + if (updateTeamChangeInstantly) this.scoreboard.onTeamChanged(this); // Slice } @@ -106,10 +106,10 @@ index defff79eb28adc52851fa781d4d4a7745a884bdc..fb48bfbce1bca47d71a0ed35af1b1296 @Override diff --git a/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftTeam.java b/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftTeam.java -index d3d9641862f4746469bca946ef6d89a88f15698b..986d0dd921361a0dd8ca5ae6025521d086ec2143 100644 +index 67efb0d38ae369ff5254f7b1ec85d32d4eee8291..e4110e3a60242b958c9983a090b28aae540b2bdf 100644 --- a/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftTeam.java +++ b/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftTeam.java -@@ -346,6 +346,37 @@ final class CraftTeam extends CraftScoreboardComponent implements Team { +@@ -347,6 +347,37 @@ final class CraftTeam extends CraftScoreboardComponent implements Team { } } diff --git a/patches/server/0017-Disable-geode-generation.patch b/patches/server/0017-Disable-geode-generation.patch deleted file mode 100644 index 9961b7b05..000000000 --- a/patches/server/0017-Disable-geode-generation.patch +++ /dev/null @@ -1,21 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Cryptite -Date: Mon, 28 Feb 2022 11:21:07 -0600 -Subject: [PATCH] Disable geode generation - - -diff --git a/src/main/java/net/minecraft/data/worldgen/biome/OverworldBiomes.java b/src/main/java/net/minecraft/data/worldgen/biome/OverworldBiomes.java -index 7cf6d6a055f40fd9e05aadc680ce6f703b808653..317bf4d6557426dc3bc1485db6969d74544d73eb 100644 ---- a/src/main/java/net/minecraft/data/worldgen/biome/OverworldBiomes.java -+++ b/src/main/java/net/minecraft/data/worldgen/biome/OverworldBiomes.java -@@ -41,8 +41,8 @@ public class OverworldBiomes { - - private static void globalOverworldGeneration(BiomeGenerationSettings.Builder generationSettings) { - BiomeDefaultFeatures.addDefaultCarversAndLakes(generationSettings); -- BiomeDefaultFeatures.addDefaultCrystalFormations(generationSettings); -- BiomeDefaultFeatures.addDefaultMonsterRoom(generationSettings); -+// BiomeDefaultFeatures.addDefaultCrystalFormations(generationSettings); // Slice - Don't generate Geodes in our chunk generation -+// BiomeDefaultFeatures.addDefaultMonsterRoom(generationSettings); - BiomeDefaultFeatures.addDefaultUndergroundVariety(generationSettings); - BiomeDefaultFeatures.addDefaultSprings(generationSettings); - BiomeDefaultFeatures.addSurfaceFreezing(generationSettings); diff --git a/patches/server/0013-Smooth-world-teleports.patch b/patches/server/0017-Smooth-Teleports.patch similarity index 57% rename from patches/server/0013-Smooth-world-teleports.patch rename to patches/server/0017-Smooth-Teleports.patch index a0d2bb086..879392efe 100644 --- a/patches/server/0013-Smooth-world-teleports.patch +++ b/patches/server/0017-Smooth-Teleports.patch @@ -1,31 +1,31 @@ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Cryptite -Date: Mon, 28 Feb 2022 09:11:14 -0600 -Subject: [PATCH] Smooth world teleports +Date: Sat, 13 Aug 2022 08:58:14 -0500 +Subject: [PATCH] Smooth Teleports diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index 2f5e40437d1865a874c352999edd084226d4e47b..6e796cae90112c3b087aa12cf7d7899d1d9bcbc9 100644 +index 3615576c24d5d6790a6894a91180de25fa0e5a9c..b438cdedd1927749f1fb0776404f4646c498090c 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java -@@ -257,6 +257,7 @@ public class ServerPlayer extends Player { +@@ -266,6 +266,7 @@ public class ServerPlayer extends Player { public double lastEntitySpawnRadiusSquared; // Paper - optimise isOutsideRange, this field is in blocks public final com.destroystokyo.paper.util.misc.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet cachedSingleHashSet; // Paper public org.bukkit.event.player.PlayerQuitEvent.QuitReason quitReason = null; // Paper - there are a lot of changes to do if we change all methods leading to the event + public boolean smoothWorldTeleport; // Slice - public ServerPlayer(MinecraftServer server, ServerLevel world, GameProfile profile) { - super(world, world.getSharedSpawnPos(), world.getSharedSpawnAngle(), profile); + public ServerPlayer(MinecraftServer server, ServerLevel world, GameProfile profile, @Nullable ProfilePublicKey publicKey) { + super(world, world.getSharedSpawnPos(), world.getSharedSpawnAngle(), profile, publicKey); diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java -index 95fe4240f3e1174ec36598f24d63f0073c13b376..d0ec7a195c3efd2dfdbec1396ebc7794358e74c5 100644 +index 3d3a8e1b535cab761aa696ec6bc350e0e83b1589..ae92661b1530b97dcf4960db5a893670ed9bb51a 100644 --- a/src/main/java/net/minecraft/server/players/PlayerList.java +++ b/src/main/java/net/minecraft/server/players/PlayerList.java -@@ -948,12 +948,12 @@ public abstract class PlayerList { +@@ -960,12 +960,12 @@ public abstract class PlayerList { } // CraftBukkit start LevelData worlddata = worldserver1.getLevelData(); -- entityplayer1.connection.send(new ClientboundRespawnPacket(worldserver1.dimensionTypeRegistration(), worldserver1.dimension(), BiomeManager.obfuscateSeed(worldserver1.getSeed()), entityplayer1.gameMode.getGameModeForPlayer(), entityplayer1.gameMode.getPreviousGameModeForPlayer(), worldserver1.isDebug(), worldserver1.isFlat(), flag)); -+ if (!entityplayer.smoothWorldTeleport) entityplayer1.connection.send(new ClientboundRespawnPacket(worldserver1.dimensionTypeRegistration(), worldserver1.dimension(), BiomeManager.obfuscateSeed(worldserver1.getSeed()), entityplayer1.gameMode.getGameModeForPlayer(), entityplayer1.gameMode.getPreviousGameModeForPlayer(), worldserver1.isDebug(), worldserver1.isFlat(), flag)); +- entityplayer1.connection.send(new ClientboundRespawnPacket(worldserver1.dimensionTypeId(), worldserver1.dimension(), BiomeManager.obfuscateSeed(worldserver1.getSeed()), entityplayer1.gameMode.getGameModeForPlayer(), entityplayer1.gameMode.getPreviousGameModeForPlayer(), worldserver1.isDebug(), worldserver1.isFlat(), flag, entityplayer1.getLastDeathLocation())); ++ if (!entityplayer.smoothWorldTeleport) entityplayer1.connection.send(new ClientboundRespawnPacket(worldserver1.dimensionTypeId(), worldserver1.dimension(), BiomeManager.obfuscateSeed(worldserver1.getSeed()), entityplayer1.gameMode.getGameModeForPlayer(), entityplayer1.gameMode.getPreviousGameModeForPlayer(), worldserver1.isDebug(), worldserver1.isFlat(), flag, entityplayer1.getLastDeathLocation())); entityplayer1.connection.send(new ClientboundSetChunkCacheRadiusPacket(worldserver1.getChunkSource().chunkMap.playerChunkManager.getTargetSendDistance())); // Spigot // Paper - replace old player chunk management entityplayer1.connection.send(new ClientboundSetSimulationDistancePacket(worldserver1.getChunkSource().chunkMap.playerChunkManager.getTargetTickViewDistance())); // Spigot // Paper - replace old player chunk management entityplayer1.spawnIn(worldserver1); @@ -35,3 +35,23 @@ index 95fe4240f3e1174ec36598f24d63f0073c13b376..d0ec7a195c3efd2dfdbec1396ebc7794 entityplayer1.setShiftKeyDown(false); // entityplayer1.connection.teleport(entityplayer1.getX(), entityplayer1.getY(), entityplayer1.getZ(), entityplayer1.getYRot(), entityplayer1.getXRot()); +diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +index 6fca2d4de4b74bb24e29b5963a3f500e62760ad1..081a5ac8f3e16233e98b830594b28a1c7760b8c1 100644 +--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java ++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +@@ -1172,6 +1172,15 @@ public class CraftPlayer extends CraftHumanEntity implements Player { + } + // Paper end + ++ // Slice start ++ public void teleportWithoutRespawn(Location location) { ++ ServerPlayer serverPlayer = getHandle(); ++ serverPlayer.smoothWorldTeleport = true; ++ teleport(location); ++ serverPlayer.smoothWorldTeleport = false; ++ } ++ // Slice end ++ + @Override + public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { + // Paper start - Teleport API diff --git a/patches/server/0018-Make-getBiomeCategory-public.patch b/patches/server/0018-Make-getBiomeCategory-public.patch deleted file mode 100644 index 1533a5f53..000000000 --- a/patches/server/0018-Make-getBiomeCategory-public.patch +++ /dev/null @@ -1,19 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Cryptite -Date: Fri, 4 Mar 2022 09:16:03 -0600 -Subject: [PATCH] Make getBiomeCategory public - - -diff --git a/src/main/java/net/minecraft/world/level/biome/Biome.java b/src/main/java/net/minecraft/world/level/biome/Biome.java -index 32fc9f9162aafe312ed757be2d03577b5f95841d..19c36424dae6d6683b5b547025bbeb637e92e73d 100644 ---- a/src/main/java/net/minecraft/world/level/biome/Biome.java -+++ b/src/main/java/net/minecraft/world/level/biome/Biome.java -@@ -265,7 +265,7 @@ public final class Biome { - return this.specialEffects.getBackgroundMusic(); - } - -- Biome.BiomeCategory getBiomeCategory() { -+ public Biome.BiomeCategory getBiomeCategory() { // Slice - return this.biomeCategory; - } - diff --git a/patches/server/0019-Disable-Azalea-generation.patch b/patches/server/0019-Disable-Azalea-generation.patch deleted file mode 100644 index 7e6500dc8..000000000 --- a/patches/server/0019-Disable-Azalea-generation.patch +++ /dev/null @@ -1,32 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Cryptite -Date: Tue, 15 Mar 2022 16:29:29 -0500 -Subject: [PATCH] Disable Azalea generation - - -diff --git a/src/main/java/net/minecraft/data/worldgen/BiomeDefaultFeatures.java b/src/main/java/net/minecraft/data/worldgen/BiomeDefaultFeatures.java -index 8609ad84a64c5ecbeef1746942cf7dcffdd2ef86..eae556c5c120971c93ff633c77e86ae0c7594268 100644 ---- a/src/main/java/net/minecraft/data/worldgen/BiomeDefaultFeatures.java -+++ b/src/main/java/net/minecraft/data/worldgen/BiomeDefaultFeatures.java -@@ -151,7 +151,7 @@ public class BiomeDefaultFeatures { - builder.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, CavePlacements.CAVE_VINES); - builder.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, CavePlacements.LUSH_CAVES_CLAY); - builder.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, CavePlacements.LUSH_CAVES_VEGETATION); -- builder.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, CavePlacements.ROOTED_AZALEA_TREE); -+// builder.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, CavePlacements.ROOTED_AZALEA_TREE); // Slice - builder.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, CavePlacements.SPORE_BLOSSOM); - builder.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, CavePlacements.CLASSIC_VINES); - } -diff --git a/src/main/java/net/minecraft/data/worldgen/features/CaveFeatures.java b/src/main/java/net/minecraft/data/worldgen/features/CaveFeatures.java -index 34b67673fe1616f0c9990f62e311241bc62036e4..6e5ee21aa5e5c72d66b25c1287ce1e0c155003b2 100644 ---- a/src/main/java/net/minecraft/data/worldgen/features/CaveFeatures.java -+++ b/src/main/java/net/minecraft/data/worldgen/features/CaveFeatures.java -@@ -66,7 +66,7 @@ public class CaveFeatures { - private static final RandomizedIntStateProvider CAVE_VINES_HEAD_PROVIDER = new RandomizedIntStateProvider(new WeightedStateProvider(SimpleWeightedRandomList.builder().add(Blocks.CAVE_VINES.defaultBlockState(), 4).add(Blocks.CAVE_VINES.defaultBlockState().setValue(CaveVines.BERRIES, Boolean.valueOf(true)), 1)), CaveVinesBlock.AGE, UniformInt.of(23, 25)); - public static final Holder> CAVE_VINE = FeatureUtils.register("cave_vine", Feature.BLOCK_COLUMN, new BlockColumnConfiguration(List.of(BlockColumnConfiguration.layer(new WeightedListInt(SimpleWeightedRandomList.builder().add(UniformInt.of(0, 19), 2).add(UniformInt.of(0, 2), 3).add(UniformInt.of(0, 6), 10).build()), CAVE_VINES_BODY_PROVIDER), BlockColumnConfiguration.layer(ConstantInt.of(1), CAVE_VINES_HEAD_PROVIDER)), Direction.DOWN, BlockPredicate.ONLY_IN_AIR_PREDICATE, true)); - public static final Holder> CAVE_VINE_IN_MOSS = FeatureUtils.register("cave_vine_in_moss", Feature.BLOCK_COLUMN, new BlockColumnConfiguration(List.of(BlockColumnConfiguration.layer(new WeightedListInt(SimpleWeightedRandomList.builder().add(UniformInt.of(0, 3), 5).add(UniformInt.of(1, 7), 1).build()), CAVE_VINES_BODY_PROVIDER), BlockColumnConfiguration.layer(ConstantInt.of(1), CAVE_VINES_HEAD_PROVIDER)), Direction.DOWN, BlockPredicate.ONLY_IN_AIR_PREDICATE, true)); -- public static final Holder> MOSS_VEGETATION = FeatureUtils.register("moss_vegetation", Feature.SIMPLE_BLOCK, new SimpleBlockConfiguration(new WeightedStateProvider(SimpleWeightedRandomList.builder().add(Blocks.FLOWERING_AZALEA.defaultBlockState(), 4).add(Blocks.AZALEA.defaultBlockState(), 7).add(Blocks.MOSS_CARPET.defaultBlockState(), 25).add(Blocks.GRASS.defaultBlockState(), 50).add(Blocks.TALL_GRASS.defaultBlockState(), 10)))); -+ public static final Holder> MOSS_VEGETATION = FeatureUtils.register("moss_vegetation", Feature.SIMPLE_BLOCK, new SimpleBlockConfiguration(new WeightedStateProvider(SimpleWeightedRandomList.builder().add(Blocks.MOSS_CARPET.defaultBlockState(), 25).add(Blocks.GRASS.defaultBlockState(), 50).add(Blocks.TALL_GRASS.defaultBlockState(), 10)))); - public static final Holder> MOSS_PATCH = FeatureUtils.register("moss_patch", Feature.VEGETATION_PATCH, new VegetationPatchConfiguration(BlockTags.MOSS_REPLACEABLE, BlockStateProvider.simple(Blocks.MOSS_BLOCK), PlacementUtils.inlinePlaced(MOSS_VEGETATION), CaveSurface.FLOOR, ConstantInt.of(1), 0.0F, 5, 0.8F, UniformInt.of(4, 7), 0.3F)); - public static final Holder> MOSS_PATCH_BONEMEAL = FeatureUtils.register("moss_patch_bonemeal", Feature.VEGETATION_PATCH, new VegetationPatchConfiguration(BlockTags.MOSS_REPLACEABLE, BlockStateProvider.simple(Blocks.MOSS_BLOCK), PlacementUtils.inlinePlaced(MOSS_VEGETATION), CaveSurface.FLOOR, ConstantInt.of(1), 0.0F, 5, 0.6F, UniformInt.of(1, 2), 0.75F)); - public static final Holder> DRIPLEAF = FeatureUtils.register("dripleaf", Feature.SIMPLE_RANDOM_SELECTOR, new SimpleRandomFeatureConfiguration(HolderSet.direct(makeSmallDripleaf(), makeDripleaf(Direction.EAST), makeDripleaf(Direction.WEST), makeDripleaf(Direction.SOUTH), makeDripleaf(Direction.NORTH)))); diff --git a/patches/server/0020-Set-Mutton-nutrition-equal-to-Beef-Porkchop.patch b/patches/server/0020-Set-Mutton-nutrition-equal-to-Beef-Porkchop.patch deleted file mode 100644 index 6b14084f7..000000000 --- a/patches/server/0020-Set-Mutton-nutrition-equal-to-Beef-Porkchop.patch +++ /dev/null @@ -1,19 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Cryptite -Date: Thu, 31 Mar 2022 09:06:19 -0500 -Subject: [PATCH] Set Mutton nutrition equal to Beef/Porkchop - - -diff --git a/src/main/java/net/minecraft/world/food/Foods.java b/src/main/java/net/minecraft/world/food/Foods.java -index b16d9e2eaa589f19c563ee70b1a56d67dbcdecb0..c6ff08efc7f0c0e782f8e78e01b9d9cea5cdcaed 100644 ---- a/src/main/java/net/minecraft/world/food/Foods.java -+++ b/src/main/java/net/minecraft/world/food/Foods.java -@@ -17,7 +17,7 @@ public class Foods { - public static final FoodProperties COOKED_BEEF = (new FoodProperties.Builder()).nutrition(8).saturationMod(0.8F).meat().build(); - public static final FoodProperties COOKED_CHICKEN = (new FoodProperties.Builder()).nutrition(6).saturationMod(0.6F).meat().build(); - public static final FoodProperties COOKED_COD = (new FoodProperties.Builder()).nutrition(5).saturationMod(0.6F).build(); -- public static final FoodProperties COOKED_MUTTON = (new FoodProperties.Builder()).nutrition(6).saturationMod(0.8F).meat().build(); -+ public static final FoodProperties COOKED_MUTTON = (new FoodProperties.Builder()).nutrition(8).saturationMod(0.8F).meat().build(); - public static final FoodProperties COOKED_PORKCHOP = (new FoodProperties.Builder()).nutrition(8).saturationMod(0.8F).meat().build(); - public static final FoodProperties COOKED_RABBIT = (new FoodProperties.Builder()).nutrition(5).saturationMod(0.6F).meat().build(); - public static final FoodProperties COOKED_SALMON = (new FoodProperties.Builder()).nutrition(6).saturationMod(0.8F).build(); diff --git a/patches/server/0021-Debug-sync-chunk-loads.patch b/patches/server/0021-Debug-sync-chunk-loads.patch deleted file mode 100644 index baa28564f..000000000 --- a/patches/server/0021-Debug-sync-chunk-loads.patch +++ /dev/null @@ -1,59 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Cryptite -Date: Sat, 2 Apr 2022 17:38:32 -0500 -Subject: [PATCH] Debug sync chunk loads - - -diff --git a/src/main/java/com/destroystokyo/paper/PaperCommand.java b/src/main/java/com/destroystokyo/paper/PaperCommand.java -index d0c55497040158d959693ef2ddf3ff03bd6df05f..5925feafad214333529bace2178f233f589e1a6e 100644 ---- a/src/main/java/com/destroystokyo/paper/PaperCommand.java -+++ b/src/main/java/com/destroystokyo/paper/PaperCommand.java -@@ -70,7 +70,7 @@ import java.util.stream.Collectors; - - public class PaperCommand extends Command { - private static final String BASE_PERM = "bukkit.command.paper."; -- private static final ImmutableSet SUBCOMMANDS = ImmutableSet.builder().add("heap", "entity", "reload", "version", "debug", "chunkinfo", "fixlight", "syncloadinfo", "dumpitem", "mobcaps", "playermobcaps").build(); -+ private static final ImmutableSet SUBCOMMANDS = ImmutableSet.builder().add("heap", "entity", "reload", "version", "debug", "chunkinfo", "fixlight", "syncloadinfo", "dumpitem", "mobcaps", "playermobcaps", "debugsyncload").build(); // Slice - - public PaperCommand(String name) { - super(name); -@@ -203,6 +203,12 @@ public class PaperCommand extends Command { - case "syncloadinfo": - this.doSyncLoadInfo(sender, args); - break; -+ // Slice start -+ case "debugsyncload": -+ SyncLoadFinder.DEBUG = !SyncLoadFinder.DEBUG; -+ MinecraftServer.LOGGER.info("Debugging sync chunk loads now " + (SyncLoadFinder.DEBUG ? "ON" : "OFF")); -+ break; -+ // Slice end - case "mobcaps": - this.printMobcaps(sender, args); - break; -diff --git a/src/main/java/com/destroystokyo/paper/io/SyncLoadFinder.java b/src/main/java/com/destroystokyo/paper/io/SyncLoadFinder.java -index d3e619655382e50e9ac9323ed942502d85c9599c..a0c4db2a78895a3e76dea755c157eccabdbf04f8 100644 ---- a/src/main/java/com/destroystokyo/paper/io/SyncLoadFinder.java -+++ b/src/main/java/com/destroystokyo/paper/io/SyncLoadFinder.java -@@ -17,6 +17,8 @@ public class SyncLoadFinder { - - public static final boolean ENABLED = Boolean.getBoolean("paper.debug-sync-loads"); - -+ public static boolean DEBUG = ENABLED; // Slice -+ - private static final WeakHashMap> SYNC_LOADS = new WeakHashMap<>(); - - private static final class SyncLoadInformation { -@@ -31,6 +33,13 @@ public class SyncLoadFinder { - } - - public static void logSyncLoad(final Level world, final int chunkX, final int chunkZ) { -+ // Slice start -+ if (DEBUG) { -+ org.bukkit.Bukkit.getServer().getLogger().log(java.util.logging.Level.WARNING, "Sync chunk load at " + world.getWorld().getName() + " (" + chunkX + "," + chunkZ + ")"); -+ Thread.dumpStack(); -+ } -+ // Slice end -+ - if (!ENABLED) { - return; - } diff --git a/patches/server/0022-Add-PlayerGetRespawnLocationEvent.patch b/patches/server/0022-Add-PlayerGetRespawnLocationEvent.patch deleted file mode 100644 index bfc2720c4..000000000 --- a/patches/server/0022-Add-PlayerGetRespawnLocationEvent.patch +++ /dev/null @@ -1,102 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Cryptite -Date: Sun, 3 Apr 2022 08:28:24 -0500 -Subject: [PATCH] Add PlayerGetRespawnLocationEvent - - -diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java -index d0ec7a195c3efd2dfdbec1396ebc7794358e74c5..8cef43d4ffbdbf96380a274d80045405b5cff780 100644 ---- a/src/main/java/net/minecraft/server/players/PlayerList.java -+++ b/src/main/java/net/minecraft/server/players/PlayerList.java -@@ -876,49 +876,57 @@ public abstract class PlayerList { - - // CraftBukkit start - fire PlayerRespawnEvent - if (location == null) { -- // boolean isBedSpawn = false; // Paper - moved up -- ServerLevel worldserver1 = this.server.getLevel(entityplayer.getRespawnDimension()); -- if (worldserver1 != null) { -- Optional optional; -+ // Slice start -+ Player respawnPlayer = entityplayer1.getBukkitEntity(); -+ org.bukkit.event.player.PlayerGetRespawnLocationEvent preRespawnEvent = new org.bukkit.event.player.PlayerGetRespawnLocationEvent(respawnPlayer); -+ preRespawnEvent.callEvent(); -+ location = preRespawnEvent.getRespawnLocation(); - -- if (blockposition != null) { -- optional = net.minecraft.world.entity.player.Player.findRespawnPositionAndUseSpawnBlock(worldserver1, blockposition, f, flag1, true); // Paper - Fix SPIGOT-5989 -- } else { -- optional = Optional.empty(); -- } -+ if (location == null) { -+ // Slice end -+ // boolean isBedSpawn = false; // Paper - moved up -+ ServerLevel worldserver1 = this.server.getLevel(entityplayer.getRespawnDimension()); -+ if (worldserver1 != null) { -+ Optional optional; -+ -+ if (blockposition != null) { -+ optional = net.minecraft.world.entity.player.Player.findRespawnPositionAndUseSpawnBlock(worldserver1, blockposition, f, flag1, true); // Paper - Fix SPIGOT-5989 -+ } else { -+ optional = Optional.empty(); -+ } - -- if (optional.isPresent()) { -- BlockState iblockdata = worldserver1.getBlockState(blockposition); -- boolean flag3 = iblockdata.is(Blocks.RESPAWN_ANCHOR); -- isAnchorSpawn = flag3; // Paper - Fix anchor respawn acting as a bed respawn from the end portal -- Vec3 vec3d = (Vec3) optional.get(); -- float f1; -+ if (optional.isPresent()) { -+ BlockState iblockdata = worldserver1.getBlockState(blockposition); -+ boolean flag3 = iblockdata.is(Blocks.RESPAWN_ANCHOR); -+ isAnchorSpawn = flag3; // Paper - Fix anchor respawn acting as a bed respawn from the end portal -+ Vec3 vec3d = (Vec3) optional.get(); -+ float f1; - -- if (!iblockdata.is(BlockTags.BEDS) && !flag3) { -- f1 = f; -- } else { -- Vec3 vec3d1 = Vec3.atBottomCenterOf(blockposition).subtract(vec3d).normalize(); -+ if (!iblockdata.is(BlockTags.BEDS) && !flag3) { -+ f1 = f; -+ } else { -+ Vec3 vec3d1 = Vec3.atBottomCenterOf(blockposition).subtract(vec3d).normalize(); - -- f1 = (float) Mth.wrapDegrees(Mth.atan2(vec3d1.z, vec3d1.x) * 57.2957763671875D - 90.0D); -- } -+ f1 = (float) Mth.wrapDegrees(Mth.atan2(vec3d1.z, vec3d1.x) * 57.2957763671875D - 90.0D); -+ } - -- entityplayer1.setRespawnPosition(worldserver1.dimension(), blockposition, f, flag1, false, com.destroystokyo.paper.event.player.PlayerSetSpawnEvent.Cause.PLAYER_RESPAWN); // Paper - PlayerSetSpawnEvent -- flag2 = !flag && flag3; -- isBedSpawn = true; -- location = new Location(worldserver1.getWorld(), vec3d.x, vec3d.y, vec3d.z, f1, 0.0F); -- } else if (blockposition != null) { -- entityplayer1.connection.send(new ClientboundGameEventPacket(ClientboundGameEventPacket.NO_RESPAWN_BLOCK_AVAILABLE, 0.0F)); -- entityplayer1.setRespawnPosition(null, null, 0f, false, false, com.destroystokyo.paper.event.player.PlayerSetSpawnEvent.Cause.PLAYER_RESPAWN); // CraftBukkit - SPIGOT-5988: Clear respawn location when obstructed // Paper - PlayerSetSpawnEvent -+ entityplayer1.setRespawnPosition(worldserver1.dimension(), blockposition, f, flag1, false, com.destroystokyo.paper.event.player.PlayerSetSpawnEvent.Cause.PLAYER_RESPAWN); // Paper - PlayerSetSpawnEvent -+ flag2 = !flag && flag3; -+ isBedSpawn = true; -+ location = new Location(worldserver1.getWorld(), vec3d.x, vec3d.y, vec3d.z, f1, 0.0F); -+ } else if (blockposition != null) { -+ entityplayer1.connection.send(new ClientboundGameEventPacket(ClientboundGameEventPacket.NO_RESPAWN_BLOCK_AVAILABLE, 0.0F)); -+ entityplayer1.setRespawnPosition(null, null, 0f, false, false); // CraftBukkit - SPIGOT-5988: Clear respawn location when obstructed // Paper - PlayerSetSpawnEvent -+ } - } -- } - -- if (location == null) { -- worldserver1 = this.server.getLevel(Level.OVERWORLD); -- blockposition = entityplayer1.getSpawnPoint(worldserver1); -- location = new Location(worldserver1.getWorld(), (double) ((float) blockposition.getX() + 0.5F), (double) ((float) blockposition.getY() + 0.1F), (double) ((float) blockposition.getZ() + 0.5F), worldserver1.levelData.getSpawnAngle(), 0.0F); // Paper - use world spawn angle -+ if (location == null) { -+ worldserver1 = this.server.getLevel(Level.OVERWORLD); -+ blockposition = entityplayer1.getSpawnPoint(worldserver1); -+ location = new Location(worldserver1.getWorld(), (double) ((float) blockposition.getX() + 0.5F), (double) ((float) blockposition.getY() + 0.1F), (double) ((float) blockposition.getZ() + 0.5F), worldserver1.levelData.getSpawnAngle(), 0.0F); // Paper - use world spawn angle -+ } - } - -- Player respawnPlayer = entityplayer1.getBukkitEntity(); - PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(respawnPlayer, location, isBedSpawn && !isAnchorSpawn, isAnchorSpawn, com.google.common.collect.ImmutableSet.builder().add(respawnFlags)); // Paper - Fix anchor respawn acting as a bed respawn from the end portal - this.cserver.getPluginManager().callEvent(respawnEvent); - // Spigot Start diff --git a/patches/server/0024-Debug-chunkloading.patch b/patches/server/0024-Debug-chunkloading.patch deleted file mode 100644 index d9a1322fd..000000000 --- a/patches/server/0024-Debug-chunkloading.patch +++ /dev/null @@ -1,62 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Cryptite -Date: Fri, 15 Apr 2022 09:36:18 -0500 -Subject: [PATCH] Debug chunkloading - - -diff --git a/src/main/java/com/destroystokyo/paper/PaperCommand.java b/src/main/java/com/destroystokyo/paper/PaperCommand.java -index 5925feafad214333529bace2178f233f589e1a6e..a5db4e37aeb04f8fec2f9536bf2cd018af7ceef7 100644 ---- a/src/main/java/com/destroystokyo/paper/PaperCommand.java -+++ b/src/main/java/com/destroystokyo/paper/PaperCommand.java -@@ -70,7 +70,7 @@ import java.util.stream.Collectors; - - public class PaperCommand extends Command { - private static final String BASE_PERM = "bukkit.command.paper."; -- private static final ImmutableSet SUBCOMMANDS = ImmutableSet.builder().add("heap", "entity", "reload", "version", "debug", "chunkinfo", "fixlight", "syncloadinfo", "dumpitem", "mobcaps", "playermobcaps", "debugsyncload").build(); // Slice -+ private static final ImmutableSet SUBCOMMANDS = ImmutableSet.builder().add("heap", "entity", "reload", "version", "debug", "chunkinfo", "fixlight", "syncloadinfo", "dumpitem", "mobcaps", "playermobcaps", "debugsyncload", "debugchunks").build(); // Slice - - public PaperCommand(String name) { - super(name); -@@ -208,6 +208,10 @@ public class PaperCommand extends Command { - SyncLoadFinder.DEBUG = !SyncLoadFinder.DEBUG; - MinecraftServer.LOGGER.info("Debugging sync chunk loads now " + (SyncLoadFinder.DEBUG ? "ON" : "OFF")); - break; -+ case "debugchunks": -+ MinecraftServer.DEBUG_CHUNKS = !MinecraftServer.DEBUG_CHUNKS; -+ MinecraftServer.LOGGER.info("Debugging chunk loading/sending now " + (MinecraftServer.DEBUG_CHUNKS ? "ON" : "OFF")); -+ break; - // Slice end - case "mobcaps": - this.printMobcaps(sender, args); -diff --git a/src/main/java/io/papermc/paper/chunk/PlayerChunkLoader.java b/src/main/java/io/papermc/paper/chunk/PlayerChunkLoader.java -index 0f62a766a3249d8651a11dce6e9051b162693716..bae605ba25bb375273d506467ff5b38958e77aa5 100644 ---- a/src/main/java/io/papermc/paper/chunk/PlayerChunkLoader.java -+++ b/src/main/java/io/papermc/paper/chunk/PlayerChunkLoader.java -@@ -548,6 +548,7 @@ public final class PlayerChunkLoader { - } - final int currSends = concurrentChunkSends.get(); - if (currSends >= maxSends) { -+ if (MinecraftServer.DEBUG_CHUNKS) org.bukkit.Bukkit.getServer().getLogger().log(java.util.logging.Level.WARNING, "currSends >= maxSends (" + currSends + " >= " + maxSends + ")"); // Slice - break; - } - -@@ -675,6 +676,7 @@ public final class PlayerChunkLoader { - if (currentChunkLoads >= maxLoads || (PaperConfig.globalMaxChunkLoadRate > 0 && (TICKET_ADDITION_COUNTER_SHORT.getRate() >= PaperConfig.globalMaxChunkLoadRate || TICKET_ADDITION_COUNTER_LONG.getRate() >= PaperConfig.globalMaxChunkLoadRate)) - || (PaperConfig.playerMaxChunkLoadRate > 0.0 && (data.ticketAdditionCounterShort.getRate() >= PaperConfig.playerMaxChunkLoadRate || data.ticketAdditionCounterLong.getRate() >= PaperConfig.playerMaxChunkLoadRate))) { - // don't poll, we didn't load it -+ if (MinecraftServer.DEBUG_CHUNKS) org.bukkit.Bukkit.getServer().getLogger().log(java.util.logging.Level.WARNING, "currentChunkLoads >= maxLoads (" + currentChunkLoads + " >= " + maxLoads + ")"); // Slice - this.chunkLoadQueue.add(data); - break; - } -diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index ce51ebeb5df07abc4a8bb31bc737ab3e4214ce83..8373298d673687f57b8f1a1509b79e94ad43de8d 100644 ---- a/src/main/java/net/minecraft/server/MinecraftServer.java -+++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -308,6 +308,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop S spin(Function serverFactory) { - AtomicReference atomicreference = new AtomicReference();