From 03dddb546d5406d72f7cbda8654f725611f3f71d Mon Sep 17 00:00:00 2001 From: Helvetica Volubi Date: Mon, 29 Jun 2026 21:38:11 +0800 Subject: [PATCH] try update to 26.2 --- gradle.properties | 10 +- lophine-api/build.gradle.kts.patch | 2 +- .../0003-Leaves-Add-fakeplayer-api.patch | 8 +- .../features/0004-Leaves-Replay-Mod-API.patch | 8 +- ...-transform-config-between-different-.patch | 25 -- .../features/0001-Server-I18n.patch | 12 +- ...2-Fix-datapack-command-save-function.patch | 12 +- ...urpur-Barrels-and-enderchests-6-rows.patch | 38 +- ...-to-disable-some-check-for-operators.patch | 12 +- ...-to-enable-cross-region-damage-trace.patch | 46 +-- ...dd-config-to-enable-save-all-command.patch | 27 +- ...dd-config-to-enable-function-command.patch | 2 +- ...-config-to-enable-scoreboard-command.patch | 2 +- ...Add-config-to-enable-trigger-command.patch | 2 +- ...-config-to-enable-raytracing-tracker.patch | 22 +- .../features/0011-Add-tick-rate-support.patch | 12 +- .../0012-Modify-merge-ItemEntity-logic.patch | 4 +- .../0013-Old-zombie-reinforcement.patch | 20 +- .../0014-Spawn-invulnerable-time.patch | 30 +- .../0015-Leaves-Item-overstack-util.patch | 129 +++---- .../0016-Leaves-Old-raid-behavior.patch | 24 +- ...x-for-Raid-Revert-and-Cross-Region-D.patch | 10 +- ...018-Leaves-Leaves-Base-Protocol-Core.patch | 14 +- ...s-Configurable-trading-with-the-void.patch | 10 +- .../0020-Leaves-Servux-Protocol.patch | 6 +- .../features/0021-LeavesHooks.patch | 2 +- ...aves-Old-Explosion-Damage-Calculator.patch | 4 +- .../0023-Leaves-Redstone-Shears-Wrench.patch | 2 +- .../0024-Leaves-Syncmatica-Protocol.patch | 6 +- .../features/0025-Leaves-BBOR-Protocol.patch | 4 +- .../0026-Leaves-Xaero-Map-Protocol.patch | 2 +- .../0027-Leaves-Support-REI-protocol.patch | 2 +- .../features/0028-Leaves-Jade-Protocol.patch | 16 +- ...Alternative-block-placement-Protocol.patch | 14 +- .../features/0030-Leaves-Fakeplayer.patch | 279 ++++++++------- .../features/0031-Leaves-Replay-Mod-API.patch | 326 ++++++++++-------- .../0032-Leaves-Creative-fly-no-clip.patch | 24 +- .../0033-Leaves-Wool-Hopper-Counter.patch | 56 +-- .../0034-Global-Entities-Counter.patch | 24 +- ...eaves-Catch-update-suppression-crash.patch | 112 +++--- .../0036-Leaves-CCE-update-suppression.patch | 4 +- ...eaves-Redstone-ignore-upwards-update.patch | 12 +- .../features/0038-Instant-Block-Updater.patch | 6 +- ...ert-TrapDoorBlock-changes-form-Paper.patch | 4 +- ...oss-of-item-drops-due-to-update-supp.patch | 30 +- ...set-placed-block-on-exception-Do-not.patch | 54 +-- ...42-Leaves-Old-Block-remove-behaviour.patch | 169 ++++----- ...iTweaks-mob-fire-and-explosion-rules.patch | 10 +- .../features/0044-Carpet-features.patch | 271 +++++++-------- .../0045-Carpet-Features-Compatible.patch | 70 ++-- .../features/0001-Rebrand-to-Lophine.patch | 2 +- ...004-Leaves-Leaves-Base-Protocol-Core.patch | 6 +- .../0006-Leaves-Leaves-Fakeplayer.patch | 34 +- .../features/0007-Leaves-Replay-Mod-API.patch | 34 +- .../bm/lophine/carpet/RedirectedConfigs.java | 162 --------- .../config/modules/GeneralCompatConfig.java | 8 +- .../carpet/config/modules/RemovedConfig.java | 2 - .../config/modules/removed/RemovedConfig.java | 3 - .../protocol/CarpetLoggerProtocol.java | 2 +- .../bm/lophine/utils/EntitiesCounterUtil.java | 2 +- .../java/org/leavesmc/leaves/bot/BotList.java | 218 ++++++++++-- .../org/leavesmc/leaves/bot/ServerBot.java | 4 +- .../leaves/protocol/BBORProtocol.java | 4 +- .../jade/util/LootTableMineableCollector.java | 2 +- .../servux/ServuxHudDataProtocol.java | 2 +- .../servux/litematics/utils/EntityUtils.java | 7 +- .../protocol/servux/logger/DataLogger.java | 2 +- .../org/leavesmc/leaves/replay/Recorder.java | 6 +- .../leaves/replay/ServerPhotographer.java | 4 +- .../leavesmc/leaves/util/HopperCounter.java | 85 +++-- .../org/leavesmc/leaves/util/WoolUtils.java | 32 +- 71 files changed, 1310 insertions(+), 1301 deletions(-) delete mode 100644 lophine-server/luminol-patches/features/0009-TEMP-Temporarily-transform-config-between-different-.patch delete mode 100644 lophine-server/src/main/java/fun/bm/lophine/carpet/RedirectedConfigs.java diff --git a/gradle.properties b/gradle.properties index 934dab7..0417dad 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,15 +1,15 @@ group=fun.bm.lophine -mcVersion=26.1.2 -apiVersion=26.1.2 +mcVersion=26.2 +apiVersion=26.2 channel=STABLE clipVersion=3.0.18 weightVersion=2.0.15 # true for release, false for skip release, pre for pre-release -release=true +release=pre # true for push to repo, false for skip push repo, auto for detect by release value -pushRepo=auto +pushRepo=false -luminolRef=d12fac3eed982361b702039413c76cb7a29bf5c0 +luminolRef=46e35e889eedc4dff3dc51dde30419f62333c55b org.gradle.configuration-cache=true org.gradle.caching=true diff --git a/lophine-api/build.gradle.kts.patch b/lophine-api/build.gradle.kts.patch index 87b4ec7..e27e7dc 100644 --- a/lophine-api/build.gradle.kts.patch +++ b/lophine-api/build.gradle.kts.patch @@ -1,6 +1,6 @@ --- a/luminol-api/build.gradle.kts +++ b/luminol-api/build.gradle.kts -@@ -104,20 +_,24 @@ +@@ -107,20 +_,24 @@ srcDir(generatedDir) srcDir(file("../paper-api/src/main/java")) srcDir(file("../folia-api/src/main/java")) diff --git a/lophine-api/paper-patches/features/0003-Leaves-Add-fakeplayer-api.patch b/lophine-api/paper-patches/features/0003-Leaves-Add-fakeplayer-api.patch index 02d3b7e..ac2f8b4 100644 --- a/lophine-api/paper-patches/features/0003-Leaves-Add-fakeplayer-api.patch +++ b/lophine-api/paper-patches/features/0003-Leaves-Add-fakeplayer-api.patch @@ -8,10 +8,10 @@ As a part of : Leaves (https://github.com/LeavesMC/Leaves) Licensed under: GPL-3.0 (https://www.gnu.org/licenses/gpl-3.0.html) diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java -index 8e96326c55510642df01ef15e1a3edb1e81176cb..592a3c59bf5edbc65c7c0472e2382593b7b22086 100644 +index 0ac1e049fad85de8365380b03e60d915ee643f16..a747fbe107dcc134558ca8ecfbe30e81245a5742 100644 --- a/src/main/java/org/bukkit/Bukkit.java +++ b/src/main/java/org/bukkit/Bukkit.java -@@ -3048,4 +3048,15 @@ public final class Bukkit { +@@ -3052,4 +3052,15 @@ public final class Bukkit { return server.getFeatureManager(); } // Leaves end - Feature API @@ -28,10 +28,10 @@ index 8e96326c55510642df01ef15e1a3edb1e81176cb..592a3c59bf5edbc65c7c0472e2382593 + // Leaves end - Bot API } diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java -index 473b0e02c003d5317ef798c320e5c845124f4e12..978e015e91408503b4ec84ec5b3c5193255ba7db 100644 +index 48e53223ba7edeca5256244480441a56a6657075..f4f64538d13f3dba5a1cd8f0d24d1fd2e8b75749 100644 --- a/src/main/java/org/bukkit/Server.java +++ b/src/main/java/org/bukkit/Server.java -@@ -2813,4 +2813,13 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi +@@ -2826,4 +2826,13 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi */ double @Nullable [] getRegionTPS(@NotNull World world, int chunkX, int chunkZ); // Folia end - region TPS API diff --git a/lophine-api/paper-patches/features/0004-Leaves-Replay-Mod-API.patch b/lophine-api/paper-patches/features/0004-Leaves-Replay-Mod-API.patch index d9a84bd..fd5ff0e 100644 --- a/lophine-api/paper-patches/features/0004-Leaves-Replay-Mod-API.patch +++ b/lophine-api/paper-patches/features/0004-Leaves-Replay-Mod-API.patch @@ -8,10 +8,10 @@ As a part of : Leaves (https://github.com/LeavesMC/Leaves) Licensed under: GPL-3.0 (https://www.gnu.org/licenses/gpl-3.0.html) diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java -index 592a3c59bf5edbc65c7c0472e2382593b7b22086..838ad878528267b57b69d2938aee0eb6326948eb 100644 +index a747fbe107dcc134558ca8ecfbe30e81245a5742..b09a90f8187a15ddaa15f231f46f51f2b1d2c1ed 100644 --- a/src/main/java/org/bukkit/Bukkit.java +++ b/src/main/java/org/bukkit/Bukkit.java -@@ -3059,4 +3059,10 @@ public final class Bukkit { +@@ -3063,4 +3063,10 @@ public final class Bukkit { return server.getBotManager(); } // Leaves end - Bot API @@ -23,10 +23,10 @@ index 592a3c59bf5edbc65c7c0472e2382593b7b22086..838ad878528267b57b69d2938aee0eb6 + // Leaves end - Photographer API } diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java -index 978e015e91408503b4ec84ec5b3c5193255ba7db..d054926f6082bba7d0b59e610e5d725ff5f9ffa4 100644 +index f4f64538d13f3dba5a1cd8f0d24d1fd2e8b75749..2f4cc1115170557389f577f995f1bfaed1ec2f71 100644 --- a/src/main/java/org/bukkit/Server.java +++ b/src/main/java/org/bukkit/Server.java -@@ -2822,4 +2822,8 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi +@@ -2835,4 +2835,8 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi */ @NotNull org.leavesmc.leaves.entity.bot.BotManager getBotManager(); // Leaves end - Bot API diff --git a/lophine-server/luminol-patches/features/0009-TEMP-Temporarily-transform-config-between-different-.patch b/lophine-server/luminol-patches/features/0009-TEMP-Temporarily-transform-config-between-different-.patch deleted file mode 100644 index ebedf29..0000000 --- a/lophine-server/luminol-patches/features/0009-TEMP-Temporarily-transform-config-between-different-.patch +++ /dev/null @@ -1,25 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Helvetica Volubi -Date: Mon, 15 Jun 2026 01:33:32 +0800 -Subject: [PATCH] TEMP: Temporarily transform config between different config - system - -Should be removed in Minecraft 26.2 Update - -diff --git a/src/main/java/me/earthme/luminol/config/ConfigManager.java b/src/main/java/me/earthme/luminol/config/ConfigManager.java -index 5a8c94337e42584ddaf25ef289327777e7ac675e..b652525f243c23e09c4e13f67617e99a3ce0db04 100644 ---- a/src/main/java/me/earthme/luminol/config/ConfigManager.java -+++ b/src/main/java/me/earthme/luminol/config/ConfigManager.java -@@ -64,6 +64,12 @@ public class ConfigManager { - CompletableFuture.allOf(futures).join(); - CommandRegister.register(); // register command after config loaded to enable some command didn't depend on config files - initialized = true; -+ -+ // Lophine start - temporarily transform configs -+ reApplyStagedConfigs(); -+ saveConfigs(); -+ configfiles.values().forEach((config) -> config.reload(true, false)); -+ // Lophine end - temporarily transform configs - } - - public static void registerRunnableBeforeFinalLoad(Runnable runnable) { diff --git a/lophine-server/minecraft-patches/features/0001-Server-I18n.patch b/lophine-server/minecraft-patches/features/0001-Server-I18n.patch index 9827637..6880f58 100644 --- a/lophine-server/minecraft-patches/features/0001-Server-I18n.patch +++ b/lophine-server/minecraft-patches/features/0001-Server-I18n.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Server I18n diff --git a/net/minecraft/locale/Language.java b/net/minecraft/locale/Language.java -index 49c7f8194be8222e329fc3215a6aa6db0b221b11..c6c968d28e0d14a4c50e66bdd5176a000944b707 100644 +index 47cd33bce908744e64356b585853d6a8ecf82443..bb4011d3c6a1d2a5aa66e68fe719cd5eea2c0dd2 100644 --- a/net/minecraft/locale/Language.java +++ b/net/minecraft/locale/Language.java @@ -37,6 +37,7 @@ public abstract class Language { @@ -24,12 +24,12 @@ index 49c7f8194be8222e329fc3215a6aa6db0b221b11..c6c968d28e0d14a4c50e66bdd5176a00 + public static void parseTranslations(final BiConsumer output, final String path) { // Lophine - private -> public try (InputStream stream = Language.class.getResourceAsStream(path)) { loadFromJson(stream, output); - } catch (JsonParseException | IOException var7) { + } catch (IOException | JsonParseException e) { diff --git a/net/minecraft/server/Main.java b/net/minecraft/server/Main.java -index 143ad4e342b184aa02b6fbbe81508e244eebc7a2..89be42b8519522398920eb424c894fd2ab8c9666 100644 +index 2a75f8fbd2e5f41ca138740319d34683915e3b5b..0cc56b19d68f34994c9dbae578609eca7b7343cb 100644 --- a/net/minecraft/server/Main.java +++ b/net/minecraft/server/Main.java -@@ -155,6 +155,8 @@ public class Main { +@@ -158,6 +158,8 @@ public class Main { return; } @@ -39,10 +39,10 @@ index 143ad4e342b184aa02b6fbbe81508e244eebc7a2..89be42b8519522398920eb424c894fd2 String awtException = io.papermc.paper.util.ServerEnvironment.awtDependencyCheck(); if (awtException != null) { diff --git a/net/minecraft/server/dedicated/DedicatedServer.java b/net/minecraft/server/dedicated/DedicatedServer.java -index dfac07850b02abba160f8f143eba4569172ab9e9..fcd4b4785f0d09f87fe214202468c75395157e14 100644 +index 81934fb56744dbbb3fdd100e8ec83cb634034d04..2dae0f4249eade60ac55c9fa289dd146dc3675e1 100644 --- a/net/minecraft/server/dedicated/DedicatedServer.java +++ b/net/minecraft/server/dedicated/DedicatedServer.java -@@ -283,6 +283,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface +@@ -239,6 +239,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface this.paperConfigurations.initializeWorldDefaultsConfiguration(this.registryAccess()); // Paper end - initialize global and world-defaults configuration me.earthme.luminol.config.ConfigManager.loadConfigFiles(); // Luminol - load config file diff --git a/lophine-server/minecraft-patches/features/0002-Fix-datapack-command-save-function.patch b/lophine-server/minecraft-patches/features/0002-Fix-datapack-command-save-function.patch index f1e258d..c41aad2 100644 --- a/lophine-server/minecraft-patches/features/0002-Fix-datapack-command-save-function.patch +++ b/lophine-server/minecraft-patches/features/0002-Fix-datapack-command-save-function.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Fix datapack command save function diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java -index 28384f9ebfcdbfbd07fc7fe3c929786eb9e2ccd3..d1cc2f956213add0e04d51db7b9da7076b521d8b 100644 +index 00c42fa41e7f002b078ec4f50154477da872d9eb..03e50cf36bad1e2f377cdebe6dc333e0d4c185c4 100644 --- a/net/minecraft/server/MinecraftServer.java +++ b/net/minecraft/server/MinecraftServer.java -@@ -2472,6 +2472,16 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop packsToEnable, final io.papermc.paper.event.server.ServerResourcesReloadedEvent.Cause cause ) { diff --git a/net/minecraft/server/commands/DataPackCommand.java b/net/minecraft/server/commands/DataPackCommand.java -index 0c7c829270d3cd3dd05a3dc7dfe82ee01d5c6bd8..991e0362e96488b64d994f1bdfb8ed5d66f98666 100644 +index 80d9bc3d680c30dae15064e0e8c3d1379ccd52e6..2bc9cf924d40d5d11935f73cf6d35442b0b0ba06 100644 --- a/net/minecraft/server/commands/DataPackCommand.java +++ b/net/minecraft/server/commands/DataPackCommand.java -@@ -98,7 +98,7 @@ public class DataPackCommand { +@@ -99,7 +99,7 @@ public class DataPackCommand { dispatcher.register( Commands.literal("datapack") .requires(Commands.hasPermission(Commands.LEVEL_GAMEMASTERS)) @@ -38,7 +38,7 @@ index 0c7c829270d3cd3dd05a3dc7dfe82ee01d5c6bd8..991e0362e96488b64d994f1bdfb8ed5d Commands.literal("enable") .then( Commands.argument("name", StringArgumentType.string()) -@@ -145,11 +145,11 @@ public class DataPackCommand { +@@ -146,11 +146,11 @@ public class DataPackCommand { .suggests(SELECTED_PACKS) .executes(c -> disablePack(c.getSource(), getPack(c, "name", false))) ) @@ -52,7 +52,7 @@ index 0c7c829270d3cd3dd05a3dc7dfe82ee01d5c6bd8..991e0362e96488b64d994f1bdfb8ed5d .then(Commands.literal("enabled").executes(c -> listEnabledPacks(c.getSource()))) ) .then( -@@ -235,7 +235,7 @@ public class DataPackCommand { +@@ -238,7 +238,7 @@ public class DataPackCommand { } private static int listPacks(final CommandSourceStack source) { diff --git a/lophine-server/minecraft-patches/features/0003-Purpur-Barrels-and-enderchests-6-rows.patch b/lophine-server/minecraft-patches/features/0003-Purpur-Barrels-and-enderchests-6-rows.patch index 45f151b..e06bcf5 100644 --- a/lophine-server/minecraft-patches/features/0003-Purpur-Barrels-and-enderchests-6-rows.patch +++ b/lophine-server/minecraft-patches/features/0003-Purpur-Barrels-and-enderchests-6-rows.patch @@ -8,10 +8,10 @@ As part of: Purpur (https://github.com/PurpurMC/Purpur/blob/dc46f46d28dcdcaf33bb Licensed under: MIT (https://github.com/PurpurMC/Purpur/blob/dc46f46d28dcdcaf33bb533f9571a107db98c1d7/LICENSE) diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java -index c9d3b000a328fe3583a7053a94c72dc003c1e10c..45e5ac1e8e2ec30935e96fa20d18e77bbd0e20bd 100644 +index 454fab8ec956268870dec8fd495434c01d5d870d..56f50ef14b0fa32a1586135fbd221e9f34aef17e 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java -@@ -963,6 +963,10 @@ public abstract class PlayerList { +@@ -961,6 +961,10 @@ public abstract class PlayerList { player.getBukkitEntity().recalculatePermissions(); // CraftBukkit this.server.getCommands().sendCommands(player); } // Paper - Add sendOpLevel API @@ -23,7 +23,7 @@ index c9d3b000a328fe3583a7053a94c72dc003c1e10c..45e5ac1e8e2ec30935e96fa20d18e77b // Paper start - whitelist verify event / login event diff --git a/net/minecraft/world/entity/player/Player.java b/net/minecraft/world/entity/player/Player.java -index 592ce8beb28ebe8aaac2ed167abb24148afb0bc3..ce8ab4b7eee5e0715e780d189d2f6554c5a9dc3c 100644 +index a447b9fbb579591c62b3d8f8e2527796feefc4a0..9fdc8134fdde2cdd7724a459a29e51f4ad943403 100644 --- a/net/minecraft/world/entity/player/Player.java +++ b/net/minecraft/world/entity/player/Player.java @@ -175,6 +175,7 @@ public abstract class Player extends Avatar implements ContainerUser { @@ -94,15 +94,15 @@ index 4df3a32faf85595372f4b250482d852c985ea3ab..101b3711bfb98888837ebed323561cac this.activeChest = activeChest; } diff --git a/net/minecraft/world/level/block/EnderChestBlock.java b/net/minecraft/world/level/block/EnderChestBlock.java -index 24a2c411da0ebbb7f97d621bb76ff686621f9aae..a9f511a549681a76a962855c26b9af5980f36df7 100644 +index f1a5b9670dd04b800a8d755f32364458a16d924a..bfc34508937befc0f7610176ebe625563f7a4fe0 100644 --- a/net/minecraft/world/level/block/EnderChestBlock.java +++ b/net/minecraft/world/level/block/EnderChestBlock.java -@@ -88,7 +88,15 @@ public class EnderChestBlock extends AbstractChestBlock i - // Paper start - Fix InventoryOpenEvent cancellation - moved up; - container.setActiveChest(enderChest); // Needs to happen before ChestMenu.threeRows as it is required for opening animations - if (level instanceof ServerLevel serverLevel && player.openMenu( -- new SimpleMenuProvider((containerId, inventory, p) -> ChestMenu.threeRows(containerId, inventory, container), CONTAINER_TITLE) -+ new SimpleMenuProvider( +@@ -90,7 +90,15 @@ public class EnderChestBlock extends AbstractChestBlock i + // Paper start - Fix InventoryOpenEvent cancellation - moved up; + container.setActiveChest(enderChest); // Needs to happen before ChestMenu.threeRows as it is required for opening animations + if (level instanceof ServerLevel serverLevel && player.openMenu( +- new SimpleMenuProvider((containerId, inventory, p) -> ChestMenu.threeRows(containerId, inventory, container), CONTAINER_TITLE) ++ new SimpleMenuProvider( + (containerId, inventory, p) -> switch (fun.bm.lophine.config.modules.function.ContainerExpansionConfig.enderchestRows) { + case 6 -> ChestMenu.sixRows(containerId, inventory, container); + case 5 -> ChestMenu.fiveRows(containerId, inventory, container); @@ -111,14 +111,14 @@ index 24a2c411da0ebbb7f97d621bb76ff686621f9aae..a9f511a549681a76a962855c26b9af59 + case 1 -> ChestMenu.oneRow(containerId, inventory, container); + default -> ChestMenu.threeRows(containerId, inventory, container); + }, CONTAINER_TITLE) // Purpur - Barrels and enderchests 6 rows - ).isPresent()) { - // Paper end - Fix InventoryOpenEvent cancellation - moved up; - player.awardStat(Stats.OPEN_ENDERCHEST); + ).isPresent()) { + // Paper end - Fix InventoryOpenEvent cancellation - moved up; + player.awardStat(Stats.OPEN_ENDERCHEST); diff --git a/net/minecraft/world/level/block/entity/BarrelBlockEntity.java b/net/minecraft/world/level/block/entity/BarrelBlockEntity.java -index 61e39a18c0fba22699750e5c0187d19a0433b9a2..98c48426fcbb4aeba479e87ab27b03e17b50d7f5 100644 +index 00aa2d0269f636f6e4c12c1be98cf901e9be8558..e8c83037700a179a43b0dc3882a67622a2e95640 100644 --- a/net/minecraft/world/level/block/entity/BarrelBlockEntity.java +++ b/net/minecraft/world/level/block/entity/BarrelBlockEntity.java -@@ -60,7 +60,17 @@ public class BarrelBlockEntity extends RandomizableContainerBlockEntity implemen +@@ -59,7 +59,17 @@ public class BarrelBlockEntity extends RandomizableContainerBlockEntity implemen } // CraftBukkit end private static final Component DEFAULT_NAME = Component.translatable("container.barrel"); @@ -135,9 +135,9 @@ index 61e39a18c0fba22699750e5c0187d19a0433b9a2..98c48426fcbb4aeba479e87ab27b03e1 + // Purpur end - Barrels and enderchests 6 rows + public final ContainerOpenersCounter openersCounter = new ContainerOpenersCounter() { - { - Objects.requireNonNull(BarrelBlockEntity.this); -@@ -123,7 +133,16 @@ public class BarrelBlockEntity extends RandomizableContainerBlockEntity implemen + // Paper start - delay open/close callbacks + @Override +@@ -118,7 +128,16 @@ public class BarrelBlockEntity extends RandomizableContainerBlockEntity implemen @Override public int getContainerSize() { @@ -155,7 +155,7 @@ index 61e39a18c0fba22699750e5c0187d19a0433b9a2..98c48426fcbb4aeba479e87ab27b03e1 } @Override -@@ -144,7 +163,16 @@ public class BarrelBlockEntity extends RandomizableContainerBlockEntity implemen +@@ -139,7 +158,16 @@ public class BarrelBlockEntity extends RandomizableContainerBlockEntity implemen @Override protected AbstractContainerMenu createMenu(final int containerId, final Inventory inventory) { diff --git a/lophine-server/minecraft-patches/features/0004-Add-config-to-disable-some-check-for-operators.patch b/lophine-server/minecraft-patches/features/0004-Add-config-to-disable-some-check-for-operators.patch index ec6ad57..b68618b 100644 --- a/lophine-server/minecraft-patches/features/0004-Add-config-to-disable-some-check-for-operators.patch +++ b/lophine-server/minecraft-patches/features/0004-Add-config-to-disable-some-check-for-operators.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Add config to disable some check for operators diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index e12927623e8de82a6105b0cb0e6b58a6c45cff7e..0b5f2060062a354bd6cafa8f53a5734dc83d062d 100644 +index 29eedcda8d5feef5b0033fdb3ee926659b86cee6..bddf77458a524fb0e6712398b785565985c21452 100644 --- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -399,7 +399,7 @@ public class ServerGamePacketListenerImpl +@@ -402,7 +402,7 @@ public class ServerGamePacketListenerImpl this.tickCount++; this.knownMovePacketCount = this.receivedMovePacketCount; if (this.clientIsFloating && !this.player.isSleeping() && !this.player.isPassenger() && !this.player.isDeadOrDying()) { @@ -17,7 +17,7 @@ index e12927623e8de82a6105b0cb0e6b58a6c45cff7e..0b5f2060062a354bd6cafa8f53a5734d // LOGGER.warn("{} was kicked for floating too long!", this.player.getPlainTextName()); // Paper - Logging moved to net.minecraft.server.network.ServerCommonPacketListenerImpl.disconnect() this.disconnect(io.papermc.paper.configuration.GlobalConfiguration.get().messages.kick.flyingPlayer, org.bukkit.event.player.PlayerKickEvent.Cause.FLYING_PLAYER); // Paper - use configurable kick message & kick event cause return true; -@@ -418,7 +418,7 @@ public class ServerGamePacketListenerImpl +@@ -421,7 +421,7 @@ public class ServerGamePacketListenerImpl this.vehicleLastGoodY = this.lastVehicle.getY(); this.vehicleLastGoodZ = this.lastVehicle.getZ(); if (this.clientVehicleIsFloating && this.lastVehicle.getControllingPassenger() == this.player) { @@ -26,7 +26,7 @@ index e12927623e8de82a6105b0cb0e6b58a6c45cff7e..0b5f2060062a354bd6cafa8f53a5734d // LOGGER.warn("{} was kicked for floating a vehicle too long!", this.player.getPlainTextName()); // Paper - Logging moved to net.minecraft.server.network.ServerCommonPacketListenerImpl.disconnect() this.disconnect(io.papermc.paper.configuration.GlobalConfiguration.get().messages.kick.flyingVehicle, org.bukkit.event.player.PlayerKickEvent.Cause.FLYING_VEHICLE); // Paper - use configurable kick message & kick event cause return true; -@@ -671,7 +671,7 @@ public class ServerGamePacketListenerImpl +@@ -674,7 +674,7 @@ public class ServerGamePacketListenerImpl zDist = targetZ - vehicle.getZ(); movedDist = xDist * xDist + yDist * yDist + zDist * zDist; boolean fail = false; @@ -35,7 +35,7 @@ index e12927623e8de82a6105b0cb0e6b58a6c45cff7e..0b5f2060062a354bd6cafa8f53a5734d fail = true; LOGGER.warn("{} (vehicle of {}) moved wrongly! {}", vehicle.getPlainTextName(), this.player.getPlainTextName(), Math.sqrt(movedDist)); } -@@ -1603,7 +1603,7 @@ public class ServerGamePacketListenerImpl +@@ -1606,7 +1606,7 @@ public class ServerGamePacketListenerImpl // Paper start - Add fail move event io.papermc.paper.event.player.PlayerFailMoveEvent event = fireFailMove(io.papermc.paper.event.player.PlayerFailMoveEvent.FailReason.MOVED_TOO_QUICKLY, targetX, targetY, targetZ, targetYRot, targetXRot, true); @@ -44,7 +44,7 @@ index e12927623e8de82a6105b0cb0e6b58a6c45cff7e..0b5f2060062a354bd6cafa8f53a5734d if (event.getLogWarning()) { LOGGER.warn("{} moved too quickly! {},{},{}", this.player.getPlainTextName(), xDist, yDist, zDist); } -@@ -1682,7 +1682,7 @@ public class ServerGamePacketListenerImpl +@@ -1672,7 +1672,7 @@ public class ServerGamePacketListenerImpl // Paper start - Add fail move event io.papermc.paper.event.player.PlayerFailMoveEvent event = fireFailMove(io.papermc.paper.event.player.PlayerFailMoveEvent.FailReason.MOVED_WRONGLY, targetX, targetY, targetZ, targetYRot, targetXRot, true); diff --git a/lophine-server/minecraft-patches/features/0005-Add-config-to-enable-cross-region-damage-trace.patch b/lophine-server/minecraft-patches/features/0005-Add-config-to-enable-cross-region-damage-trace.patch index 3aaa7a3..2d077e9 100644 --- a/lophine-server/minecraft-patches/features/0005-Add-config-to-enable-cross-region-damage-trace.patch +++ b/lophine-server/minecraft-patches/features/0005-Add-config-to-enable-cross-region-damage-trace.patch @@ -5,28 +5,28 @@ Subject: [PATCH] Add config to enable cross region damage trace diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java -index ad50feba5cbc5fe904850e6da06a866eeb23b519..f7869f06ab29e4bbd003c807176345dec9e9e5ab 100644 +index 7c479dea2b33c3a1a4dd72f4d13658ba8c596e42..b7221110c351e2da1fa38121cd582d2307dbf688 100644 --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java -@@ -1467,6 +1467,13 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -1448,6 +1448,13 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc this.awardStat(Stats.ENTITY_KILLED_BY.get(killer.getType())); killer.awardKillScore(this, source); this.createWitherRose(killer); -+ // Luminol Start - Cross Region Damage trace ++ // Lophine Start - Cross Region Damage trace + } else if (fun.bm.lophine.config.modules.experiment.EntityDamageSourceTraceConfig.enabled) { + final LivingEntity entitylivingnew = this.getKillCreditOrigin(); + if (entitylivingnew != null) { + this.damageTransferToAsync(entitylivingnew, source); + } -+ // Luminol End - Cross Region Damage trace ++ // Lophine End - Cross Region Damage trace } this.level().broadcastEntityEvent(this, EntityEvent.DEATH); -@@ -1490,6 +1497,24 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -1462,6 +1469,24 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc + this.connection.markClientUnloadedAfterDeath(); } - // Leaves end - exp fix -+ // Luminol Start - Cross Region Damage trace ++ // Lophine Start - Cross Region Damage trace + private void damageTransferToAsync(LivingEntity entity, DamageSource cause) { + // Operations running on current entity + this.awardStat(Stats.ENTITY_KILLED_BY.get(entity.getType())); @@ -42,34 +42,34 @@ index ad50feba5cbc5fe904850e6da06a866eeb23b519..f7869f06ab29e4bbd003c807176345de + } + }, null, 1L); + } -+ // Luminol End - Cross Region Damage trace ++ // Lophine End - Cross Region Damage trace + private void tellNeutralMobsThatIDied() { AABB aabb = new AABB(this.blockPosition()).inflate(32.0, 10.0, 32.0); this.level() diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java -index cd2fb9e2110d0dba1358daa283af767db3f4e80a..cc7b2ea7fda1326e3f9ed46373190a05f60c4d34 100644 +index fcaeb471dada57e9ba4d224693cefbff2fa631be..5762eed9e99d918bee02d77c0ddd70be0aa0e2ec 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java -@@ -1961,6 +1961,13 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin - final LivingEntity killer = this.getKillCredit(); +@@ -1855,6 +1855,13 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin + Runnable afterEvent = () -> { // Paper if (killer != null) { killer.awardKillScore(this, source); -+ // Luminol Start - Cross Region Damage trace ++ // Lophine Start - Cross Region Damage trace + } else if (fun.bm.lophine.config.modules.experiment.EntityDamageSourceTraceConfig.enabled) { + final LivingEntity killernew = this.getKillCreditOrigin(); + if (killernew != null) { + this.damageTransferToAsync(killernew, source); + } -+ // Luminol End - Cross Region Damage trace ++ // Lophine End - Cross Region Damage trace } - }); // Paper end - this.postDeathDropItems(deathEvent); // Paper -@@ -1971,6 +1978,19 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin - return deathEvent; // Paper + + if (this.isSleeping()) { +@@ -1943,6 +1950,19 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin + this.postDeathEventTasks.add(() -> this.dropExperience(level, source.getEntity())); // Paper } -+ // Luminol Start - Cross Region Damage trace ++ // Lophine Start - Cross Region Damage trace + private void damageTransferToAsync(LivingEntity entity, DamageSource damageSource) { + entity.getBukkitEntity().taskScheduler.schedule((LivingEntity nmsEntity) -> { + try { @@ -80,16 +80,16 @@ index cd2fb9e2110d0dba1358daa283af767db3f4e80a..cc7b2ea7fda1326e3f9ed46373190a05 + } + }, null, 1L ); + } -+ // Luminol End - Cross Region Damage trace ++ // Lophine End - Cross Region Damage trace + protected void dropEquipment(final ServerLevel level) { } - protected void postDeathDropItems(org.bukkit.event.entity.EntityDeathEvent event) {} // Paper - method for post death logic that cannot be ran before the event is potentially cancelled -@@ -2629,6 +2649,18 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin + +@@ -2609,6 +2629,18 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin } } -+ // Luminol Start - Cross Region Damage trace ++ // Lophine Start - Cross Region Damage trace + @Nullable + public LivingEntity getKillCreditOrigin() { + if (this.lastHurtByPlayer != null) { @@ -99,7 +99,7 @@ index cd2fb9e2110d0dba1358daa283af767db3f4e80a..cc7b2ea7fda1326e3f9ed46373190a05 + } + return null; + } -+ // Luminol End - Cross Region Damage trace ++ // Lophine End - Cross Region Damage trace + public final float getMaxHealth() { return (float)this.getAttributeValue(Attributes.MAX_HEALTH); diff --git a/lophine-server/minecraft-patches/features/0006-Add-config-to-enable-save-all-command.patch b/lophine-server/minecraft-patches/features/0006-Add-config-to-enable-save-all-command.patch index 6c35acf..d42d62a 100644 --- a/lophine-server/minecraft-patches/features/0006-Add-config-to-enable-save-all-command.patch +++ b/lophine-server/minecraft-patches/features/0006-Add-config-to-enable-save-all-command.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Add config to enable save-all command diff --git a/io/papermc/paper/threadedregions/RegionizedServer.java b/io/papermc/paper/threadedregions/RegionizedServer.java -index 11cacb26ce260373476dad764014ba1852477831..981f63b75584dbcb4bb0d5672e8c8bb140c52f9d 100644 +index dbd713226f45b8b9992aa349ddbbc1c69ed47c04..cbfb4bdde0f32ec3996e5baa7e7ed5749e2d12a0 100644 --- a/io/papermc/paper/threadedregions/RegionizedServer.java +++ b/io/papermc/paper/threadedregions/RegionizedServer.java @@ -364,6 +364,8 @@ public final class RegionizedServer { @@ -18,7 +18,7 @@ index 11cacb26ce260373476dad764014ba1852477831..981f63b75584dbcb4bb0d5672e8c8bb1 for (final ServerLevel world : this.worlds) { this.globalTick(world, tickCount); diff --git a/io/papermc/paper/threadedregions/TickRegions.java b/io/papermc/paper/threadedregions/TickRegions.java -index 02c004bc7f9a0203523ce4b27cd766d6bdc478c0..3d86e21198f2888422330b6f7c27712f40a6aabc 100644 +index b03d47746879e57ad106bc1b736358d9a5ea1a9d..25951b9858a8d141e2cde7c442ac830e6921e716 100644 --- a/io/papermc/paper/threadedregions/TickRegions.java +++ b/io/papermc/paper/threadedregions/TickRegions.java @@ -190,6 +190,8 @@ public final class TickRegions implements ThreadedRegionizer.RegionCallbacks, Object> regionizedData = new Reference2ReferenceOpenHashMap<>(); diff --git a/net/minecraft/commands/Commands.java b/net/minecraft/commands/Commands.java -index 89f61f5715942d2b521e04b9fdc8b1b379c0c957..2c2487e1c1c65438119a13bd705a9e44697955ed 100644 +index 9800ae1d3c49800b0c7342d43d696109b5b72cf4..f9a8c79640ed6ca381e4482eaeab6b23db59419f 100644 --- a/net/minecraft/commands/Commands.java +++ b/net/minecraft/commands/Commands.java @@ -299,7 +299,11 @@ public class Commands { @@ -48,10 +48,10 @@ index 89f61f5715942d2b521e04b9fdc8b1b379c0c957..2c2487e1c1c65438119a13bd705a9e44 SaveOnCommand.register(this.dispatcher); SetPlayerIdleTimeoutCommand.register(this.dispatcher); diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java -index d1cc2f956213add0e04d51db7b9da7076b521d8b..82013a8f7cf07b6f0645ca6b51ee75fcb0a56298 100644 +index 03e50cf36bad1e2f377cdebe6dc333e0d4c185c4..fb9b0cb1b8b1fd6c5666a3990a4e74824d4bef7e 100644 --- a/net/minecraft/server/MinecraftServer.java +++ b/net/minecraft/server/MinecraftServer.java -@@ -1683,6 +1683,11 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop Component.translatable("commands.save.success"), true); - return 1; -- } -+ }*/ -+ return 1; + throw ERROR_FAILED.create(); + } + +- source.sendSuccess(() -> Component.translatable("commands.save.success"), true); ++ source.sendSuccess(() -> Component.translatable("commands.save.success"), true);*/ + return Command.SINGLE_SUCCESS; } + + public static SimpleCommandExceptionType getErrorFailed() { diff --git a/lophine-server/minecraft-patches/features/0007-Add-config-to-enable-function-command.patch b/lophine-server/minecraft-patches/features/0007-Add-config-to-enable-function-command.patch index 0d04f2e..f72b407 100644 --- a/lophine-server/minecraft-patches/features/0007-Add-config-to-enable-function-command.patch +++ b/lophine-server/minecraft-patches/features/0007-Add-config-to-enable-function-command.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Add config to enable function command diff --git a/net/minecraft/commands/Commands.java b/net/minecraft/commands/Commands.java -index 2c2487e1c1c65438119a13bd705a9e44697955ed..4e0428948d618b0a072679762dc3cb39d6e12c2f 100644 +index f9a8c79640ed6ca381e4482eaeab6b23db59419f..1b2d3e2c23e8e03ae25e85a60b6ef0528e627f61 100644 --- a/net/minecraft/commands/Commands.java +++ b/net/minecraft/commands/Commands.java @@ -217,7 +217,11 @@ public class Commands { diff --git a/lophine-server/minecraft-patches/features/0008-Add-config-to-enable-scoreboard-command.patch b/lophine-server/minecraft-patches/features/0008-Add-config-to-enable-scoreboard-command.patch index f01ae4e..32a2e0f 100644 --- a/lophine-server/minecraft-patches/features/0008-Add-config-to-enable-scoreboard-command.patch +++ b/lophine-server/minecraft-patches/features/0008-Add-config-to-enable-scoreboard-command.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Add config to enable scoreboard command diff --git a/net/minecraft/commands/Commands.java b/net/minecraft/commands/Commands.java -index 4e0428948d618b0a072679762dc3cb39d6e12c2f..87ffca5ff0c2775cb85a6058c9be66e00c94f01f 100644 +index 1b2d3e2c23e8e03ae25e85a60b6ef0528e627f61..916b5c8d524ffd7ccb953fe0f1cf020a1ea8dafb 100644 --- a/net/minecraft/commands/Commands.java +++ b/net/minecraft/commands/Commands.java @@ -246,7 +246,11 @@ public class Commands { diff --git a/lophine-server/minecraft-patches/features/0009-Add-config-to-enable-trigger-command.patch b/lophine-server/minecraft-patches/features/0009-Add-config-to-enable-trigger-command.patch index 1c8bfe2..907fca5 100644 --- a/lophine-server/minecraft-patches/features/0009-Add-config-to-enable-trigger-command.patch +++ b/lophine-server/minecraft-patches/features/0009-Add-config-to-enable-trigger-command.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Add config to enable trigger command diff --git a/net/minecraft/commands/Commands.java b/net/minecraft/commands/Commands.java -index 87ffca5ff0c2775cb85a6058c9be66e00c94f01f..74ef76058e5a410d12f88aa09450e7d90f63b5e6 100644 +index 916b5c8d524ffd7ccb953fe0f1cf020a1ea8dafb..03f3fe221b14f0317947d74e25049bcce2ebeb66 100644 --- a/net/minecraft/commands/Commands.java +++ b/net/minecraft/commands/Commands.java @@ -274,7 +274,11 @@ public class Commands { diff --git a/lophine-server/minecraft-patches/features/0010-Add-config-to-enable-raytracing-tracker.patch b/lophine-server/minecraft-patches/features/0010-Add-config-to-enable-raytracing-tracker.patch index 10fc0bc..5cdddda 100644 --- a/lophine-server/minecraft-patches/features/0010-Add-config-to-enable-raytracing-tracker.patch +++ b/lophine-server/minecraft-patches/features/0010-Add-config-to-enable-raytracing-tracker.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Add config to enable raytracing tracker diff --git a/net/minecraft/server/level/ChunkMap.java b/net/minecraft/server/level/ChunkMap.java -index 0c0775bbb0c0ba0c37d1b884bb106b5250e94750..0dfb25ad032429a2aea7aa441dd5fd1848a6c617 100644 +index 8afac579c755df001c91b66b207a45d331629d10..e9cd960a0733ac37fac8e956ae36628bf42b79f2 100644 --- a/net/minecraft/server/level/ChunkMap.java +++ b/net/minecraft/server/level/ChunkMap.java @@ -1350,7 +1350,7 @@ public class ChunkMap extends SimpleRegionStorage implements ChunkHolder.PlayerP @@ -18,10 +18,10 @@ index 0c0775bbb0c0ba0c37d1b884bb106b5250e94750..0dfb25ad032429a2aea7aa441dd5fd18 double rangeY = level.paperConfig().entities.trackingRangeY.get(this.entity, -1); if (rangeY != -1) { diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java -index 552fd994ee30deb6e9f4228b17a2883cf26b164c..f090b8d77bd2731debfc61c263bd77550f52212b 100644 +index be6d31fc790ff6346ae2aedcd21a43be9d2360c1..cc47f02936cad38627c2ee87e54aa8b80a66a8af 100644 --- a/net/minecraft/world/entity/Entity.java +++ b/net/minecraft/world/entity/Entity.java -@@ -167,7 +167,7 @@ public abstract class Entity +@@ -164,7 +164,7 @@ public abstract class Entity ItemOwner, SlotProvider, DebugValueSource, @@ -30,8 +30,8 @@ index 552fd994ee30deb6e9f4228b17a2883cf26b164c..f090b8d77bd2731debfc61c263bd7755 // CraftBukkit start private static final int CURRENT_LEVEL = 2; static boolean isLevelAtLeast(ValueInput input, int level) { -@@ -6432,4 +6432,48 @@ public abstract class Entity - // Paper end - Expose entity id counter +@@ -6504,4 +6504,48 @@ public abstract class Entity + // Paper end public boolean shouldTickHot() { return this.tickCount > 20 * 10 && this.isAlive(); } // KioCG + // Lophine start - Add config to enable raytracing tracker @@ -80,10 +80,10 @@ index 552fd994ee30deb6e9f4228b17a2883cf26b164c..f090b8d77bd2731debfc61c263bd7755 + // Lophine end - Add config to enable raytracing tracker } diff --git a/net/minecraft/world/entity/EntityType.java b/net/minecraft/world/entity/EntityType.java -index cb0a52dc3795e1cf54069bcbe82abf7877a658b8..0d743a01ae70baa789cd0e0bb9abd4c4f8310b99 100644 +index 6efaa78faca15c7a48bdffb24480d1bac29f3ba8..8a328a41673a3d720f0b1a5de8ce049e360fac1b 100644 --- a/net/minecraft/world/entity/EntityType.java +++ b/net/minecraft/world/entity/EntityType.java -@@ -1252,6 +1252,11 @@ public class EntityType implements EntityTypeTest, +@@ -84,6 +84,11 @@ public class EntityType implements EntityTypeTest, public final int passengerTickTimerId; public final int passengerInactiveTickTimerId; // Folia end - profiler @@ -96,7 +96,7 @@ index cb0a52dc3795e1cf54069bcbe82abf7877a658b8..0d743a01ae70baa789cd0e0bb9abd4c4 public EntityType( final EntityType.EntityFactory factory, diff --git a/net/minecraft/world/entity/player/Player.java b/net/minecraft/world/entity/player/Player.java -index ce8ab4b7eee5e0715e780d189d2f6554c5a9dc3c..06c6d30f3aef605bc25c42db8a6d26bbde57f40b 100644 +index 9fdc8134fdde2cdd7724a459a29e51f4ad943403..c6fa9dff800b1491b1e0fc5d7e1dc16b99b8c7db 100644 --- a/net/minecraft/world/entity/player/Player.java +++ b/net/minecraft/world/entity/player/Player.java @@ -186,6 +186,25 @@ public abstract class Player extends Avatar implements ContainerUser { @@ -124,8 +124,8 @@ index ce8ab4b7eee5e0715e780d189d2f6554c5a9dc3c..06c6d30f3aef605bc25c42db8a6d26bb + // Luminol end public Player(final Level level, final GameProfile gameProfile) { - super(EntityType.PLAYER, level); -@@ -241,6 +260,26 @@ public abstract class Player extends Avatar implements ContainerUser { + super(EntityTypes.PLAYER, level); +@@ -245,6 +264,26 @@ public abstract class Player extends Avatar implements ContainerUser { @Override public void tick() { @@ -152,7 +152,7 @@ index ce8ab4b7eee5e0715e780d189d2f6554c5a9dc3c..06c6d30f3aef605bc25c42db8a6d26bb this.noPhysics = this.isSpectator(); if (this.isSpectator() || this.isPassenger()) { this.setOnGround(false); -@@ -1355,6 +1394,7 @@ public abstract class Player extends Avatar implements ContainerUser { +@@ -1378,6 +1417,7 @@ public abstract class Player extends Avatar implements ContainerUser { if (this.hasContainerOpen()) { this.doCloseContainer(); } diff --git a/lophine-server/minecraft-patches/features/0011-Add-tick-rate-support.patch b/lophine-server/minecraft-patches/features/0011-Add-tick-rate-support.patch index bfe7463..2c7a8b1 100644 --- a/lophine-server/minecraft-patches/features/0011-Add-tick-rate-support.patch +++ b/lophine-server/minecraft-patches/features/0011-Add-tick-rate-support.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Add tick rate support diff --git a/io/papermc/paper/threadedregions/RegionizedServer.java b/io/papermc/paper/threadedregions/RegionizedServer.java -index 981f63b75584dbcb4bb0d5672e8c8bb140c52f9d..6e8ee04967afa410ce9dccff34bf9a43201694fd 100644 +index cbfb4bdde0f32ec3996e5baa7e7ed5749e2d12a0..64c9f1d36ac9f02f0dd574ffb995e56a08631bfc 100644 --- a/io/papermc/paper/threadedregions/RegionizedServer.java +++ b/io/papermc/paper/threadedregions/RegionizedServer.java @@ -371,6 +371,14 @@ public final class RegionizedServer { @@ -24,7 +24,7 @@ index 981f63b75584dbcb4bb0d5672e8c8bb140c52f9d..6e8ee04967afa410ce9dccff34bf9a43 this.tickConnections(); diff --git a/io/papermc/paper/threadedregions/TickRegionScheduler.java b/io/papermc/paper/threadedregions/TickRegionScheduler.java -index 86c51506c518ee445d00f7eef36ee2c9adbd9b4c..a37f392146ccc0319cf56ee0058ae8782b598fe3 100644 +index 5f4f80c1d4003254fd840f71d86908603b57bfa2..57a35d7a801621fc461e896eb2bba533d9d5bc1b 100644 --- a/io/papermc/paper/threadedregions/TickRegionScheduler.java +++ b/io/papermc/paper/threadedregions/TickRegionScheduler.java @@ -40,8 +40,8 @@ public final class TickRegionScheduler { @@ -66,7 +66,7 @@ index 86c51506c518ee445d00f7eef36ee2c9adbd9b4c..a37f392146ccc0319cf56ee0058ae878 if (!this.tryMarkTicking()) { if (!this.cancelled.get()) { diff --git a/net/minecraft/server/ServerTickRateManager.java b/net/minecraft/server/ServerTickRateManager.java -index 8d0f810100a4eac65831913feeb9a9eeb0e6006a..ca35415e152dc63cb9f4ae8da8b06766600922fd 100644 +index eeb2f88723b37bb3cada04bf3098dd46f0ed7316..8432d0ce22ddc9c9bfa98901e403697f40e53c99 100644 --- a/net/minecraft/server/ServerTickRateManager.java +++ b/net/minecraft/server/ServerTickRateManager.java @@ -110,7 +110,7 @@ public class ServerTickRateManager extends TickRateManager { @@ -92,10 +92,10 @@ index 8d0f810100a4eac65831913feeb9a9eeb0e6006a..ca35415e152dc63cb9f4ae8da8b06766 this.sprintTimeSpend = this.sprintTimeSpend + (System.nanoTime() - this.sprintTickStartTime); } diff --git a/net/minecraft/server/commands/TickCommand.java b/net/minecraft/server/commands/TickCommand.java -index cae943bae4701f74b46a49d68da83ae797841590..9f43eff6160ac6855c2e5dd9c23c384b03b7e96c 100644 +index 64b685b219b930a1bb7f85db9947f4d1ca9df093..4421658e4061299dea2ff72a77506214cc9045d8 100644 --- a/net/minecraft/server/commands/TickCommand.java +++ b/net/minecraft/server/commands/TickCommand.java -@@ -14,7 +14,7 @@ import net.minecraft.server.ServerTickRateManager; +@@ -15,7 +15,7 @@ import net.minecraft.server.ServerTickRateManager; import net.minecraft.util.TimeUtil; public class TickCommand { @@ -104,7 +104,7 @@ index cae943bae4701f74b46a49d68da83ae797841590..9f43eff6160ac6855c2e5dd9c23c384b private static final String DEFAULT_TICKRATE = String.valueOf(20); public static void register(final CommandDispatcher dispatcher) { -@@ -22,14 +22,14 @@ public class TickCommand { +@@ -23,14 +23,14 @@ public class TickCommand { Commands.literal("tick") .requires(Commands.hasPermission(Commands.LEVEL_ADMINS)) .then(Commands.literal("query").executes(c -> tickQuery(c.getSource()))) diff --git a/lophine-server/minecraft-patches/features/0012-Modify-merge-ItemEntity-logic.patch b/lophine-server/minecraft-patches/features/0012-Modify-merge-ItemEntity-logic.patch index df52957..56d54b1 100644 --- a/lophine-server/minecraft-patches/features/0012-Modify-merge-ItemEntity-logic.patch +++ b/lophine-server/minecraft-patches/features/0012-Modify-merge-ItemEntity-logic.patch @@ -9,10 +9,10 @@ individual items may never reach their destination. This configuration option is added to fix this behavior. diff --git a/net/minecraft/world/entity/item/ItemEntity.java b/net/minecraft/world/entity/item/ItemEntity.java -index aed1641b4e09384d40da1ac6e66c1641ca34b063..44b06b1585e7630fa17d8dfb01f737b14efebcbc 100644 +index 6f5d3ebb7adc567e5106a3c76fccdbee93f51c27..b1d5d59718e5748b164f0885d4152e795c5d572d 100644 --- a/net/minecraft/world/entity/item/ItemEntity.java +++ b/net/minecraft/world/entity/item/ItemEntity.java -@@ -287,7 +287,7 @@ public class ItemEntity extends Entity implements TraceableEntity, ChangePublish +@@ -289,7 +289,7 @@ public class ItemEntity extends Entity implements TraceableEntity, ChangePublish ItemStack thisItemStack = this.getItem(); ItemStack otherItemStack = other.getItem(); if (Objects.equals(this.target, other.target) && areMergable(thisItemStack, otherItemStack)) { diff --git a/lophine-server/minecraft-patches/features/0013-Old-zombie-reinforcement.patch b/lophine-server/minecraft-patches/features/0013-Old-zombie-reinforcement.patch index d5a1e10..eb00b7b 100644 --- a/lophine-server/minecraft-patches/features/0013-Old-zombie-reinforcement.patch +++ b/lophine-server/minecraft-patches/features/0013-Old-zombie-reinforcement.patch @@ -5,15 +5,15 @@ Subject: [PATCH] Old zombie reinforcement diff --git a/net/minecraft/world/entity/monster/zombie/Zombie.java b/net/minecraft/world/entity/monster/zombie/Zombie.java -index 0008aa0ca02fc4ea67b795b3f0a0e9656233ce89..2734ffc103ee4760d3521609fdd090ab99df675b 100644 +index aa0a34e3bae3c0d81bc87577570340d1efc46c2b..c913cd25cf7a0eb625bc02845bf4af4f7c1a96ab 100644 --- a/net/minecraft/world/entity/monster/zombie/Zombie.java +++ b/net/minecraft/world/entity/monster/zombie/Zombie.java -@@ -331,7 +331,7 @@ public class Zombie extends Monster { - int x = Mth.floor(this.getX()); - int y = Mth.floor(this.getY()); - int z = Mth.floor(this.getZ()); -- EntityType type = this.getType(); -+ EntityType type = fun.bm.lophine.config.modules.function.OldFeatureConfig.oldZombieReinforcement ? EntityType.ZOMBIE : this.getType(); // Lophine - old zombie reinforcement - Zombie reinforcement = type.create(level, EntitySpawnReason.REINFORCEMENT); - if (reinforcement == null) { - return true; +@@ -333,7 +333,7 @@ public class Zombie extends Monster { + int x = Mth.floor(this.getX()); + int y = Mth.floor(this.getY()); + int z = Mth.floor(this.getZ()); +- EntityType type = this.getType(); ++ EntityType type = fun.bm.lophine.config.modules.function.OldFeatureConfig.oldZombieReinforcement ? EntityTypes.ZOMBIE : this.getType(); // Lophine - old zombie reinforcement + Zombie reinforcement = type.create(level, EntitySpawnReason.REINFORCEMENT); + if (reinforcement == null) { + return true; diff --git a/lophine-server/minecraft-patches/features/0014-Spawn-invulnerable-time.patch b/lophine-server/minecraft-patches/features/0014-Spawn-invulnerable-time.patch index cd41a09..62609b8 100644 --- a/lophine-server/minecraft-patches/features/0014-Spawn-invulnerable-time.patch +++ b/lophine-server/minecraft-patches/features/0014-Spawn-invulnerable-time.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Spawn invulnerable time diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java -index f7869f06ab29e4bbd003c807176345dec9e9e5ab..295be200cb0696bd2ae2b655f89d96dd7723a541 100644 +index b7221110c351e2da1fa38121cd582d2307dbf688..a13b6e60251151295e13d40840096cb002968b82 100644 --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java -@@ -242,6 +242,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -245,6 +245,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc private int lastSentFood = -99999999; private boolean lastFoodSaturationZero = true; public int lastSentExp = -99999999; @@ -16,7 +16,7 @@ index f7869f06ab29e4bbd003c807176345dec9e9e5ab..295be200cb0696bd2ae2b655f89d96dd private ChatVisiblity chatVisibility = ChatVisiblity.FULL; public ParticleStatus particleStatus = ParticleStatus.ALL; private boolean canChatColor = true; -@@ -923,6 +924,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -902,6 +903,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc this.connection.tickClientLoadTimeout(); this.gameMode.tick(); this.wardenSpawnTracker.tick(); @@ -24,17 +24,17 @@ index f7869f06ab29e4bbd003c807176345dec9e9e5ab..295be200cb0696bd2ae2b655f89d96dd if (this.invulnerableTime > 0) { this.invulnerableTime--; } -@@ -1559,6 +1561,13 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc - if (this.isInvulnerableTo(level, source)) { +@@ -1532,6 +1534,13 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc return false; - } else { -+ // Lophine start - spawn invulnerable time -+ if (fun.bm.lophine.config.modules.function.OldFeatureConfig.spawnInvulnerableTime) { -+ if (this.spawnInvulnerableTime > 0 && !source.is(net.minecraft.tags.DamageTypeTags.BYPASSES_INVULNERABILITY)) { -+ return false; -+ } + } + ++ // Lophine start - spawn invulnerable time ++ if (fun.bm.lophine.config.modules.function.OldFeatureConfig.spawnInvulnerableTime) { ++ if (this.spawnInvulnerableTime > 0 && !source.is(net.minecraft.tags.DamageTypeTags.BYPASSES_INVULNERABILITY)) { ++ return false; + } -+ // Lophine end - spawn invulnerable time - Entity entity = source.getEntity(); - if (!( // Paper - split the if statement. If below statement is false, hurtServer would not have been evaluated. Return false. - !(entity instanceof Player playerx && !this.canHarmPlayer(playerx)) ++ } ++ // Lophine end - spawn invulnerable time + Entity entity = source.getEntity(); + if (!( // Paper - split the if statement. If below statement is false, hurtServer would not have been evaluated. Return false. + !(entity instanceof Player player && !this.canHarmPlayer(player)) diff --git a/lophine-server/minecraft-patches/features/0015-Leaves-Item-overstack-util.patch b/lophine-server/minecraft-patches/features/0015-Leaves-Item-overstack-util.patch index 3302539..fbfa7e6 100644 --- a/lophine-server/minecraft-patches/features/0015-Leaves-Item-overstack-util.patch +++ b/lophine-server/minecraft-patches/features/0015-Leaves-Item-overstack-util.patch @@ -8,7 +8,7 @@ As a part of : Leaves (https://github.com/LeavesMC/Leaves/blob/f3784ec0525069a37 Licensed under: GPL-3.0 (https://www.gnu.org/licenses/gpl-3.0.html) diff --git a/net/minecraft/commands/arguments/item/ItemInput.java b/net/minecraft/commands/arguments/item/ItemInput.java -index 28aab52fb14e9086d81dd7a3fa32e7f12136d53a..1f033b970be82b0bdb4e51b6e1c5bb03170066ae 100644 +index 0dce216ae73c85dd69056bec7ef60b5e4364f23b..9ce6305e9fea9edcd3b1b853070d9990e00a667b 100644 --- a/net/minecraft/commands/arguments/item/ItemInput.java +++ b/net/minecraft/commands/arguments/item/ItemInput.java @@ -20,8 +20,10 @@ public record ItemInput(Holder item, DataComponentPatch components) { @@ -21,11 +21,11 @@ index 28aab52fb14e9086d81dd7a3fa32e7f12136d53a..1f033b970be82b0bdb4e51b6e1c5bb03 + if (count > org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(result)) { + throw ERROR_STACK_TOO_BIG.create(this.item.getRegisteredName(), org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(result)); + // Leaves end - item over-stack util - } else { - DataResult validationResult = ItemStack.validateStrict(result); - return validationResult.getOrThrow(ERROR_MALFORMED_ITEM::create); + } + + DataResult validationResult = ItemStack.validateStrict(result); diff --git a/net/minecraft/server/commands/GiveCommand.java b/net/minecraft/server/commands/GiveCommand.java -index c147a1acd4fd9f94c73bee69febf651ca00c28ce..f8004bf74edeabce871515fb73fa00f331941dca 100644 +index be357d315f5c83349a7f7287ff45e92137950a8c..a542e38ea6a1e8fc81466acbca071d89832ba54a 100644 --- a/net/minecraft/server/commands/GiveCommand.java +++ b/net/minecraft/server/commands/GiveCommand.java @@ -47,7 +47,7 @@ public class GiveCommand { @@ -38,10 +38,10 @@ index c147a1acd4fd9f94c73bee69febf651ca00c28ce..f8004bf74edeabce871515fb73fa00f3 if (count > maxAllowedCount) { source.sendFailure(Component.translatable("commands.give.failed.toomanyitems", maxAllowedCount, prototypeItemStack.getDisplayName())); diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 0b5f2060062a354bd6cafa8f53a5734dc83d062d..e15be199d690954d99d710de4046e721a943b3a9 100644 +index bddf77458a524fb0e6712398b785565985c21452..57d95a22043cc0e229e302700a75fdc5e2d341b6 100644 --- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -3229,7 +3229,7 @@ public class ServerGamePacketListenerImpl +@@ -3214,7 +3214,7 @@ public class ServerGamePacketListenerImpl } else if (slot.mayPlace(cursor)) { if (ItemStack.isSameItemSameComponents(clickedItem, cursor)) { int toPlace = packet.buttonNum() == 0 ? cursor.getCount() : 1; @@ -50,7 +50,7 @@ index 0b5f2060062a354bd6cafa8f53a5734dc83d062d..e15be199d690954d99d710de4046e721 toPlace = Math.min(toPlace, slot.container.getMaxStackSize() - clickedItem.getCount()); if (toPlace == 1) { action = InventoryAction.PLACE_ONE; -@@ -3265,7 +3265,7 @@ public class ServerGamePacketListenerImpl +@@ -3250,7 +3250,7 @@ public class ServerGamePacketListenerImpl } } else if (ItemStack.isSameItemSameComponents(cursor, clickedItem)) { if (clickedItem.getCount() >= 0) { @@ -59,7 +59,7 @@ index 0b5f2060062a354bd6cafa8f53a5734dc83d062d..e15be199d690954d99d710de4046e721 // As of 1.5, this is result slots only action = InventoryAction.PICKUP_ALL; } -@@ -3482,6 +3482,7 @@ public class ServerGamePacketListenerImpl +@@ -3467,6 +3467,7 @@ public class ServerGamePacketListenerImpl this.player.containerMenu.broadcastFullState(); } else { this.player.containerMenu.broadcastChanges(); @@ -67,7 +67,7 @@ index 0b5f2060062a354bd6cafa8f53a5734dc83d062d..e15be199d690954d99d710de4046e721 } if (packet.buttonNum() == Inventory.SLOT_OFFHAND && this.player.containerMenu != this.player.inventoryMenu) this.player.containerSynchronizer.sendOffHandSlotChange(); // Paper - update offhand data when the player is clicking in an inventory not their own as the sychronizer does not include offhand slots if (io.papermc.paper.configuration.GlobalConfiguration.get().unsupportedSettings.updateEquipmentOnPlayerActions) this.player.detectEquipmentUpdates(); // Paper - Force update attributes. -@@ -3593,7 +3594,7 @@ public class ServerGamePacketListenerImpl +@@ -3578,7 +3579,7 @@ public class ServerGamePacketListenerImpl } boolean validSlot = packet.slotNum() >= 1 && packet.slotNum() <= 45; @@ -76,7 +76,7 @@ index 0b5f2060062a354bd6cafa8f53a5734dc83d062d..e15be199d690954d99d710de4046e721 if (drop || (validSlot && !ItemStack.matches(this.player.inventoryMenu.getSlot(packet.slotNum()).getItem(), packet.itemStack()))) { // Insist on valid slot // CraftBukkit start - Call click event org.bukkit.inventory.InventoryView inventory = this.player.inventoryMenu.getBukkitView(); -@@ -3635,6 +3636,7 @@ public class ServerGamePacketListenerImpl +@@ -3620,6 +3621,7 @@ public class ServerGamePacketListenerImpl this.player.inventoryMenu.getSlot(packet.slotNum()).setByPlayer(itemStack); this.player.inventoryMenu.setRemoteSlot(packet.slotNum(), itemStack); this.player.inventoryMenu.broadcastChanges(); @@ -85,10 +85,10 @@ index 0b5f2060062a354bd6cafa8f53a5734dc83d062d..e15be199d690954d99d710de4046e721 } else if (drop && validData) { if (this.dropSpamThrottler.isUnderThreshold()) { diff --git a/net/minecraft/world/Container.java b/net/minecraft/world/Container.java -index 54d99625cfec60530e8a3288871e6dc21e179b2d..2a1c1bd2e9c326b7298978cec1fe13112e670d33 100644 +index dd2d0940eece3e85078e574f66f71a4c497d75fd..b3585aee0393142366e583fc2c8fb207f162e92b 100644 --- a/net/minecraft/world/Container.java +++ b/net/minecraft/world/Container.java -@@ -38,6 +38,12 @@ public interface Container extends Clearable, Iterable, SlotProvider, +@@ -37,6 +37,12 @@ public interface Container extends Clearable, Iterable, SlotProvider, return Math.min(this.getMaxStackSize(), itemStack.getMaxStackSize()); } @@ -102,7 +102,7 @@ index 54d99625cfec60530e8a3288871e6dc21e179b2d..2a1c1bd2e9c326b7298978cec1fe1311 boolean stillValid(Player player); diff --git a/net/minecraft/world/SimpleContainer.java b/net/minecraft/world/SimpleContainer.java -index 21f576bb39bfd78dca87606ba3a044db8e13e28e..049c6ab6472415479435f2caab0444c3cbd33902 100644 +index 073a3bbf1b1db7eac83cf35412543f370fa089ee..0f412551685a8ea76be3b389e0782e57d22bb87c 100644 --- a/net/minecraft/world/SimpleContainer.java +++ b/net/minecraft/world/SimpleContainer.java @@ -193,7 +193,7 @@ public class SimpleContainer implements Container, StackedContentsCompatible { @@ -124,10 +124,10 @@ index 21f576bb39bfd78dca87606ba3a044db8e13e28e..049c6ab6472415479435f2caab0444c3 if (diff > 0) { targetStack.grow(diff); diff --git a/net/minecraft/world/entity/item/ItemEntity.java b/net/minecraft/world/entity/item/ItemEntity.java -index 44b06b1585e7630fa17d8dfb01f737b14efebcbc..679a941a2af886697fbfcbc7f21e5f4e0ec77dc3 100644 +index b1d5d59718e5748b164f0885d4152e795c5d572d..44a5be736ba73c065a5b1a5fffcf2ea4a21d89dd 100644 --- a/net/minecraft/world/entity/item/ItemEntity.java +++ b/net/minecraft/world/entity/item/ItemEntity.java -@@ -280,10 +280,15 @@ public class ItemEntity extends Entity implements TraceableEntity, ChangePublish +@@ -282,10 +282,15 @@ public class ItemEntity extends Entity implements TraceableEntity, ChangePublish private boolean isMergable() { ItemStack item = this.getItem(); @@ -145,7 +145,7 @@ index 44b06b1585e7630fa17d8dfb01f737b14efebcbc..679a941a2af886697fbfcbc7f21e5f4e ItemStack otherItemStack = other.getItem(); if (Objects.equals(this.target, other.target) && areMergable(thisItemStack, otherItemStack)) { diff --git a/net/minecraft/world/entity/player/Inventory.java b/net/minecraft/world/entity/player/Inventory.java -index f004911c438e6f89d6e079437e3f4104d6cbacbd..a248b1d11303237ebdf7cac4fa63865287d91a10 100644 +index cd7714dffcd7e7b6d96d18a97e65fd0914a739d1..fd38d7c34910ab9a60a9f54968901be3af2a9867 100644 --- a/net/minecraft/world/entity/player/Inventory.java +++ b/net/minecraft/world/entity/player/Inventory.java @@ -166,10 +166,12 @@ public class Inventory implements Container, Nameable { @@ -190,7 +190,7 @@ index f004911c438e6f89d6e079437e3f4104d6cbacbd..a248b1d11303237ebdf7cac4fa638652 int toAdd = Math.min(count, maxToAdd); if (toAdd == 0) { return count; -@@ -421,7 +423,7 @@ public class Inventory implements Container, Nameable { +@@ -423,7 +425,7 @@ public class Inventory implements Container, Nameable { break; } @@ -213,10 +213,10 @@ index 1ace17d8fc7e7b8b4722a1889d49233c0ec55e20..d146f02338852810679a45bff932d9d6 public void accountStack(final ItemStack itemStack, final int maxCount) { diff --git a/net/minecraft/world/entity/vehicle/ContainerEntity.java b/net/minecraft/world/entity/vehicle/ContainerEntity.java -index 9c9a08752b54222e8ac8d9a38c7a28a775bd1164..42716cf2c864eba50628dc64c59ab29c1d51dc9b 100644 +index c80a44dbc54e0bf00daa525bef20422b15ce8a85..d9daef9b2ccf0f0bbe61ff3d7a20f25193aabaf8 100644 --- a/net/minecraft/world/entity/vehicle/ContainerEntity.java +++ b/net/minecraft/world/entity/vehicle/ContainerEntity.java -@@ -161,7 +161,7 @@ public interface ContainerEntity extends Container, MenuProvider { +@@ -160,7 +160,7 @@ public interface ContainerEntity extends Container, MenuProvider { default void setChestVehicleItem(final int slot, final ItemStack itemStack) { this.unpackChestVehicleLootTable(null); this.getItemStacks().set(slot, itemStack); @@ -226,10 +226,10 @@ index 9c9a08752b54222e8ac8d9a38c7a28a775bd1164..42716cf2c864eba50628dc64c59ab29c default @Nullable SlotAccess getChestVehicleSlot(final int slot) { diff --git a/net/minecraft/world/inventory/AbstractContainerMenu.java b/net/minecraft/world/inventory/AbstractContainerMenu.java -index 4a177b4e714ba52cc18024d1233c9425afb93741..fa1f7dd22959632aaa54e72c8caf13ea072e7ca7 100644 +index c063694237c0c98ad370ac7fc170172f9ed3fb37..f6d37cba8ab5688501be9170720a0b6ded810819 100644 --- a/net/minecraft/world/inventory/AbstractContainerMenu.java +++ b/net/minecraft/world/inventory/AbstractContainerMenu.java -@@ -294,6 +294,14 @@ public abstract class AbstractContainerMenu { +@@ -293,6 +293,14 @@ public abstract class AbstractContainerMenu { this.sendAllDataToRemote(); } @@ -244,7 +244,7 @@ index 4a177b4e714ba52cc18024d1233c9425afb93741..fa1f7dd22959632aaa54e72c8caf13ea private void updateDataSlotListeners(final int id, final int currentValue) { for (ContainerListener containerListener : this.containerListeners) { containerListener.dataChanged(this, id, currentValue); -@@ -450,7 +458,7 @@ public abstract class AbstractContainerMenu { +@@ -449,7 +457,7 @@ public abstract class AbstractContainerMenu { && (this.quickcraftType == QUICKCRAFT_TYPE_CLONE || carriedItemStack.getCount() >= this.quickcraftSlots.size()) && this.canDragTo(slot)) { int carry = slot.hasItem() ? slot.getItem().getCount() : 0; @@ -253,25 +253,26 @@ index 4a177b4e714ba52cc18024d1233c9425afb93741..fa1f7dd22959632aaa54e72c8caf13ea int newCount = Math.min(getQuickCraftPlaceCount(this.quickcraftSlots.size(), this.quickcraftType, source) + carry, maxSize); remaining -= newCount - carry; // slot.setByPlayer(source.copyWithCount(newCount)); -@@ -558,7 +566,7 @@ public abstract class AbstractContainerMenu { - slotx.setByPlayer(carried); +@@ -557,7 +565,7 @@ public abstract class AbstractContainerMenu { + slot.setByPlayer(carried); } } else if (ItemStack.isSameItemSameComponents(clicked, carried)) { -- Optional newCarried = slotx.tryRemove(clicked.getCount(), carried.getMaxStackSize() - carried.getCount(), player); -+ Optional newCarried = slotx.tryRemove(clicked.getCount(), org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(carried) - carried.getCount(), player); // Leaves - item over-stack util +- Optional newCarried = slot.tryRemove(clicked.getCount(), carried.getMaxStackSize() - carried.getCount(), player); ++ Optional newCarried = slot.tryRemove(clicked.getCount(), org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(carried) - carried.getCount(), player); // Leaves - item over-stack util newCarried.ifPresent(itemsTaken -> { carried.grow(itemsTaken.getCount()); - slotx.onTake(player, itemsTaken); -@@ -620,7 +628,7 @@ public abstract class AbstractContainerMenu { - Slot slotx = this.slots.get(slotIndex); - if (slotx.hasItem()) { - ItemStack item = slotx.getItem(); -- this.setCarried(item.copyWithCount(item.getMaxStackSize())); + slot.onTake(player, itemsTaken); +@@ -618,7 +626,8 @@ public abstract class AbstractContainerMenu { + } else if (containerInput == ContainerInput.CLONE && player.hasInfiniteMaterials() && this.getCarried().isEmpty() && slotIndex >= 0) { + Slot slot = this.slots.get(slotIndex); + if (slot.hasItem()) { +- this.setCarried(slot.safeClone(player)); ++ ItemStack item = slot.getItem(); + this.setCarried(item.copyWithCount(org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(item))); // Leaves - item over-stack util } } else if (containerInput == ContainerInput.THROW && this.getCarried().isEmpty() && slotIndex >= 0) { - Slot slotx = this.slots.get(slotIndex); -@@ -655,15 +663,15 @@ public abstract class AbstractContainerMenu { + Slot slot = this.slots.get(slotIndex); +@@ -653,15 +662,15 @@ public abstract class AbstractContainerMenu { int step = buttonNum == 0 ? 1 : -1; for (int pass = 0; pass < 2; pass++) { @@ -290,7 +291,7 @@ index 4a177b4e714ba52cc18024d1233c9425afb93741..fa1f7dd22959632aaa54e72c8caf13ea carried.grow(removed.getCount()); } } -@@ -770,7 +778,7 @@ public abstract class AbstractContainerMenu { +@@ -764,7 +773,7 @@ public abstract class AbstractContainerMenu { destSlot = endSlot - 1; } @@ -299,7 +300,7 @@ index 4a177b4e714ba52cc18024d1233c9425afb93741..fa1f7dd22959632aaa54e72c8caf13ea while (!itemStack.isEmpty() && (backwards ? destSlot >= startSlot : destSlot < endSlot)) { Slot slot = this.slots.get(destSlot); ItemStack target = slot.getItem(); -@@ -871,7 +879,7 @@ public abstract class AbstractContainerMenu { +@@ -865,7 +874,7 @@ public abstract class AbstractContainerMenu { public static boolean canItemQuickReplace(final @Nullable Slot slot, final ItemStack itemStack, final boolean ignoreSize) { boolean slotIsEmpty = slot == null || !slot.hasItem(); return !slotIsEmpty && ItemStack.isSameItemSameComponents(itemStack, slot.getItem()) @@ -308,7 +309,7 @@ index 4a177b4e714ba52cc18024d1233c9425afb93741..fa1f7dd22959632aaa54e72c8caf13ea : slotIsEmpty; } -@@ -879,7 +887,7 @@ public abstract class AbstractContainerMenu { +@@ -873,7 +882,7 @@ public abstract class AbstractContainerMenu { return switch (quickCraftingType) { case 0 -> Mth.floor((float)itemStack.getCount() / quickCraftSlotsSize); case 1 -> 1; @@ -317,17 +318,17 @@ index 4a177b4e714ba52cc18024d1233c9425afb93741..fa1f7dd22959632aaa54e72c8caf13ea default -> itemStack.getCount(); }; } -@@ -902,7 +910,7 @@ public abstract class AbstractContainerMenu { - for (int i = 0; i < container.getContainerSize(); i++) { - ItemStack itemStack = container.getItem(i); - if (!itemStack.isEmpty()) { -- totalPercent += (float)itemStack.getCount() / container.getMaxStackSize(itemStack); -+ totalPercent += org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackSignalStrength(container.getMaxStackSize(), itemStack); // Leaves - item over-stack util - } +@@ -897,7 +906,7 @@ public abstract class AbstractContainerMenu { + for (int i = 0; i < container.getContainerSize(); i++) { + ItemStack itemStack = container.getItem(i); + if (!itemStack.isEmpty()) { +- totalPercent += (float)itemStack.getCount() / container.getMaxStackSize(itemStack); ++ totalPercent += org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackSignalStrength(container.getMaxStackSize(), itemStack); // Leaves - item over-stack util } + } diff --git a/net/minecraft/world/inventory/MerchantContainer.java b/net/minecraft/world/inventory/MerchantContainer.java -index e1b1a261a5f7a3702c1788daa38e7d367195382e..cb95fa63c585b1c3859bfd3e5d4d0e5dd84c7f0d 100644 +index 7c2ab4868dc5bed6a2e444975ef48c68e9a0b6cf..a3500c25b519d7bcff673212eb88d11cee564f53 100644 --- a/net/minecraft/world/inventory/MerchantContainer.java +++ b/net/minecraft/world/inventory/MerchantContainer.java @@ -108,7 +108,7 @@ public class MerchantContainer implements Container { @@ -340,7 +341,7 @@ index e1b1a261a5f7a3702c1788daa38e7d367195382e..cb95fa63c585b1c3859bfd3e5d4d0e5d this.updateSellItem(); } diff --git a/net/minecraft/world/inventory/Slot.java b/net/minecraft/world/inventory/Slot.java -index ee86a63c8d0d4c798ad09da87598d22c0e516840..57061d97bd368bfe934157293471fd546bb105ee 100644 +index 0e86b025bad2c336cc360c2ce764dad0a75de1b6..1873b9376df57ff73d2a1583b60a512cfff7b998 100644 --- a/net/minecraft/world/inventory/Slot.java +++ b/net/minecraft/world/inventory/Slot.java @@ -75,7 +75,7 @@ public class Slot { @@ -353,10 +354,10 @@ index ee86a63c8d0d4c798ad09da87598d22c0e516840..57061d97bd368bfe934157293471fd54 public @Nullable Identifier getNoItemIcon() { diff --git a/net/minecraft/world/item/ItemStack.java b/net/minecraft/world/item/ItemStack.java -index 65d5c766eb9bfade4d8259bda418a7f0e413edbe..b052bc0107d93cd65a6c92914d6b3d02d6cc5ccb 100644 +index ab3e1639410269202c0975c11870319e7eaec8a3..92149f9bf679cf4a486b24b5197470de68e0f424 100644 --- a/net/minecraft/world/item/ItemStack.java +++ b/net/minecraft/world/item/ItemStack.java -@@ -160,7 +160,7 @@ public final class ItemStack implements DataComponentHolder, ItemInstance, Chang +@@ -159,7 +159,7 @@ public final class ItemStack implements DataComponentHolder, ItemInstance, Chang private int popTime; @Deprecated private @Nullable Holder item; @@ -366,17 +367,17 @@ index 65d5c766eb9bfade4d8259bda418a7f0e413edbe..b052bc0107d93cd65a6c92914d6b3d02 public static DataResult validateStrict(final ItemStack itemStack) { DataResult result = validateComponents(itemStack.getComponents()); @@ -185,7 +185,8 @@ public final class ItemStack implements DataComponentHolder, ItemInstance, Chang - } else { - Holder item = Item.STREAM_CODEC.decode(input); - DataComponentPatch patch = patchCodec.decode(input); -- return new ItemStack(item, count, patch); -+ ItemStack stack = new ItemStack(item, count, patch); -+ return org.leavesmc.leaves.util.ItemOverstackUtils.decodeMaxStackSize(stack); // Leaves - item over-stack util - } + + Holder item = Item.STREAM_CODEC.decode(input); + DataComponentPatch patch = patchCodec.decode(input); +- return new ItemStack(item, count, patch); ++ ItemStack stack = new ItemStack(item, count, patch); ++ return org.leavesmc.leaves.util.ItemOverstackUtils.decodeMaxStackSize(stack); // Leaves - item over-stack util } -@@ -194,17 +195,20 @@ public final class ItemStack implements DataComponentHolder, ItemInstance, Chang - if (itemStack.isEmpty() || itemStack.getItem() == null) { // CraftBukkit - NPE fix itemstack.getItem() + @Override +@@ -193,17 +194,20 @@ public final class ItemStack implements DataComponentHolder, ItemInstance, Chang + if (itemStack.isEmpty()) { output.writeVarInt(0); } else { - output.writeVarInt(io.papermc.paper.util.sanitizer.ItemComponentSanitizer.sanitizeCount(io.papermc.paper.util.sanitizer.ItemObfuscationSession.currentSession(), itemStack, itemStack.getCount())); // Paper - potentially sanitize count @@ -401,10 +402,10 @@ index 65d5c766eb9bfade4d8259bda418a7f0e413edbe..b052bc0107d93cd65a6c92914d6b3d02 } }; diff --git a/net/minecraft/world/level/block/CrafterBlock.java b/net/minecraft/world/level/block/CrafterBlock.java -index 15ed625105539f402fb39275b292531fe388a7a0..2b97fd6af1c4956eb173b8c66c2a3efc8772a798 100644 +index f0756f3d277103f95e4d5213b5ae788025b72f42..08c67084b5347bb1d6e65f17f3365ff33b542ec0 100644 --- a/net/minecraft/world/level/block/CrafterBlock.java +++ b/net/minecraft/world/level/block/CrafterBlock.java -@@ -202,7 +202,7 @@ public class CrafterBlock extends BaseEntityBlock { +@@ -203,7 +203,7 @@ public class CrafterBlock extends BaseEntityBlock { Direction direction = blockState.getValue(ORIENTATION).front(); Container into = HopperBlockEntity.getContainerAt(level, pos.relative(direction)); ItemStack remaining = results.copy(); @@ -414,10 +415,10 @@ index 15ed625105539f402fb39275b292531fe388a7a0..2b97fd6af1c4956eb173b8c66c2a3efc org.bukkit.craftbukkit.inventory.CraftItemStack oitemstack = org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(remaining); diff --git a/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java b/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java -index 06d55281bb782cc064255c7b56acd6cd332b9085..d926be9a0c4954746032e3e96cf50a8cba5f26b3 100644 +index ac93d2992fe780133439302ce5b851f9ac0c7353..5c23f48a09a73145ecd2166229b5737c42801db0 100644 --- a/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java +++ b/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java -@@ -397,7 +397,7 @@ public abstract class AbstractFurnaceBlockEntity extends BaseContainerBlockEntit +@@ -395,7 +395,7 @@ public abstract class AbstractFurnaceBlockEntity extends BaseContainerBlockEntit ItemStack oldStack = this.items.get(slot); boolean same = !itemStack.isEmpty() && ItemStack.isSameItemSameComponents(oldStack, itemStack); this.items.set(slot, itemStack); @@ -427,7 +428,7 @@ index 06d55281bb782cc064255c7b56acd6cd332b9085..d926be9a0c4954746032e3e96cf50a8c this.cookingTotalTime = getTotalCookTime(serverLevel, this, this.recipeType, this.cookSpeedMultiplier); // Paper - cook speed multiplier API this.cookingTimer = 0; diff --git a/net/minecraft/world/level/block/entity/BaseContainerBlockEntity.java b/net/minecraft/world/level/block/entity/BaseContainerBlockEntity.java -index 65ca3c97fdd60ebbdd366673c81c4375488f0cde..a7a13fb017a4c98db7639b8d672f3ad9d7814b7f 100644 +index b961ec1532937be513e12e5306a34e6cbff24aee..dbf29f7c085831ce0f62942dc4ea70913fae1b15 100644 --- a/net/minecraft/world/level/block/entity/BaseContainerBlockEntity.java +++ b/net/minecraft/world/level/block/entity/BaseContainerBlockEntity.java @@ -134,7 +134,7 @@ public abstract class BaseContainerBlockEntity extends BlockEntity implements Co @@ -440,7 +441,7 @@ index 65ca3c97fdd60ebbdd366673c81c4375488f0cde..a7a13fb017a4c98db7639b8d672f3ad9 } diff --git a/net/minecraft/world/level/block/entity/HopperBlockEntity.java b/net/minecraft/world/level/block/entity/HopperBlockEntity.java -index 75a8c007ba710aa6e77ba3ed9ae5f7868894629d..d036018ee64995ee754296014888ee70c0ea5ab3 100644 +index 18e6dd47b0525531bae56e0ab3c3846185470ce4..7d35b299533640338aeea6e5617942e89269d048 100644 --- a/net/minecraft/world/level/block/entity/HopperBlockEntity.java +++ b/net/minecraft/world/level/block/entity/HopperBlockEntity.java @@ -155,7 +155,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen diff --git a/lophine-server/minecraft-patches/features/0016-Leaves-Old-raid-behavior.patch b/lophine-server/minecraft-patches/features/0016-Leaves-Old-raid-behavior.patch index e047027..d0c8f4a 100644 --- a/lophine-server/minecraft-patches/features/0016-Leaves-Old-raid-behavior.patch +++ b/lophine-server/minecraft-patches/features/0016-Leaves-Old-raid-behavior.patch @@ -24,10 +24,10 @@ index f58b10c7dec0d2b7dc2b3d1198539b74d13038f3..0a838a2015526dde2cb8d9006a71610e if (raid == null || raid.getRaidOmenLevel() < raid.getMaxRaidOmenLevel()) { player.addEffect(new MobEffectInstance(MobEffects.RAID_OMEN, 600, amplification)); diff --git a/net/minecraft/world/entity/raid/Raid.java b/net/minecraft/world/entity/raid/Raid.java -index 24cc4a15731edcb701596fe7051e188637457e37..5440dc0fb8bccabb65fd9681ab368ef5028e2ca9 100644 +index 32e20979b9343efa6b5903c7b6baf351205654a0..4ddc34822e88b011f58c70ca4f14e7a17912b714 100644 --- a/net/minecraft/world/entity/raid/Raid.java +++ b/net/minecraft/world/entity/raid/Raid.java -@@ -268,7 +268,7 @@ public class Raid { +@@ -269,7 +269,7 @@ public class Raid { } public boolean absorbRaidOmen(final ServerPlayer player) { @@ -35,8 +35,8 @@ index 24cc4a15731edcb701596fe7051e188637457e37..5440dc0fb8bccabb65fd9681ab368ef5 + MobEffectInstance effect = player.getEffect(fun.bm.lophine.config.modules.function.OldFeatureConfig.oldRaidBehavior ? MobEffects.BAD_OMEN : MobEffects.RAID_OMEN); // Leaves - old Raid Behavior if (effect == null) { return false; - } else { -@@ -345,7 +345,13 @@ public class Raid { + } +@@ -346,7 +346,13 @@ public class Raid { } if (shouldTryToFindSpawnPos) { @@ -51,7 +51,7 @@ index 24cc4a15731edcb701596fe7051e188637457e37..5440dc0fb8bccabb65fd9681ab368ef5 } if (this.raidCooldownTicks == 300 || this.raidCooldownTicks % 20 == 0) { -@@ -400,7 +406,14 @@ public class Raid { +@@ -401,7 +407,14 @@ public class Raid { int attempt = 0; while (this.shouldSpawnGroup()) { @@ -67,7 +67,7 @@ index 24cc4a15731edcb701596fe7051e188637457e37..5440dc0fb8bccabb65fd9681ab368ef5 if (spawnPos != null) { this.started = true; this.spawnGroup(level, spawnPos); -@@ -412,7 +425,7 @@ public class Raid { +@@ -413,7 +426,7 @@ public class Raid { attempt++; } @@ -76,7 +76,7 @@ index 24cc4a15731edcb701596fe7051e188637457e37..5440dc0fb8bccabb65fd9681ab368ef5 org.bukkit.craftbukkit.event.CraftEventFactory.callRaidStopEvent(level, this, org.bukkit.event.raid.RaidStopEvent.Reason.UNSPAWNABLE); // CraftBukkit this.stop(); break; -@@ -716,7 +729,7 @@ public class Raid { +@@ -717,7 +730,7 @@ public class Raid { int spawnX = this.center.getX() + Mth.floor(Mth.cos(angle) * 32.0F * howFar) + this.random.nextInt(3) * Mth.floor(howFar); int spawnZ = this.center.getZ() + Mth.floor(Mth.sin(angle) * 32.0F * howFar) + this.random.nextInt(3) * Mth.floor(howFar); int spawnY = level.getHeight(Heightmap.Types.WORLD_SURFACE, spawnX, spawnZ); @@ -85,7 +85,7 @@ index 24cc4a15731edcb701596fe7051e188637457e37..5440dc0fb8bccabb65fd9681ab368ef5 spawnPos.set(spawnX, spawnY, spawnZ); if (!level.isVillage(spawnPos) || secondsRemaining <= 7) { int delta = 10; -@@ -899,4 +912,42 @@ public class Raid { +@@ -900,4 +913,42 @@ public class Raid { this.spawnsPerWaveBeforeBonus = spawnsPerWaveBeforeBonus; } } @@ -95,7 +95,7 @@ index 24cc4a15731edcb701596fe7051e188637457e37..5440dc0fb8bccabb65fd9681ab368ef5 + private BlockPos getRavagerSpawnLocation(final ServerLevel serverWorld, final int proximity, final int tries) { + int i = proximity == 0 ? 2 : 2 - proximity; + BlockPos.MutableBlockPos mutable = new BlockPos.MutableBlockPos(); -+ net.minecraft.world.entity.SpawnPlacementType spawnLocation = net.minecraft.world.entity.SpawnPlacements.getPlacementType(EntityType.RAVAGER); ++ net.minecraft.world.entity.SpawnPlacementType spawnLocation = net.minecraft.world.entity.SpawnPlacements.getPlacementType(EntityTypes.RAVAGER); + for (int j = 0; j < tries; j++) { + float f = serverWorld.getRandom().nextFloat() * (float) (Math.PI * 2); + int k = this.center.getX() + Mth.floor(Mth.cos(f) * 32.0F * (float) i + serverWorld.getRandom().nextInt(5)); @@ -107,7 +107,7 @@ index 24cc4a15731edcb701596fe7051e188637457e37..5440dc0fb8bccabb65fd9681ab368ef5 + } + if (serverWorld.hasChunksAt(mutable.getX() - 10, mutable.getZ() - 10, mutable.getX() + 10, mutable.getZ() + 10) + && serverWorld.isPositionEntityTicking(mutable) -+ && (spawnLocation.isSpawnPositionOk(serverWorld, mutable, EntityType.RAVAGER) ++ && (spawnLocation.isSpawnPositionOk(serverWorld, mutable, EntityTypes.RAVAGER) + || serverWorld.getBlockState(mutable.below()).is(net.minecraft.world.level.block.Blocks.SNOW) + && serverWorld.getBlockState(mutable).isAir()) + ) { @@ -129,10 +129,10 @@ index 24cc4a15731edcb701596fe7051e188637457e37..5440dc0fb8bccabb65fd9681ab368ef5 + // Leaves end - old FindSpawnPosition } diff --git a/net/minecraft/world/entity/raid/Raider.java b/net/minecraft/world/entity/raid/Raider.java -index bc2edc48ddefaab9022029f1a913a40b72e06024..1a51da9171c13711e106731c360051d183a40893 100644 +index 7e969cd81d2ac788515f4d9ad7584ade4c684a42..7555f0c5edf6a5419018203487cf8941e8095cb5 100644 --- a/net/minecraft/world/entity/raid/Raider.java +++ b/net/minecraft/world/entity/raid/Raider.java -@@ -128,6 +128,42 @@ public abstract class Raider extends PatrollingMonster { +@@ -129,6 +129,42 @@ public abstract class Raider extends PatrollingMonster { raidWhenKilled.removeFromRaid(serverLevel, this, false); } diff --git a/lophine-server/minecraft-patches/features/0017-Compatibility-fix-for-Raid-Revert-and-Cross-Region-D.patch b/lophine-server/minecraft-patches/features/0017-Compatibility-fix-for-Raid-Revert-and-Cross-Region-D.patch index a0abd99..ab8e010 100644 --- a/lophine-server/minecraft-patches/features/0017-Compatibility-fix-for-Raid-Revert-and-Cross-Region-D.patch +++ b/lophine-server/minecraft-patches/features/0017-Compatibility-fix-for-Raid-Revert-and-Cross-Region-D.patch @@ -6,11 +6,11 @@ Subject: [PATCH] Compatibility fix for Raid Revert and Cross Region Damage diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java -index cc7b2ea7fda1326e3f9ed46373190a05f60c4d34..2bce20202b7c539bee3685741663a8ed225919ff 100644 +index 5762eed9e99d918bee02d77c0ddd70be0aa0e2ec..cb1589e3aa663ca058fb5c3a24da700d4482cf35 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java -@@ -1234,6 +1234,30 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin - } +@@ -1231,6 +1231,30 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin + return changed; } + // Lophine Start - raid revert adapt Cross Region Damage trace @@ -41,10 +41,10 @@ index cc7b2ea7fda1326e3f9ed46373190a05f60c4d34..2bce20202b7c539bee3685741663a8ed if (this.is(EntityTypeTags.IMMUNE_TO_INFESTED)) { return !newEffect.is(MobEffects.INFESTED); diff --git a/net/minecraft/world/entity/raid/Raider.java b/net/minecraft/world/entity/raid/Raider.java -index 1a51da9171c13711e106731c360051d183a40893..7094a67959e9747b2dfa55a5f5a3e90552d35466 100644 +index 7555f0c5edf6a5419018203487cf8941e8095cb5..44f8302a8c3fb867f122a97dc29f24a311f0ad91 100644 --- a/net/minecraft/world/entity/raid/Raider.java +++ b/net/minecraft/world/entity/raid/Raider.java -@@ -158,7 +158,7 @@ public abstract class Raider extends PatrollingMonster { +@@ -159,7 +159,7 @@ public abstract class Raider extends PatrollingMonster { net.minecraft.world.effect.MobEffectInstance mobeffect1 = new net.minecraft.world.effect.MobEffectInstance(net.minecraft.world.effect.MobEffects.BAD_OMEN, 120000, amp, false, false, true); if (serverLevel.getGameRules().get(net.minecraft.world.level.gamerules.GameRules.RAIDS)) { diff --git a/lophine-server/minecraft-patches/features/0018-Leaves-Leaves-Base-Protocol-Core.patch b/lophine-server/minecraft-patches/features/0018-Leaves-Leaves-Base-Protocol-Core.patch index ce7f26c..deaf758 100644 --- a/lophine-server/minecraft-patches/features/0018-Leaves-Leaves-Base-Protocol-Core.patch +++ b/lophine-server/minecraft-patches/features/0018-Leaves-Leaves-Base-Protocol-Core.patch @@ -8,7 +8,7 @@ As a part of : Leaves (https://github.com/LeavesMC/Leaves/blob/9d2bd3f7b0a48f00d Licensed under: GPL-3.0 (https://www.gnu.org/licenses/gpl-3.0.html) diff --git a/net/minecraft/network/protocol/common/custom/CustomPacketPayload.java b/net/minecraft/network/protocol/common/custom/CustomPacketPayload.java -index e9f86409bf9351e85ed31e747d9350dbf0cc441f..1f8f4d979d8766d6ba385f74cf8fcf8eea6c56c7 100644 +index 08e253662a2c183c0ab53a51cc07485cff33bf2c..1bd678d668a1febc129f4cb4d0d95ea27acc4252 100644 --- a/net/minecraft/network/protocol/common/custom/CustomPacketPayload.java +++ b/net/minecraft/network/protocol/common/custom/CustomPacketPayload.java @@ -40,13 +40,22 @@ public interface CustomPacketPayload { @@ -36,10 +36,10 @@ index e9f86409bf9351e85ed31e747d9350dbf0cc441f..1f8f4d979d8766d6ba385f74cf8fcf8e }; } diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java -index 82013a8f7cf07b6f0645ca6b51ee75fcb0a56298..54ba8a2bc70f3a7f9754a872f6b9c22b40887d8e 100644 +index fb9b0cb1b8b1fd6c5666a3990a4e74824d4bef7e..3234e9b00a20faa521618ae5e2f9dbb99868d377 100644 --- a/net/minecraft/server/MinecraftServer.java +++ b/net/minecraft/server/MinecraftServer.java -@@ -2037,6 +2037,8 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop { // Paper start - Fix villager boat exploit @@ -34,7 +34,7 @@ index deb029c5621f793f63447d351526c31fab5ec12c..6148e7e5978a9a5b7d7f90b58b86b016 if (human != null) { villager.setTradingPlayer(null); diff --git a/net/minecraft/world/inventory/MerchantMenu.java b/net/minecraft/world/inventory/MerchantMenu.java -index 1dd82dfa739957f00d51c8b987289a002815f622..85a329565119d376139a7449e538c0d83dfb079f 100644 +index 5979e3856da1287f4513c984c0414952bfeb3ea2..d12db44b0fb165280642d2f6016869ce54f3a1db 100644 --- a/net/minecraft/world/inventory/MerchantMenu.java +++ b/net/minecraft/world/inventory/MerchantMenu.java @@ -74,6 +74,7 @@ public class MerchantMenu extends AbstractContainerMenu { diff --git a/lophine-server/minecraft-patches/features/0020-Leaves-Servux-Protocol.patch b/lophine-server/minecraft-patches/features/0020-Leaves-Servux-Protocol.patch index 54b3b44..b2c2b1a 100644 --- a/lophine-server/minecraft-patches/features/0020-Leaves-Servux-Protocol.patch +++ b/lophine-server/minecraft-patches/features/0020-Leaves-Servux-Protocol.patch @@ -8,7 +8,7 @@ As a part of : Leaves (https://github.com/LeavesMC/Leaves/blob/ea91106ae57fc4cc1 Licensed under: GPL-3.0 (https://www.gnu.org/licenses/gpl-3.0.html) diff --git a/net/minecraft/server/ServerTickRateManager.java b/net/minecraft/server/ServerTickRateManager.java -index ca35415e152dc63cb9f4ae8da8b06766600922fd..033715812acb8f98a7c7d895d115043e232d5161 100644 +index 8432d0ce22ddc9c9bfa98901e403697f40e53c99..9ec141359c4422c1574dac71a88b7f5043350901 100644 --- a/net/minecraft/server/ServerTickRateManager.java +++ b/net/minecraft/server/ServerTickRateManager.java @@ -139,4 +139,10 @@ public class ServerTickRateManager extends TickRateManager { @@ -23,10 +23,10 @@ index ca35415e152dc63cb9f4ae8da8b06766600922fd..033715812acb8f98a7c7d895d115043e + // Leaves end - servux } diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java -index 006844d6fda43f3b151899655f03b1de03f3396c..0befa4fc81e10a23c6ba824e559f2fb4886e68ee 100644 +index bd3821942079118e20d808b5e865b74f6c69e7af..e1298bbb83d1d31406c47eaf6d10db3e8d8611ea 100644 --- a/net/minecraft/server/level/ServerLevel.java +++ b/net/minecraft/server/level/ServerLevel.java -@@ -2584,6 +2584,8 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet +@@ -2594,6 +2594,8 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet this.server.updateEffectiveRespawnData(); } // Paper end diff --git a/lophine-server/minecraft-patches/features/0021-LeavesHooks.patch b/lophine-server/minecraft-patches/features/0021-LeavesHooks.patch index 0d1ac85..c8695e0 100644 --- a/lophine-server/minecraft-patches/features/0021-LeavesHooks.patch +++ b/lophine-server/minecraft-patches/features/0021-LeavesHooks.patch @@ -5,7 +5,7 @@ Subject: [PATCH] LeavesHooks diff --git a/ca/spottedleaf/moonrise/paper/PaperHooks.java b/ca/spottedleaf/moonrise/paper/PaperHooks.java -index d097b889499a8e410839e8f69d99dc9adfa2488b..b97d65b81ec4b86e00b7c06341b40dc5c02b9044 100644 +index b5e6a537497660dcdc87e8a0420add23859fc00f..781c1318df32f0fec1f0040c090678087512a60d 100644 --- a/ca/spottedleaf/moonrise/paper/PaperHooks.java +++ b/ca/spottedleaf/moonrise/paper/PaperHooks.java @@ -29,7 +29,7 @@ import net.minecraft.world.phys.AABB; diff --git a/lophine-server/minecraft-patches/features/0022-Leaves-Old-Explosion-Damage-Calculator.patch b/lophine-server/minecraft-patches/features/0022-Leaves-Old-Explosion-Damage-Calculator.patch index f20645a..770a819 100644 --- a/lophine-server/minecraft-patches/features/0022-Leaves-Old-Explosion-Damage-Calculator.patch +++ b/lophine-server/minecraft-patches/features/0022-Leaves-Old-Explosion-Damage-Calculator.patch @@ -8,13 +8,13 @@ As a part of : Leaves (https://github.com/LeavesMC/Leaves/blob/3e96b237749a960f2 Licensed under: GPL-3.0 (https://www.gnu.org/licenses/gpl-3.0.html) diff --git a/net/minecraft/world/level/ServerExplosion.java b/net/minecraft/world/level/ServerExplosion.java -index 769dc39e11881d5f81a2405850cbcbd0842c5995..9fc97e8b01f66ada6af1fe76f4e27c9bb1a5dcfc 100644 +index b712d7babed4941d11cf716133c8a07c5bcd51a3..b90077b44ce81d5d60f9d0ad2414f0b7c6b1e720 100644 --- a/net/minecraft/world/level/ServerExplosion.java +++ b/net/minecraft/world/level/ServerExplosion.java @@ -708,6 +708,7 @@ public class ServerExplosion implements Explosion { public boolean shouldAffectBlocklikeEntities() { boolean mobGriefingEnabled = this.level.getGameRules().get(GameRules.MOB_GRIEFING); - boolean isNotWindCharge = this.source == null || !this.source.is(EntityType.BREEZE_WIND_CHARGE) && !this.source.is(EntityType.WIND_CHARGE); + boolean isNotWindCharge = this.source == null || !this.source.is(EntityTypes.BREEZE_WIND_CHARGE) && !this.source.is(EntityTypes.WIND_CHARGE); + if (fun.bm.lophine.config.modules.function.OldFeatureConfig.oldExplosionDamageCalculator) isNotWindCharge = isNotWindCharge && (this.source == null || !this.source.isInWater()); // Leaves - Old MC TNT wet explosion no item damage return mobGriefingEnabled ? isNotWindCharge : this.blockInteraction.shouldAffectBlocklikeEntities() && isNotWindCharge; } diff --git a/lophine-server/minecraft-patches/features/0023-Leaves-Redstone-Shears-Wrench.patch b/lophine-server/minecraft-patches/features/0023-Leaves-Redstone-Shears-Wrench.patch index f1dd369..fc137ca 100644 --- a/lophine-server/minecraft-patches/features/0023-Leaves-Redstone-Shears-Wrench.patch +++ b/lophine-server/minecraft-patches/features/0023-Leaves-Redstone-Shears-Wrench.patch @@ -8,7 +8,7 @@ As a part of : Leaves (https://github.com/LeavesMC/Leaves/blob/79d9ef74c2684eb49 Licensed under: GPL-3.0 (https://www.gnu.org/licenses/gpl-3.0.html) diff --git a/net/minecraft/world/item/ShearsItem.java b/net/minecraft/world/item/ShearsItem.java -index 837f8c56bf5d68dd8bfbeca8ae1b66be8316ddea..1098695e646c20f47bc4739034fcb69b96909667 100644 +index 9750a2a7f6d13f93119d0c6fba0bf11064d46e55..1913b30f1bfe013261b340fdf9917db90c98c695 100644 --- a/net/minecraft/world/item/ShearsItem.java +++ b/net/minecraft/world/item/ShearsItem.java @@ -80,7 +80,10 @@ public class ShearsItem extends Item { diff --git a/lophine-server/minecraft-patches/features/0024-Leaves-Syncmatica-Protocol.patch b/lophine-server/minecraft-patches/features/0024-Leaves-Syncmatica-Protocol.patch index 14d8ff8..aba6b10 100644 --- a/lophine-server/minecraft-patches/features/0024-Leaves-Syncmatica-Protocol.patch +++ b/lophine-server/minecraft-patches/features/0024-Leaves-Syncmatica-Protocol.patch @@ -9,15 +9,15 @@ As a part of : Leaves (https://github.com/LeavesMC/Leaves) Licensed under: GPL-3.0 (https://www.gnu.org/licenses/gpl-3.0.html) diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index e15be199d690954d99d710de4046e721a943b3a9..0eae303f8959345571a906906ef60c6a28bba348 100644 +index 57d95a22043cc0e229e302700a75fdc5e2d341b6..a095cd480e6e86806defb17f11e4758bd96c21f9 100644 --- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -346,9 +346,12 @@ public class ServerGamePacketListenerImpl +@@ -348,9 +348,12 @@ public class ServerGamePacketListenerImpl this.signedMessageDecoder = SignedMessageChain.Decoder.unsigned(player.getUUID(), server::enforceSecureProfile); this.chatMessageChain = new FutureChain(server.chatExecutor); // CraftBukkit - async chat this.tickEndEvent = new io.papermc.paper.event.packet.ClientTickEndEvent(player.getBukkitEntity()); // Paper - add client tick end event + this.exchangeTarget = new org.leavesmc.leaves.protocol.syncmatica.exchange.ExchangeTarget(this); // Leaves - Syncmatica Protocol - this.playerGameConnection = new io.papermc.paper.connection.PaperPlayerGameConnection(this); // Paper + this.playerGameConnection = new io.papermc.paper.connection.PaperPlayerGameConnection(this); // Paper } + public final org.leavesmc.leaves.protocol.syncmatica.exchange.ExchangeTarget exchangeTarget; // Leaves - Syncmatica Protocol diff --git a/lophine-server/minecraft-patches/features/0025-Leaves-BBOR-Protocol.patch b/lophine-server/minecraft-patches/features/0025-Leaves-BBOR-Protocol.patch index 56ce357..4484c06 100644 --- a/lophine-server/minecraft-patches/features/0025-Leaves-BBOR-Protocol.patch +++ b/lophine-server/minecraft-patches/features/0025-Leaves-BBOR-Protocol.patch @@ -8,10 +8,10 @@ As a part of : Leaves (https://github.com/LeavesMC/Leaves) Licensed under: GPL-3.0 (https://www.gnu.org/licenses/gpl-3.0.html) diff --git a/net/minecraft/world/level/chunk/LevelChunk.java b/net/minecraft/world/level/chunk/LevelChunk.java -index da9706f866aabee6939cacbfbcc9def01fde0326..3708f9ffc46a5b1c038c0e7b2ce84802e2b22397 100644 +index 6ac3e584cd62175965368c7d7428a7bd9125c2cf..1affb71bb629f5c8923cc2993052c8037ead9798 100644 --- a/net/minecraft/world/level/chunk/LevelChunk.java +++ b/net/minecraft/world/level/chunk/LevelChunk.java -@@ -772,6 +772,11 @@ public class LevelChunk extends ChunkAccess implements DebugValueSource, ca.spot +@@ -770,6 +770,11 @@ public class LevelChunk extends ChunkAccess implements DebugValueSource, ca.spot public void setLoaded(final boolean loaded) { this.loaded = loaded; diff --git a/lophine-server/minecraft-patches/features/0026-Leaves-Xaero-Map-Protocol.patch b/lophine-server/minecraft-patches/features/0026-Leaves-Xaero-Map-Protocol.patch index 105a69f..b0f8b68 100644 --- a/lophine-server/minecraft-patches/features/0026-Leaves-Xaero-Map-Protocol.patch +++ b/lophine-server/minecraft-patches/features/0026-Leaves-Xaero-Map-Protocol.patch @@ -8,7 +8,7 @@ As a part of : Leaves (https://github.com/LeavesMC/Leaves) Licensed under: GPL-3.0 (https://www.gnu.org/licenses/gpl-3.0.html) diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java -index 6148e7e5978a9a5b7d7f90b58b86b0166fd16c9d..16d01fcb97aa3dbd7554bd64b3608c6e80ce3dbd 100644 +index d94a69c7d836a45c7b3cfa0add97448581d30e7c..bb3049ed94088337f18f2373f97846b2f0add8f1 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java @@ -1107,6 +1107,7 @@ public abstract class PlayerList { diff --git a/lophine-server/minecraft-patches/features/0027-Leaves-Support-REI-protocol.patch b/lophine-server/minecraft-patches/features/0027-Leaves-Support-REI-protocol.patch index d3c40e9..dea9865 100644 --- a/lophine-server/minecraft-patches/features/0027-Leaves-Support-REI-protocol.patch +++ b/lophine-server/minecraft-patches/features/0027-Leaves-Support-REI-protocol.patch @@ -25,7 +25,7 @@ index 33f9870a4f966a887023b1debd4ab9ef9d24378f..89983e7da244434a5346b23b49c74834 @Override public org.bukkit.inventory.Recipe toBukkitRecipe(org.bukkit.NamespacedKey id) { diff --git a/net/minecraft/world/item/crafting/SmithingTrimRecipe.java b/net/minecraft/world/item/crafting/SmithingTrimRecipe.java -index f9fa7d0eaf9f32959a4bd12b82e5a49ea808a44c..2f3241563ad7e5ed5663b913671d2af056df97bb 100644 +index 93347bd9fbab41888c5d63eb40e7928e74a1f9af..4f9e700ed621cdb556162174bbb9b219403fc05a 100644 --- a/net/minecraft/world/item/crafting/SmithingTrimRecipe.java +++ b/net/minecraft/world/item/crafting/SmithingTrimRecipe.java @@ -109,6 +109,12 @@ public class SmithingTrimRecipe extends SimpleSmithingRecipe { diff --git a/lophine-server/minecraft-patches/features/0028-Leaves-Jade-Protocol.patch b/lophine-server/minecraft-patches/features/0028-Leaves-Jade-Protocol.patch index 5c285a1..048f600 100644 --- a/lophine-server/minecraft-patches/features/0028-Leaves-Jade-Protocol.patch +++ b/lophine-server/minecraft-patches/features/0028-Leaves-Jade-Protocol.patch @@ -9,10 +9,10 @@ As a part of : Leaves (https://github.com/LeavesMC/Leaves) Licensed under: GPL-3.0 (https://www.gnu.org/licenses/gpl-3.0.html) diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 0eae303f8959345571a906906ef60c6a28bba348..1af966cadec3dd51aae842824e432e20b700d9c9 100644 +index a095cd480e6e86806defb17f11e4758bd96c21f9..5d779fd6febf51fa5c7d92e1410dc95008819c58 100644 --- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -3902,7 +3902,7 @@ public class ServerGamePacketListenerImpl +@@ -3888,7 +3888,7 @@ public class ServerGamePacketListenerImpl } @Deprecated @io.papermc.paper.annotation.DoNotUse // Paper - Add PlayerLoadedWorldEvent @@ -22,10 +22,10 @@ index 0eae303f8959345571a906906ef60c6a28bba348..1af966cadec3dd51aae842824e432e20 this.markClientLoaded(false); } diff --git a/net/minecraft/world/entity/animal/armadillo/Armadillo.java b/net/minecraft/world/entity/animal/armadillo/Armadillo.java -index 03ec05a860781f85e58055d6f58893963781bd97..c15f0a3d419fea50d4349fa864e83bf7fee78b9f 100644 +index c8c50683597a2314a3c0e72888d5d75dc73fb94a..3663aa490106b05772574ae7c4ac9d4d84574e79 100644 --- a/net/minecraft/world/entity/animal/armadillo/Armadillo.java +++ b/net/minecraft/world/entity/animal/armadillo/Armadillo.java -@@ -72,7 +72,7 @@ public class Armadillo extends Animal { +@@ -75,7 +75,7 @@ public class Armadillo extends Animal { public final AnimationState rollOutAnimationState = new AnimationState(); public final AnimationState rollUpAnimationState = new AnimationState(); public final AnimationState peekAnimationState = new AnimationState(); @@ -35,10 +35,10 @@ index 03ec05a860781f85e58055d6f58893963781bd97..c15f0a3d419fea50d4349fa864e83bf7 public Armadillo(final EntityType type, final Level level) { diff --git a/net/minecraft/world/entity/animal/frog/Tadpole.java b/net/minecraft/world/entity/animal/frog/Tadpole.java -index 3d4bfeae2fddb9ace26e7dea8870704d8309862b..d2862d2e6f599265bc319000bba05609e0bea2c3 100644 +index 296cae1d5f5a3a054949ee03e2a2552bfeae4682..97c49875269dd52c6a4692940b122f1d1f3fd2fb 100644 --- a/net/minecraft/world/entity/animal/frog/Tadpole.java +++ b/net/minecraft/world/entity/animal/frog/Tadpole.java -@@ -255,7 +255,7 @@ public class Tadpole extends AbstractFish { +@@ -256,7 +256,7 @@ public class Tadpole extends AbstractFish { } } @@ -48,10 +48,10 @@ index 3d4bfeae2fddb9ace26e7dea8870704d8309862b..d2862d2e6f599265bc319000bba05609 } diff --git a/net/minecraft/world/level/storage/loot/LootPool.java b/net/minecraft/world/level/storage/loot/LootPool.java -index f08a25b76e689c2242e8ef8226c3d8c2dcec1c70..6e76e472bd1e7242f6cd7986c23ebc38d16fd46a 100644 +index dde475b92375a484cb10a7de5a1256b0741ae5c6..c216b1e047a515a69a0974586a4cd0b536544c66 100644 --- a/net/minecraft/world/level/storage/loot/LootPool.java +++ b/net/minecraft/world/level/storage/loot/LootPool.java -@@ -36,7 +36,7 @@ public class LootPool implements Validatable { +@@ -37,7 +37,7 @@ public class LootPool implements Validatable { ) .apply(i, LootPool::new) ); diff --git a/lophine-server/minecraft-patches/features/0029-Leaves-Alternative-block-placement-Protocol.patch b/lophine-server/minecraft-patches/features/0029-Leaves-Alternative-block-placement-Protocol.patch index f4240f0..a3fc65f 100644 --- a/lophine-server/minecraft-patches/features/0029-Leaves-Alternative-block-placement-Protocol.patch +++ b/lophine-server/minecraft-patches/features/0029-Leaves-Alternative-block-placement-Protocol.patch @@ -13,10 +13,10 @@ MasaGadget(https://github.com/plusls/MasaGadget) litematica(https://github.com/maruohon/litematica) diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 1af966cadec3dd51aae842824e432e20b700d9c9..83c9418ea45b8d7f639c6bf5e134bad90d9ac039 100644 +index 5d779fd6febf51fa5c7d92e1410dc95008819c58..b5e19220cd137c91ee992aa011593d625f741222 100644 --- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -2183,7 +2183,7 @@ public class ServerGamePacketListenerImpl +@@ -2157,7 +2157,7 @@ public class ServerGamePacketListenerImpl if (ca.spottedleaf.moonrise.common.util.TickThread.isTickThreadFor(this.player.level(), pos.getX() >> 4, pos.getZ() >> 4, 8) && this.player.isWithinBlockInteractionRange(pos, 1.0)) { // Folia - do not allow players to interact with blocks outside the current region Vec3 distance = location.subtract(Vec3.atCenterOf(pos)); double limit = 1.0000001; @@ -26,10 +26,10 @@ index 1af966cadec3dd51aae842824e432e20b700d9c9..83c9418ea45b8d7f639c6bf5e134bad9 this.player.resetLastActionTime(); int maxY = level.getMaxY(); diff --git a/net/minecraft/world/item/BlockItem.java b/net/minecraft/world/item/BlockItem.java -index 3167be4b7c2c61ef725af4a832d759ab6e061af0..2e2a8af12f249ec5bd0935fd13f5acbd0a777b5f 100644 +index 2da4fd153b3de6e97ef264062b40855aa620ec14..f4b68c02c2beea4438cb4cd212ad70c78cfc68d3 100644 --- a/net/minecraft/world/item/BlockItem.java +++ b/net/minecraft/world/item/BlockItem.java -@@ -136,7 +136,7 @@ public class BlockItem extends Item { +@@ -138,7 +138,7 @@ public class BlockItem extends Item { } protected @Nullable BlockState getPlacementState(final BlockPlaceContext context) { @@ -39,7 +39,7 @@ index 3167be4b7c2c61ef725af4a832d759ab6e061af0..2e2a8af12f249ec5bd0935fd13f5acbd } diff --git a/net/minecraft/world/item/StandingAndWallBlockItem.java b/net/minecraft/world/item/StandingAndWallBlockItem.java -index d5d499226d0b2c2adfae7bbb4c28c96c80411c44..cb0a4a9865df69e5504a86de6c144bc4450bd19a 100644 +index bb352c44fa951367907ebe403c59f03f3c21786f..1f17f966882320b3a2ced50b3f73925cd0dfa14c 100644 --- a/net/minecraft/world/item/StandingAndWallBlockItem.java +++ b/net/minecraft/world/item/StandingAndWallBlockItem.java @@ -26,14 +26,14 @@ public class StandingAndWallBlockItem extends BlockItem { @@ -60,10 +60,10 @@ index d5d499226d0b2c2adfae7bbb4c28c96c80411c44..cb0a4a9865df69e5504a86de6c144bc4 stateForPlacement = possibleState; break; diff --git a/net/minecraft/world/level/block/Block.java b/net/minecraft/world/level/block/Block.java -index c5f4e0570a82dfcc2ba88023f3301f69afa41cc5..30f7e8f5e3e9440713e36ee25c90150b6b93c6ff 100644 +index 1af396a051cc47dccb973ca864cf1ec2e8b756ed..64066a091628ad00d914043ae7ecd8bd29d85e5e 100644 --- a/net/minecraft/world/level/block/Block.java +++ b/net/minecraft/world/level/block/Block.java -@@ -516,6 +516,32 @@ public class Block extends BlockBehaviour implements ItemLike { +@@ -517,6 +517,32 @@ public class Block extends BlockBehaviour implements ItemLike { public void stepOn(final Level level, final BlockPos pos, final BlockState onState, final Entity entity) { } diff --git a/lophine-server/minecraft-patches/features/0030-Leaves-Fakeplayer.patch b/lophine-server/minecraft-patches/features/0030-Leaves-Fakeplayer.patch index 751df7b..0277f3a 100644 --- a/lophine-server/minecraft-patches/features/0030-Leaves-Fakeplayer.patch +++ b/lophine-server/minecraft-patches/features/0030-Leaves-Fakeplayer.patch @@ -7,20 +7,20 @@ Co-authored by: violetc <58360096+s-yh-china@users.noreply.github.com> As a part of : Leaves (https://github.com/LeavesMC/Leaves) Licensed under: GPL-3.0 (https://www.gnu.org/licenses/gpl-3.0.html) -diff --git a/net/minecraft/advancements/criterion/SimpleCriterionTrigger.java b/net/minecraft/advancements/criterion/SimpleCriterionTrigger.java -index dfce5ced082de0caaff8da071fb632cd6ae787c9..d5c1862ebf6066859da74f47fa0be0256ba0f653 100644 ---- a/net/minecraft/advancements/criterion/SimpleCriterionTrigger.java -+++ b/net/minecraft/advancements/criterion/SimpleCriterionTrigger.java -@@ -41,6 +41,7 @@ public abstract class SimpleCriterionTrigger implements CriterionTrigger { protected void trigger(final ServerPlayer player, final Predicate matcher) { + if (player instanceof org.leavesmc.leaves.bot.ServerBot) return; // Leaves - bot skip PlayerAdvancements advancements = player.getAdvancements(); - Set> allListeners = (Set) advancements.criterionData.get(this); // Paper - fix PlayerAdvancements leak - if (allListeners != null && !allListeners.isEmpty()) { + Map listenersForType = advancements.getTriggerMapForType(this); + if (listenersForType != null && !listenersForType.isEmpty()) { diff --git a/net/minecraft/network/Connection.java b/net/minecraft/network/Connection.java -index efbbc1a40d203a2818eeda2a4e938b9a6117f1c3..6b85a5ad9af0c57a0d4d5b55f62b82c5ff69b0e8 100644 +index d2e9d46bbd9ee4ce45419b11499d7a7bc50f0219..848967dbe41694411603ef369cfdc3a0b00240d3 100644 --- a/net/minecraft/network/Connection.java +++ b/net/minecraft/network/Connection.java @@ -74,7 +74,7 @@ public class Connection extends SimpleChannelInboundHandler> { @@ -30,30 +30,30 @@ index efbbc1a40d203a2818eeda2a4e938b9a6117f1c3..6b85a5ad9af0c57a0d4d5b55f62b82c5 - private volatile @Nullable PacketListener packetListener; + protected volatile @Nullable PacketListener packetListener; // Leaves - private -> protected private @Nullable DisconnectionDetails disconnectionDetails; - private boolean encrypted; private final java.util.concurrent.atomic.AtomicBoolean disconnectionHandled = new java.util.concurrent.atomic.AtomicBoolean(false); // Folia - region threading - may be called concurrently during configuration stage + private int receivedPackets; diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java -index 54ba8a2bc70f3a7f9754a872f6b9c22b40887d8e..c4685bb540e95d889dfbc107923876045be29848 100644 +index 3234e9b00a20faa521618ae5e2f9dbb99868d377..f6ace71d151d428149e8c9615c3b91e0f213ae7c 100644 --- a/net/minecraft/server/MinecraftServer.java +++ b/net/minecraft/server/MinecraftServer.java -@@ -297,6 +297,8 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop S spin(final Function factory) { - ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry.init(); // Paper - rewrite data converter system AtomicReference serverReference = new AtomicReference<>(); -@@ -1226,6 +1228,16 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop serverReference.get().runServer(), "Server thread"); +@@ -1190,6 +1192,16 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 0) { // Folia - region threading - this is complicated to implement, and even if done correctly is messy @@ -71,7 +71,7 @@ index 54ba8a2bc70f3a7f9754a872f6b9c22b40887d8e..c4685bb540e95d889dfbc10792387604 this.emptyTicks++; } else { this.emptyTicks = 0; -@@ -1827,6 +1839,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 0) { this.playerList.saveAll(playerSaveInterval); @@ -79,7 +79,7 @@ index 54ba8a2bc70f3a7f9754a872f6b9c22b40887d8e..c4685bb540e95d889dfbc10792387604 } if (region == null && fullSave) { // Folia - region threading - don't auto save level data this.saveGlobalData(false); -@@ -2065,6 +2078,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop Component.translatable("commands.kick.success", player.getDisplayName(), reason), true); +@@ -50,7 +58,13 @@ public class KickCommand { + } + + if (count == 0) { +- throw ERROR_KICKING_OWNER.create(); ++ // Leaves start - disable kick ++ if (hasBot) { ++ return count; ++ } else { ++ throw ERROR_KICKING_OWNER.create(); ++ } ++ // Leaves end - disable kick } else { -+ boolean hasBot = false; // Leaves - disable kick - int count = 0; - - for (ServerPlayer player : players) { -+ // Leaves start - disable kick -+ if (player instanceof org.leavesmc.leaves.bot.ServerBot) { -+ source.sendFailure(Component.literal("Permission denied")); -+ hasBot = true; -+ continue; -+ } -+ // Leaves end - disable kick - if (!source.getServer().isSingleplayerOwner(player.nameAndId())) { - player.connection.disconnect(reason, org.bukkit.event.player.PlayerKickEvent.Cause.KICK_COMMAND); // Paper - kick event cause - source.sendSuccess(() -> Component.translatable("commands.kick.success", player.getDisplayName(), reason), true); -@@ -49,7 +57,13 @@ public class KickCommand { - } - - if (count == 0) { -- throw ERROR_KICKING_OWNER.create(); -+ // Leaves start - disable kick -+ if (hasBot) { -+ return count; -+ } else { -+ throw ERROR_KICKING_OWNER.create(); -+ } -+ // Leaves end - disable kick - } else { - return count; - } + return count; + } diff --git a/net/minecraft/server/commands/OpCommand.java b/net/minecraft/server/commands/OpCommand.java index 636f56bfc0e9075b257e2eb14e858975bdedd801..20cbc0e65fea3fc2d0033259c2f35e158ea81926 100644 --- a/net/minecraft/server/commands/OpCommand.java @@ -223,26 +224,26 @@ index 636f56bfc0e9075b257e2eb14e858975bdedd801..20cbc0e65fea3fc2d0033259c2f35e15 list.op(player); count++; diff --git a/net/minecraft/server/commands/StopCommand.java b/net/minecraft/server/commands/StopCommand.java -index e9c9a468f046832e8eaa999bb57da261b4633604..2efe24c0378a80dd2750b10a54c1887816236c1a 100644 +index 3021b70b941ed09c5c58b98d30830a2279b8339c..d289f59475b617ae527d123239297f695468b80c 100644 --- a/net/minecraft/server/commands/StopCommand.java +++ b/net/minecraft/server/commands/StopCommand.java -@@ -11,6 +11,10 @@ public class StopCommand { +@@ -12,6 +12,10 @@ public class StopCommand { c.getSource().sendSuccess(() -> Component.translatable("commands.stop.stopping"), true); c.getSource().getServer().halt(false); - return 1; + return Command.SINGLE_SUCCESS; - })); + }).then(Commands.literal("force").requires(Commands.hasPermission(Commands.LEVEL_OWNERS)).executes(c -> { + c.getSource().sendSuccess(() -> Component.translatable("commands.stop.stopping"), true); -+ c.getSource().getServer().safeShutdown(false, false, true); ++ c.getSource().getServer().halt(false, false, true); + return 1; + }))); } } diff --git a/net/minecraft/server/dedicated/DedicatedServer.java b/net/minecraft/server/dedicated/DedicatedServer.java -index fcd4b4785f0d09f87fe214202468c75395157e14..09e92f20f97b374582e057b0dc7d2edc82d6f431 100644 +index 2dae0f4249eade60ac55c9fa289dd146dc3675e1..239cad02f85f0d14d4abfa746ecdc4dd82b04657 100644 --- a/net/minecraft/server/dedicated/DedicatedServer.java +++ b/net/minecraft/server/dedicated/DedicatedServer.java -@@ -274,6 +274,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface +@@ -230,6 +230,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface } // Spigot start @@ -250,7 +251,7 @@ index fcd4b4785f0d09f87fe214202468c75395157e14..09e92f20f97b374582e057b0dc7d2edc this.setPlayerList(new DedicatedPlayerList(this, this.registries(), this.playerDataStorage)); org.spigotmc.SpigotConfig.init((java.io.File) this.options.valueOf("spigot-settings")); org.spigotmc.SpigotConfig.registerCommands(); -@@ -295,6 +296,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface +@@ -251,6 +252,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface consoleThread.start(); // Paper - Enhance console tab completions for brigadier commands; start console thread after MinecraftServer.console & PaperConfig are initialized io.papermc.paper.command.PaperCommands.registerCommands(this); // Paper - setup /paper command if (false) this.server.spark.registerCommandBeforePlugins(this.server); // Paper - spark // Luminol - Force disable builtin spark @@ -259,7 +260,7 @@ index fcd4b4785f0d09f87fe214202468c75395157e14..09e92f20f97b374582e057b0dc7d2edc com.destroystokyo.paper.VersionHistoryManager.INSTANCE.getClass(); // Paper - load version history now diff --git a/net/minecraft/server/level/ChunkMap.java b/net/minecraft/server/level/ChunkMap.java -index 0dfb25ad032429a2aea7aa441dd5fd1848a6c617..215f2a40921cc8e6b181c0a34aa1bbaf843e3059 100644 +index e9cd960a0733ac37fac8e956ae36628bf42b79f2..4ab6959f20d8593f504f00a4feaaea7c41bb3339 100644 --- a/net/minecraft/server/level/ChunkMap.java +++ b/net/minecraft/server/level/ChunkMap.java @@ -1388,6 +1388,13 @@ public class ChunkMap extends SimpleRegionStorage implements ChunkHolder.PlayerP @@ -277,18 +278,18 @@ index 0dfb25ad032429a2aea7aa441dd5fd1848a6c617..215f2a40921cc8e6b181c0a34aa1bbaf } } diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java -index 0befa4fc81e10a23c6ba824e559f2fb4886e68ee..2ddcf6ae90aaaf98e2fcd8ab9995b6f0d7791856 100644 +index e1298bbb83d1d31406c47eaf6d10db3e8d8611ea..41c7179cf2b530d8e4b0fc8161aec75fc9d6c4df 100644 --- a/net/minecraft/server/level/ServerLevel.java +++ b/net/minecraft/server/level/ServerLevel.java -@@ -240,6 +240,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet - //public boolean hasPhysicsEvent = true; // Paper - BlockPhysicsEvent // Folia - region threading - move to regionised world data - //public boolean hasEntityMoveEvent; // Paper - Add EntityMoveEvent // Folia - region threading - move to regionised world data +@@ -243,6 +243,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet + private static final org.bukkit.craftbukkit.persistence.CraftPersistentDataTypeRegistry DATA_TYPE_REGISTRY = new org.bukkit.craftbukkit.persistence.CraftPersistentDataTypeRegistry(); + public final org.bukkit.craftbukkit.persistence.CraftPersistentDataContainer persistentDataContainer = new org.bukkit.craftbukkit.persistence.CraftPersistentDataContainer(DATA_TYPE_REGISTRY); //private final alternate.current.wire.WireHandler wireHandler = new alternate.current.wire.WireHandler(this); // Paper - optimize redstone (Alternate Current) // Folia - region threading - move to regionised world data + final List realPlayers; // Leaves - skip @Override public @Nullable LevelChunk getChunkIfLoaded(int x, int z) { -@@ -706,6 +707,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet +@@ -709,6 +710,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet this.chunkDataController = new ca.spottedleaf.moonrise.patches.chunk_system.io.datacontroller.ChunkDataController((ServerLevel)(Object)this, this.chunkTaskScheduler); // Paper end - rewrite chunk system this.getCraftServer().addWorld(this.getWorld()); // CraftBukkit @@ -296,7 +297,7 @@ index 0befa4fc81e10a23c6ba824e559f2fb4886e68ee..2ddcf6ae90aaaf98e2fcd8ab9995b6f0 this.updateTickData(); // Folia - region threading - make sure it is initialised before ticked } -@@ -2611,6 +2613,12 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet +@@ -2621,6 +2623,12 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet return this.players; } @@ -309,7 +310,7 @@ index 0befa4fc81e10a23c6ba824e559f2fb4886e68ee..2ddcf6ae90aaaf98e2fcd8ab9995b6f0 @Override public void updatePOIOnBlockStateChange(final BlockPos pos, final BlockState oldState, final BlockState newState) { Optional> oldType = PoiTypes.forState(oldState); -@@ -3091,6 +3099,11 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet +@@ -3094,6 +3102,11 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet // ServerLevel.this.getChunkSource().addEntity(entity); // Paper - ignore and warn about illegal addEntity calls instead of crashing server; moved down below valid=true if (entity instanceof ServerPlayer player) { ServerLevel.this.players.add(player); @@ -321,7 +322,7 @@ index 0befa4fc81e10a23c6ba824e559f2fb4886e68ee..2ddcf6ae90aaaf98e2fcd8ab9995b6f0 if (player.isReceivingWaypoints()) { ServerLevel.this.getWaypointManager().addPlayer(player); } -@@ -3172,6 +3185,11 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet +@@ -3175,6 +3188,11 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet ServerLevel.this.getChunkSource().removeEntity(entity); if (entity instanceof ServerPlayer player) { ServerLevel.this.players.remove(player); @@ -334,10 +335,10 @@ index 0befa4fc81e10a23c6ba824e559f2fb4886e68ee..2ddcf6ae90aaaf98e2fcd8ab9995b6f0 ServerLevel.this.updateSleepingPlayerList(); } diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java -index 295be200cb0696bd2ae2b655f89d96dd7723a541..4f6010285a5ff9cf939248c4d93043133680d383 100644 +index a13b6e60251151295e13d40840096cb002968b82..5affc3c101848e689a9044790c0f47f3dc3e214a 100644 --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java -@@ -229,7 +229,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -232,7 +232,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc private static final boolean DEFAULT_SPAWN_EXTRA_PARTICLES_ON_FALL = false; public ServerGamePacketListenerImpl connection; private final MinecraftServer server; @@ -346,38 +347,41 @@ index 295be200cb0696bd2ae2b655f89d96dd7723a541..4f6010285a5ff9cf939248c4d9304313 private final PlayerAdvancements advancements; private final ServerStatsCounter stats; private float lastRecordedHealthAndAbsorption = Float.MIN_VALUE; -@@ -250,7 +250,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -251,9 +251,9 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc + private boolean canChatColor = true; + private long lastActionTime = Util.getMillis(); private @Nullable Entity camera; - public boolean isChangingDimension; +- private boolean isChangingDimension; ++ protected boolean isChangingDimension; public boolean seenCredits = false; - private final ServerRecipeBook recipeBook; + protected ServerRecipeBook recipeBook; // Leaves - not final and private -> protected private @Nullable Vec3 levitationStartPos; private int levitationStartTime; private boolean disconnected; -@@ -1517,7 +1517,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -1489,7 +1489,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc } - // Luminol End - Cross Region Damage trace + // Lophine End - Cross Region Damage trace - private void tellNeutralMobsThatIDied() { + protected void tellNeutralMobsThatIDied() { // Leaves private -> protected AABB aabb = new AABB(this.blockPosition()).inflate(32.0, 10.0, 32.0); this.level() .getEntitiesOfClass(Mob.class, aabb, EntitySelector.NO_SPECTATORS) -@@ -2183,6 +2183,11 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc - this.lastSentHealth = -1.0F; - this.lastSentFood = -1; - this.teleportSpectators(transition, oldLevel); -+ // Leaves start - bot support -+ if (fun.bm.lophine.config.modules.function.FakeplayerConfig.enable) { -+ this.server.getBotList().bots.forEach(bot -> bot.sendFakeDataIfNeed(this, true)); // Leaves - render bot -+ } -+ // Leaves end - bot support - // CraftBukkit start - org.bukkit.event.player.PlayerChangedWorldEvent changeEvent = new org.bukkit.event.player.PlayerChangedWorldEvent(this.getBukkitEntity(), oldLevel.getWorld()); - this.level().getCraftServer().getPluginManager().callEvent(changeEvent); +@@ -2161,6 +2161,11 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc + this.lastSentHealth = -1.0F; + this.lastSentFood = -1; + this.teleportSpectators(transition, oldLevel); ++ // Leaves start - bot support ++ if (fun.bm.lophine.config.modules.function.FakeplayerConfig.enable) { ++ this.server.getBotList().bots.forEach(bot -> bot.sendFakeDataIfNeed(this, true)); // Leaves - render bot ++ } ++ // Leaves end - bot support + // CraftBukkit start + org.bukkit.event.player.PlayerChangedWorldEvent changeEvent = new org.bukkit.event.player.PlayerChangedWorldEvent(this.getBukkitEntity(), oldLevel.getWorld()); + this.level().getCraftServer().getPluginManager().callEvent(changeEvent); diff --git a/net/minecraft/server/players/CachedUserNameToIdResolver.java b/net/minecraft/server/players/CachedUserNameToIdResolver.java -index d2da9f3c5e53ceaeb85c6d3d7443e124a4d93bb8..8a96c07e6d5fd0826efc50e3fd585a42b2c9028c 100644 +index b7553611723f7120c66e1f3e51d89df28bd2756b..7109a22a9911d452242207ab0286ee985dafd439 100644 --- a/net/minecraft/server/players/CachedUserNameToIdResolver.java +++ b/net/minecraft/server/players/CachedUserNameToIdResolver.java @@ -122,6 +122,12 @@ public class CachedUserNameToIdResolver implements UserNameToIdResolver { @@ -394,7 +398,7 @@ index d2da9f3c5e53ceaeb85c6d3d7443e124a4d93bb8..8a96c07e6d5fd0826efc50e3fd585a42 boolean stateLocked = true; try { this.stateLock.lock(); // Paper - Fix GameProfileCache concurrency CachedUserNameToIdResolver.GameProfileInfo profileInfo = this.profilesByName.get(userName); diff --git a/net/minecraft/server/players/NameAndId.java b/net/minecraft/server/players/NameAndId.java -index 484714beb5f7cdf8178834c5edd4f847fb06ebb8..ba7a280aad07f36366c15cd158b36ca9768cef19 100644 +index 12190f2a2856b0d0cf95144d0b1622f1b9600bf6..be01f06d4ee02854345842c97382e8b6401ab948 100644 --- a/net/minecraft/server/players/NameAndId.java +++ b/net/minecraft/server/players/NameAndId.java @@ -8,18 +8,22 @@ import java.util.UUID; @@ -442,7 +446,7 @@ index 484714beb5f7cdf8178834c5edd4f847fb06ebb8..ba7a280aad07f36366c15cd158b36ca9 // Paper start - utility method for common conversion back to the game profile diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java -index 16d01fcb97aa3dbd7554bd64b3608c6e80ce3dbd..b77968e195d1f87c825c09b2a1622b3a3ed5f772 100644 +index bb3049ed94088337f18f2373f97846b2f0add8f1..b5a22510fede9521a0d8330272876d2ceedfb1cc 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java @@ -320,6 +320,19 @@ public abstract class PlayerList { @@ -465,7 +469,7 @@ index 16d01fcb97aa3dbd7554bd64b3608c6e80ce3dbd..b77968e195d1f87c825c09b2a1622b3a final net.kyori.adventure.text.Component jm = playerJoinEvent.joinMessage(); if (jm != null && !jm.equals(net.kyori.adventure.text.Component.empty())) { // Paper - Adventure -@@ -793,6 +806,11 @@ public abstract class PlayerList { +@@ -791,6 +804,11 @@ public abstract class PlayerList { respawnReason ).callEvent(); // Paper end @@ -477,7 +481,7 @@ index 16d01fcb97aa3dbd7554bd64b3608c6e80ce3dbd..b77968e195d1f87c825c09b2a1622b3a return player; } -@@ -895,11 +913,16 @@ public abstract class PlayerList { +@@ -893,11 +911,16 @@ public abstract class PlayerList { public String[] getPlayerNamesArray() { List players = new java.util.ArrayList<>(this.players); // Folia - region threading @@ -496,7 +500,7 @@ index 16d01fcb97aa3dbd7554bd64b3608c6e80ce3dbd..b77968e195d1f87c825c09b2a1622b3a return names; } @@ -1018,8 +1041,15 @@ public abstract class PlayerList { - || this.allowCommandsForAllPlayers; + } } - public @Nullable ServerPlayer getPlayerByName(final String name) { @@ -513,7 +517,7 @@ index 16d01fcb97aa3dbd7554bd64b3608c6e80ce3dbd..b77968e195d1f87c825c09b2a1622b3a } public void broadcast( -@@ -1362,7 +1392,13 @@ public abstract class PlayerList { +@@ -1366,7 +1396,13 @@ public abstract class PlayerList { } public @Nullable ServerPlayer getPlayer(final UUID uuid) { @@ -529,10 +533,10 @@ index 16d01fcb97aa3dbd7554bd64b3608c6e80ce3dbd..b77968e195d1f87c825c09b2a1622b3a public @Nullable ServerPlayer getPlayer(final String playerName) { diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java -index f090b8d77bd2731debfc61c263bd77550f52212b..03c155140da7300f6f934aff323e0daed1b63366 100644 +index cc47f02936cad38627c2ee87e54aa8b80a66a8af..bab9b0dbbcb76e4474305db7540f1e703ef0ae62 100644 --- a/net/minecraft/world/entity/Entity.java +++ b/net/minecraft/world/entity/Entity.java -@@ -1257,7 +1257,7 @@ public abstract class Entity +@@ -1263,7 +1263,7 @@ public abstract class Entity BlockPos effectPos = this.getOnPosLegacy(); BlockState effectState = this.level().getBlockState(effectPos); @@ -541,7 +545,7 @@ index f090b8d77bd2731debfc61c263bd77550f52212b..03c155140da7300f6f934aff323e0dae this.checkFallDamage(movement.y, this.onGround(), effectState, effectPos); } -@@ -1602,7 +1602,7 @@ public abstract class Entity +@@ -1664,7 +1664,7 @@ public abstract class Entity return colliders.isEmpty() ? maxDistance : -Shapes.collide(Direction.Axis.Y, aabb, colliders, -maxDistance); } @@ -551,10 +555,10 @@ index f090b8d77bd2731debfc61c263bd77550f52212b..03c155140da7300f6f934aff323e0dae final boolean xZero = movement.x == 0.0; final boolean yZero = movement.y == 0.0; diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java -index 2bce20202b7c539bee3685741663a8ed225919ff..a2f44e4354f6aa1c0502cba40cadaad59193b169 100644 +index cb1589e3aa663ca058fb5c3a24da700d4482cf35..d64c68651b7142869a06ce0200fb625cd45ae235 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java -@@ -3347,7 +3347,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -3348,7 +3348,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin private void travelRidden(final Player controller, final Vec3 selfInput) { Vec3 riddenInput = this.getRiddenInput(controller, selfInput); this.tickRidden(controller, riddenInput); @@ -563,7 +567,7 @@ index 2bce20202b7c539bee3685741663a8ed225919ff..a2f44e4354f6aa1c0502cba40cadaad5 this.setSpeed(this.getRiddenSpeed(controller)); this.travel(riddenInput); } else { -@@ -4270,7 +4270,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -4280,7 +4280,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin // Paper start - lag compensate eating // we add 1 to the expected time to avoid lag compensating when we should not final boolean shouldLagCompensate = this.useItem.has(DataComponents.FOOD) && this.eatStartTime != -1 && (System.nanoTime() - this.eatStartTime) > ((1L + this.totalEatTimeTicks) * 50L * (1000L * 1000L)); @@ -572,7 +576,7 @@ index 2bce20202b7c539bee3685741663a8ed225919ff..a2f44e4354f6aa1c0502cba40cadaad5 this.useItemRemaining = 0; // Paper end - lag compensate eating this.completeUsingItem(); -@@ -4459,6 +4459,23 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -4469,6 +4469,23 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin this.stopUsingItem(); } @@ -597,9 +601,18 @@ index 2bce20202b7c539bee3685741663a8ed225919ff..a2f44e4354f6aa1c0502cba40cadaad5 if (!this.level().isClientSide()) { boolean wasUsingItem = this.isUsingItem(); diff --git a/net/minecraft/world/entity/player/Player.java b/net/minecraft/world/entity/player/Player.java -index 06c6d30f3aef605bc25c42db8a6d26bbde57f40b..20a76138a8625663cf608e4ef97cc8ca4085b844 100644 +index c6fa9dff800b1491b1e0fc5d7e1dc16b99b8c7db..f063e9b7601480d0e66da22ea8e5bec2e8619fee 100644 --- a/net/minecraft/world/entity/player/Player.java +++ b/net/minecraft/world/entity/player/Player.java +@@ -156,7 +156,7 @@ public abstract class Player extends Avatar implements ContainerUser { + protected FoodData foodData = new FoodData(); + protected int jumpTriggerTime; + public int takeXpDelay; +- private int sleepCounter = 0; ++ protected int sleepCounter = 0; + protected boolean wasUnderwater; + private final Abilities abilities = new Abilities(); + public int experienceLevel = 0; @@ -167,7 +167,7 @@ public abstract class Player extends Avatar implements ContainerUser { private int lastLevelUpTime; public GameProfile gameProfile; @@ -609,7 +622,7 @@ index 06c6d30f3aef605bc25c42db8a6d26bbde57f40b..20a76138a8625663cf608e4ef97cc8ca private final ItemCooldowns cooldowns = this.createItemCooldowns(); private Optional lastDeathLocation = Optional.empty(); public me.earthme.luminol.functions.bars.TickableStatusBarList statusBarList = new me.earthme.luminol.functions.bars.TickableStatusBarList(this); // Luminol status bars -@@ -341,6 +341,12 @@ public abstract class Player extends Avatar implements ContainerUser { +@@ -345,6 +345,12 @@ public abstract class Player extends Avatar implements ContainerUser { this.updatePlayerPose(); } @@ -622,7 +635,7 @@ index 06c6d30f3aef605bc25c42db8a6d26bbde57f40b..20a76138a8625663cf608e4ef97cc8ca @Override protected float getMaxHeadRotationRelativeToBody() { return this.isBlocking() ? 15.0F : super.getMaxHeadRotationRelativeToBody(); -@@ -566,7 +572,7 @@ public abstract class Player extends Avatar implements ContainerUser { +@@ -570,7 +576,7 @@ public abstract class Player extends Avatar implements ContainerUser { public void removeEntitiesOnShoulder() { } @@ -631,21 +644,21 @@ index 06c6d30f3aef605bc25c42db8a6d26bbde57f40b..20a76138a8625663cf608e4ef97cc8ca entity.playerTouch(this); } -@@ -1250,7 +1256,7 @@ public abstract class Player extends Avatar implements ContainerUser { +@@ -1270,7 +1276,7 @@ public abstract class Player extends Avatar implements ContainerUser { // Paper end - Configurable sprint interruption on attack } -- if (entity instanceof ServerPlayer && entity.hurtMarked) { -+ if ((entity instanceof ServerPlayer && !(entity instanceof org.leavesmc.leaves.bot.ServerBot)) && entity.hurtMarked) { // Leaves - bot knockback +- if (entity instanceof ServerPlayer serverPlayer && entity.hurtMarked) { ++ if ((entity instanceof ServerPlayer serverPlayer && !(entity instanceof org.leavesmc.leaves.bot.ServerBot)) && entity.hurtMarked) { // Leaves - bot knockback // CraftBukkit start - Add Velocity Event boolean cancelled = false; org.bukkit.entity.Player player = (org.bukkit.entity.Player) entity.getBukkitEntity(); diff --git a/net/minecraft/world/entity/projectile/FishingHook.java b/net/minecraft/world/entity/projectile/FishingHook.java -index 0c8a48988c859669cf7e38816aaf32782c245244..a554e050d0c582c441af9d5616367234caa67ab0 100644 +index d7217fd075c6d6fae3622c56e940e247008dcc27..0958e7f93494766e97e87ed4d39c8e4550a641f6 100644 --- a/net/minecraft/world/entity/projectile/FishingHook.java +++ b/net/minecraft/world/entity/projectile/FishingHook.java -@@ -58,7 +58,7 @@ public class FishingHook extends Projectile { - public static final EntityDataAccessor DATA_HOOKED_ENTITY = SynchedEntityData.defineId(FishingHook.class, EntityDataSerializers.INT); +@@ -59,7 +59,7 @@ public class FishingHook extends Projectile { + private static final EntityDataAccessor DATA_HOOKED_ENTITY = SynchedEntityData.defineId(FishingHook.class, EntityDataSerializers.INT); private static final EntityDataAccessor DATA_BITING = SynchedEntityData.defineId(FishingHook.class, EntityDataSerializers.BOOLEAN); private int life; - private int nibble; @@ -654,7 +667,7 @@ index 0c8a48988c859669cf7e38816aaf32782c245244..a554e050d0c582c441af9d5616367234 public int timeUntilHooked; public float fishAngle; diff --git a/net/minecraft/world/entity/vehicle/boat/AbstractBoat.java b/net/minecraft/world/entity/vehicle/boat/AbstractBoat.java -index 05176458264b110ef3280342866ace22ec5a3333..2ce33513fd8e3de912c69ca8bc558a5800784ac5 100644 +index 9b887b40236a212de513e3ceece1abfec5372ae2..2f8f8fa1bef9f333978b47c2ce729c291bec66fb 100644 --- a/net/minecraft/world/entity/vehicle/boat/AbstractBoat.java +++ b/net/minecraft/world/entity/vehicle/boat/AbstractBoat.java @@ -270,6 +270,11 @@ public abstract class AbstractBoat extends VehicleEntity implements Leashable { @@ -684,10 +697,10 @@ index 05176458264b110ef3280342866ace22ec5a3333..2ce33513fd8e3de912c69ca8bc558a58 return switch (this.getStatus()) { case IN_WATER, UNDER_WATER, UNDER_FLOWING_WATER -> SoundEvents.BOAT_PADDLE_WATER; diff --git a/net/minecraft/world/inventory/AbstractContainerMenu.java b/net/minecraft/world/inventory/AbstractContainerMenu.java -index fa1f7dd22959632aaa54e72c8caf13ea072e7ca7..ae6056c3b6ae3eebdfb59cf54d7333dfc2cebf6a 100644 +index f6d37cba8ab5688501be9170720a0b6ded810819..fdd03c9d73a8a0527d0ead3fbbba20083c617e2c 100644 --- a/net/minecraft/world/inventory/AbstractContainerMenu.java +++ b/net/minecraft/world/inventory/AbstractContainerMenu.java -@@ -407,6 +407,7 @@ public abstract class AbstractContainerMenu { +@@ -406,6 +406,7 @@ public abstract class AbstractContainerMenu { private void doClick(final int slotIndex, final int buttonNum, final ContainerInput containerInput, final Player player) { Inventory inventory = player.getInventory(); @@ -695,7 +708,7 @@ index fa1f7dd22959632aaa54e72c8caf13ea072e7ca7..ae6056c3b6ae3eebdfb59cf54d7333df if (containerInput == ContainerInput.QUICK_CRAFT) { int expectedStatus = this.quickcraftStatus; this.quickcraftStatus = getQuickcraftHeader(buttonNum); -@@ -681,6 +682,22 @@ public abstract class AbstractContainerMenu { +@@ -680,6 +681,22 @@ public abstract class AbstractContainerMenu { } } @@ -719,19 +732,19 @@ index fa1f7dd22959632aaa54e72c8caf13ea072e7ca7..ae6056c3b6ae3eebdfb59cf54d7333df final Player player, final ClickAction clickAction, final Slot slot, final ItemStack clicked, final ItemStack carried ) { diff --git a/net/minecraft/world/item/ItemStack.java b/net/minecraft/world/item/ItemStack.java -index b052bc0107d93cd65a6c92914d6b3d02d6cc5ccb..fd2545f33692f964b62415178069e46e9c9d4c02 100644 +index 92149f9bf679cf4a486b24b5197470de68e0f424..9cb7f4a5e7677ee4b66416e13045f0f7dda4cc1c 100644 --- a/net/minecraft/world/item/ItemStack.java +++ b/net/minecraft/world/item/ItemStack.java -@@ -453,7 +453,7 @@ public final class ItemStack implements DataComponentHolder, ItemInstance, Chang - placeEvent = org.bukkit.craftbukkit.event.CraftEventFactory.callBlockPlaceEvent(level, player, hand, blocks.getFirst(), pos); - } +@@ -458,7 +458,7 @@ public final class ItemStack implements DataComponentHolder, ItemInstance, Chang + placeEvent = org.bukkit.craftbukkit.event.CraftEventFactory.callBlockPlaceEvent(level, player, hand, capturedBlockStates.getFirst(), pos); + } -- if (placeEvent != null && (placeEvent.isCancelled() || !placeEvent.canBuild())) { -+ if (placeEvent != null && (placeEvent.isCancelled() || !placeEvent.canBuild()) && (!(player instanceof org.leavesmc.leaves.bot.ServerBot))) { // Leaves - Fakeplayer skip this check - result = InteractionResult.FAIL; // cancel placement - // PAIL: Remove this when MC-99075 fixed - player.containerMenu.forceHeldSlot(hand); -@@ -982,6 +982,20 @@ public final class ItemStack implements DataComponentHolder, ItemInstance, Chang +- if (placeEvent != null && (placeEvent.isCancelled() || !placeEvent.canBuild())) { ++ if (placeEvent != null && (placeEvent.isCancelled() || !placeEvent.canBuild()) && (!(player instanceof org.leavesmc.leaves.bot.ServerBot))) { // Leaves - Fakeplayer skip this check + result = InteractionResult.FAIL; // cancel placement + // PAIL: Remove this when MC-99075 fixed + player.containerMenu.forceHeldSlot(hand); +@@ -962,6 +962,20 @@ public final class ItemStack implements DataComponentHolder, ItemInstance, Chang } } @@ -753,7 +766,7 @@ index b052bc0107d93cd65a6c92914d6b3d02d6cc5ccb..fd2545f33692f964b62415178069e46e return this.getItem().useOnRelease(this); } diff --git a/net/minecraft/world/level/block/piston/PistonMovingBlockEntity.java b/net/minecraft/world/level/block/piston/PistonMovingBlockEntity.java -index 282849162b88354893a15533e66d046fdd035bd6..2ecb10fe97d15954e44c61247eabc8818eb16f34 100644 +index 8d761640af4ce3afb4de5b46d3627614fff0ece9..15605dacaec3860e476a70dbdd3743e4197f67a6 100644 --- a/net/minecraft/world/level/block/piston/PistonMovingBlockEntity.java +++ b/net/minecraft/world/level/block/piston/PistonMovingBlockEntity.java @@ -152,7 +152,7 @@ public class PistonMovingBlockEntity extends BlockEntity { @@ -766,7 +779,7 @@ index 282849162b88354893a15533e66d046fdd035bd6..2ecb10fe97d15954e44c61247eabc881 double dx = deltaMovement.x; double dy = deltaMovement.y; diff --git a/net/minecraft/world/level/levelgen/PhantomSpawner.java b/net/minecraft/world/level/levelgen/PhantomSpawner.java -index 9d7238a28440ddc442c9288a617795261df767d9..142ab133d3b68eb9b88651e307653f1aafdf1de3 100644 +index db0324595d7f5b6f92bd7724daf181b0903e1da4..ec3a437bd8a7d0e95e1e5fa0ff4462a70391ecf9 100644 --- a/net/minecraft/world/level/levelgen/PhantomSpawner.java +++ b/net/minecraft/world/level/levelgen/PhantomSpawner.java @@ -49,6 +49,10 @@ public class PhantomSpawner implements CustomSpawner { diff --git a/lophine-server/minecraft-patches/features/0031-Leaves-Replay-Mod-API.patch b/lophine-server/minecraft-patches/features/0031-Leaves-Replay-Mod-API.patch index 210f489..c05d000 100644 --- a/lophine-server/minecraft-patches/features/0031-Leaves-Replay-Mod-API.patch +++ b/lophine-server/minecraft-patches/features/0031-Leaves-Replay-Mod-API.patch @@ -10,7 +10,7 @@ Licensed under: GPL-3.0 (https://www.gnu.org/licenses/gpl-3.0.html) This patch is Powered by ReplayMod (https://github.com/ReplayMod) diff --git a/net/minecraft/commands/CommandSourceStack.java b/net/minecraft/commands/CommandSourceStack.java -index 28776f3363810259f8c3bfdfd9f8c0455975be2a..0f562d7403aebf6c0907f2a33f758f4351ef282e 100644 +index 587ec673a0821e91de67abaf3a559c78f4aa8016..4fc1aad19fd9321c44aae99c118f40ec67d78020 100644 --- a/net/minecraft/commands/CommandSourceStack.java +++ b/net/minecraft/commands/CommandSourceStack.java @@ -562,7 +562,7 @@ public class CommandSourceStack implements SharedSuggestionProvider, ExecutionCo @@ -23,16 +23,18 @@ index 28776f3363810259f8c3bfdfd9f8c0455975be2a..0f562d7403aebf6c0907f2a33f758f43 @Override diff --git a/net/minecraft/commands/arguments/selector/EntitySelector.java b/net/minecraft/commands/arguments/selector/EntitySelector.java -index 7e3912b8b29e40eb3347f1451b0fd3ebee2af4f1..0834e402e6af7028e08851378e15390ec6314380 100644 +index 6c05b9276bdc267a36376f6c64592a50e4b2b36e..21d2c97b3d1e1d29c9de02b6acd58985c7c74231 100644 --- a/net/minecraft/commands/arguments/selector/EntitySelector.java +++ b/net/minecraft/commands/arguments/selector/EntitySelector.java -@@ -142,11 +142,12 @@ public class EntitySelector { - return this.findPlayers(sender); - } else if (this.playerName != null) { +@@ -144,13 +144,14 @@ public class EntitySelector { + + if (this.playerName != null) { ServerPlayer result = sender.getServer().getPlayerList().getPlayerByName(this.playerName); + result = result instanceof org.leavesmc.leaves.replay.ServerPhotographer ? null : result; // Leaves - skip photographer return result == null ? List.of() : List.of(result); - } else if (this.entityUUID != null) { + } + + if (this.entityUUID != null) { for (ServerLevel level : sender.getServer().getAllLevels()) { Entity entity = level.getEntity(this.entityUUID); - if (entity != null) { @@ -40,54 +42,56 @@ index 7e3912b8b29e40eb3347f1451b0fd3ebee2af4f1..0834e402e6af7028e08851378e15390e if (entity.getType().isEnabled(sender.enabledFeatures())) { return List.of(entity); } -@@ -160,7 +161,7 @@ public class EntitySelector { +@@ -164,7 +165,7 @@ public class EntitySelector { AABB absoluteAabb = this.getAbsoluteAabb(pos); if (this.currentEntity) { Predicate predicate = this.getPredicate(pos, absoluteAabb, null); - return sender.getEntity() != null && predicate.test(sender.getEntity()) ? List.of(sender.getEntity()) : List.of(); + return sender.getEntity() != null && !(sender.getEntity() instanceof org.leavesmc.leaves.replay.ServerPhotographer) && predicate.test(sender.getEntity()) ? List.of(sender.getEntity()) : List.of(); // Leaves - skip photographer - } else { - Predicate predicate = this.getPredicate(pos, absoluteAabb, sender.enabledFeatures()); - List result = new ObjectArrayList<>(); -@@ -171,6 +172,7 @@ public class EntitySelector { - this.addEntities(result, levelx, absoluteAabb, predicate); - } + } + + Predicate predicate = this.getPredicate(pos, absoluteAabb, sender.enabledFeatures()); +@@ -176,6 +177,7 @@ public class EntitySelector { + this.addEntities(result, level, absoluteAabb, predicate); } + } + result.removeIf(entity -> entity instanceof org.leavesmc.leaves.replay.ServerPhotographer); // Leaves - skip photographer - return this.sortAndLimit(pos, result); - } -@@ -206,9 +208,11 @@ public class EntitySelector { + return this.sortAndLimit(pos, result); + } +@@ -210,11 +212,13 @@ public class EntitySelector { this.checkPermissions(sender); if (this.playerName != null) { ServerPlayer result = sender.getServer().getPlayerList().getPlayerByName(this.playerName); + result = result instanceof org.leavesmc.leaves.replay.ServerPhotographer ? null : result; // Leaves - skip photographer return result == null ? List.of() : List.of(result); - } else if (this.entityUUID != null) { + } + + if (this.entityUUID != null) { ServerPlayer result = sender.getServer().getPlayerList().getPlayer(this.entityUUID); + result = result instanceof org.leavesmc.leaves.replay.ServerPhotographer ? null : result; // Leaves - skip photographer return result == null ? List.of() : List.of(result); - } else { - Vec3 pos = this.position.apply(sender.getPosition()); -@@ -220,11 +224,11 @@ public class EntitySelector { - int limit = this.getResultLimit(); - List result; - if (this.isWorldLimited()) { -- result = sender.getLevel().getPlayers(predicate, limit); -+ result = sender.getLevel().getPlayers((player -> !(player instanceof org.leavesmc.leaves.replay.ServerPhotographer) && predicate.test(player)), limit); // Leaves - skip photographer - } else { - result = new ObjectArrayList<>(); + } -- for (ServerPlayer player : sender.getServer().getPlayerList().getPlayers()) { -+ for (ServerPlayer player : sender.getServer().getPlayerList().realPlayers) { // Leaves - only real players - if (predicate.test(player)) { - result.add(player); - if (result.size() >= limit) { +@@ -228,11 +232,11 @@ public class EntitySelector { + int limit = this.getResultLimit(); + List result; + if (this.isWorldLimited()) { +- result = sender.getLevel().getPlayers(predicate, limit); ++ result = sender.getLevel().getPlayers((player -> !(player instanceof org.leavesmc.leaves.replay.ServerPhotographer) && predicate.test(player)), limit); // Leaves - skip photographer + } else { + result = new ObjectArrayList<>(); + +- for (ServerPlayer player : sender.getServer().getPlayerList().getPlayers()) { ++ for (ServerPlayer player : sender.getServer().getPlayerList().realPlayers) { // Leaves - only real players + if (predicate.test(player)) { + result.add(player); + if (result.size() >= limit) { diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java -index c4685bb540e95d889dfbc107923876045be29848..f99c02b4d88cea924e20ca8dced67873c83c093f 100644 +index f6ace71d151d428149e8c9615c3b91e0f213ae7c..d7a7f7e7daf45bc0912aae008f3fed35201925fe 100644 --- a/net/minecraft/server/MinecraftServer.java +++ b/net/minecraft/server/MinecraftServer.java -@@ -1930,7 +1930,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop { // Folia - region threading - // Paper start - Expand PlayerGameModeChangeEvent + int count = 0; + +- for (ServerPlayer player : this.getPlayerList().getPlayers()) { ++ for (ServerPlayer player : this.getPlayerList().realPlayers) { // Leaves - only real player + player.getBukkitEntity().taskScheduler.schedule((ServerPlayer updatedPlayer) -> { // Folia - region threading + // Paper start - Expand PlayerGameModeChangeEvent org.bukkit.event.player.PlayerGameModeChangeEvent event = updatedPlayer.setGameMode(gameType, org.bukkit.event.player.PlayerGameModeChangeEvent.Cause.DEFAULT_GAMEMODE, null); // Folia - region threading -@@ -2550,7 +2550,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop receivers = source.getServer() - .getPlayerList() -- .getPlayers() -+ .realPlayers // Leaves - only real players - .stream() - .filter(receiver -> receiver == entity || receiver.getTeam() == team) - .toList(); +@@ -41,7 +41,7 @@ public class TeamMsgCommand { + + List receivers = source.getServer() + .getPlayerList() +- .getPlayers() ++ .realPlayers // Leaves - only real players + .stream() + .filter(receiver -> receiver == entity || receiver.getTeam() == team) + .toList(); diff --git a/net/minecraft/server/commands/WhitelistCommand.java b/net/minecraft/server/commands/WhitelistCommand.java -index 907d1304503a80c6d0fd064bf1aaf4e081e9f85b..e0c1ee55888261bca42bbadec8812da2a36dded8 100644 +index 3bc559b636288d38192c64a2aba15c062898182f..99aac6df1725db48b63ce68e74f6a3a18caf7956 100644 --- a/net/minecraft/server/commands/WhitelistCommand.java +++ b/net/minecraft/server/commands/WhitelistCommand.java -@@ -44,7 +44,7 @@ public class WhitelistCommand { +@@ -45,7 +45,7 @@ public class WhitelistCommand { (c, p) -> { PlayerList list = c.getSource().getServer().getPlayerList(); return SharedSuggestionProvider.suggest( @@ -285,10 +289,10 @@ index 37c9f983ae89c497f44a1b7967d741abf909e0a0..d7fb2505f2a86ca0d81f144624ef2e1a this.setListData(players); diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java -index 2ddcf6ae90aaaf98e2fcd8ab9995b6f0d7791856..a7cebb797973cde399dc30c696b064efd40874f2 100644 +index 41c7179cf2b530d8e4b0fc8161aec75fc9d6c4df..f75249ba1b02efec0f4fc381b02803228e3e1d7c 100644 --- a/net/minecraft/server/level/ServerLevel.java +++ b/net/minecraft/server/level/ServerLevel.java -@@ -3100,7 +3100,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet +@@ -3103,7 +3103,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet if (entity instanceof ServerPlayer player) { ServerLevel.this.players.add(player); // Leaves start - skip @@ -297,7 +301,7 @@ index 2ddcf6ae90aaaf98e2fcd8ab9995b6f0d7791856..a7cebb797973cde399dc30c696b064ef ServerLevel.this.realPlayers.add(player); } // Leaves end - skip -@@ -3186,7 +3186,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet +@@ -3189,7 +3189,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet if (entity instanceof ServerPlayer player) { ServerLevel.this.players.remove(player); // Leaves start - skip @@ -307,10 +311,10 @@ index 2ddcf6ae90aaaf98e2fcd8ab9995b6f0d7791856..a7cebb797973cde399dc30c696b064ef } // Leaves end - skip diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java -index b77968e195d1f87c825c09b2a1622b3a3ed5f772..c95c7b9a3968fc34a900a613b65b5d3e1abb24bf 100644 +index b5a22510fede9521a0d8330272876d2ceedfb1cc..049648756f9053895e773efdca33fe65b3555b10 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java -@@ -130,6 +130,7 @@ public abstract class PlayerList { +@@ -129,6 +129,7 @@ public abstract class PlayerList { private int simulationDistance; private boolean allowCommandsForAllPlayers; private int sendAllPlayerInfoIn; @@ -318,7 +322,7 @@ index b77968e195d1f87c825c09b2a1622b3a3ed5f772..c95c7b9a3968fc34a900a613b65b5d3e // CraftBukkit start private org.bukkit.craftbukkit.CraftServer cserver; -@@ -192,6 +193,7 @@ public abstract class PlayerList { +@@ -191,6 +192,7 @@ public abstract class PlayerList { private boolean countConnection(Connection conn, int limit) { synchronized (this.connectionsStateLock) { @@ -326,62 +330,90 @@ index b77968e195d1f87c825c09b2a1622b3a3ed5f772..c95c7b9a3968fc34a900a613b65b5d3e int count = this.usersCountedAgainstLimit.size(); if (count >= limit) { return false; -@@ -222,6 +224,124 @@ public abstract class PlayerList { +@@ -221,6 +223,173 @@ public abstract class PlayerList { abstract public void loadAndSaveFiles(); // Paper - fix converting txt to json file; moved from DedicatedPlayerList constructor + // Leaves start - replay mod api + public void placeNewPhotographer(Connection connection, org.leavesmc.leaves.replay.ServerPhotographer player, ServerLevel worldserver) { + player.isRealPlayer = true; // Paper -+ player.loginTime = System.currentTimeMillis(); // Paper -+ -+ ServerLevel worldserver1 = worldserver; -+ -+ player.setServerLevel(worldserver1); -+ player.spawnIn(worldserver1); -+ player.gameMode.setLevel(player.level()); -+ -+ LevelData worlddata = worldserver1.getLevelData(); -+ -+ ServerGamePacketListenerImpl playerconnection = new ServerGamePacketListenerImpl(this.server, connection, player, CommonListenerCookie.createInitial(player.gameProfile, false)); -+ GameRules gamerules = worldserver1.getGameRules(); -+ boolean flag = gamerules.get(GameRules.IMMEDIATE_RESPAWN); -+ boolean flag1 = gamerules.get(GameRules.REDUCED_DEBUG_INFO); -+ boolean flag2 = gamerules.get(GameRules.LIMITED_CRAFTING); -+ -+ playerconnection.send(new ClientboundLoginPacket(player.getId(), worlddata.isHardcore(), this.server.levelKeys(), this.getMaxPlayers(), io.papermc.paper.FeatureHooks.getViewDistance(worldserver1), io.papermc.paper.FeatureHooks.getSimulationDistance(worldserver1), flag1, !flag, flag2, player.createCommonSpawnInfo(worldserver1), this.server.enforceSecureProfile())); ++ player.loginTime = System.currentTimeMillis(); // Paper - Replace OfflinePlayer#getLastPlayed ++ NameAndId gameProfile = player.nameAndId(); ++ UserNameToIdResolver profileCache = this.server.services().nameToIdCache(); ++ Optional oldProfile = profileCache.get(gameProfile.id()); ++ String oldName = oldProfile.map(NameAndId::name).orElse(gameProfile.name()); ++ if (player.lastKnownName != null) { oldName = player.lastKnownName; player.lastKnownName = null; } // CraftBukkit - Better rename detection ++ profileCache.add(gameProfile); ++ ServerLevel level = player.level(); ++ LevelData levelData = level.getLevelData(); ++ CommonListenerCookie cookie = CommonListenerCookie.createInitial(player.gameProfile, false); ++ ServerGamePacketListenerImpl playerConnection = new ServerGamePacketListenerImpl(this.server, connection, player, cookie); ++ // Folia start - rewrite login process ++ // only after setting the connection listener to game type, add the connection to this regions list ++ level.getCurrentWorldData().connections.add(connection); ++ // Folia end - rewrite login process ++ if (!me.earthme.luminol.config.modules.optimizations.AsyncProtocolChangeConfig.enabled) { // Luminol - Async protocol switch // we will run async switch once these main thread logics became done ++ connection.setupInboundProtocol( ++ GameProtocols.SERVERBOUND_TEMPLATE.bind(RegistryFriendlyByteBuf.decorator(this.server.registryAccess()), playerConnection), playerConnection ++ ); ++ } // Luminol - Async protocol switch ++ playerConnection.suspendFlushing(); ++ GameRules gameRules = level.getGameRules(); ++ boolean immediateRespawn = gameRules.get(GameRules.IMMEDIATE_RESPAWN); ++ boolean reducedDebugInfo = gameRules.get(GameRules.REDUCED_DEBUG_INFO); ++ boolean doLimitedCrafting = gameRules.get(GameRules.LIMITED_CRAFTING); ++ playerConnection.send( ++ new ClientboundLoginPacket( ++ player.getId(), ++ levelData.isHardcore(), ++ this.server.levelKeys(), ++ this.getMaxPlayers(), ++ io.papermc.paper.FeatureHooks.getViewDistance(level), // Paper - view distance ++ io.papermc.paper.FeatureHooks.getSimulationDistance(level), // Paper - simulation distance ++ reducedDebugInfo, ++ !immediateRespawn, ++ doLimitedCrafting, ++ player.createCommonSpawnInfo(level), ++ this.server.usesAuthentication(), ++ this.server.enforceSecureProfile() ++ ) ++ ); + player.getBukkitEntity().sendSupportedChannels(); // CraftBukkit -+ playerconnection.send(new ClientboundChangeDifficultyPacket(worlddata.getDifficulty(), worlddata.isDifficultyLocked())); -+ playerconnection.send(new ClientboundPlayerAbilitiesPacket(player.getAbilities())); -+ playerconnection.send(new ClientboundSetHeldSlotPacket(player.getInventory().getSelectedSlot())); -+ RecipeManager craftingmanager = this.server.getRecipeManager(); -+ playerconnection.send(new ClientboundUpdateRecipesPacket(craftingmanager.getSynchronizedItemProperties(), craftingmanager.getSynchronizedStonecutterRecipes())); -+ ++ playerConnection.send(new ClientboundChangeDifficultyPacket(levelData.getDifficulty(), levelData.isDifficultyLocked())); ++ playerConnection.send(new ClientboundPlayerAbilitiesPacket(player.getAbilities())); ++ playerConnection.send(new ClientboundSetHeldSlotPacket(player.getInventory().getSelectedSlot())); ++ RecipeManager recipeManager = this.server.getRecipeManager(); ++ playerConnection.send( ++ new ClientboundUpdateRecipesPacket(recipeManager.getSynchronizedItemProperties(), recipeManager.getSynchronizedStonecutterRecipes()) ++ ); + this.sendPlayerPermissionLevel(player); + player.getStats().markAllDirty(); + player.getRecipeBook().sendInitialRecipeBook(player); -+ this.updateEntireScoreboard(worldserver1.getScoreboard(), player); ++ //this.updateEntireScoreboard(level.getScoreboard(), player); // Folia - region threading + this.server.invalidateStatus(); + -+ playerconnection.teleport(player.getX(), player.getY(), player.getZ(), player.getYRot(), player.getXRot()); -+ ServerStatus serverping = this.server.getStatus(); -+ -+ if (serverping != null) { -+ player.sendServerStatus(serverping); ++ playerConnection.teleport(player.getX(), player.getY(), player.getZ(), player.getYRot(), player.getXRot()); ++ ServerStatus status = this.server.getStatus(); ++ if (status != null && !cookie.transferred()) { ++ player.sendServerStatus(status); + } + ++ // player.connection.send(ClientboundPlayerInfoUpdatePacket.createPlayerInitializing(this.players)); // CraftBukkit - replaced with loop below + this.players.add(player); + this.playersByName.put(player.getScoreboardName().toLowerCase(java.util.Locale.ROOT), player); // Spigot + this.playersByUUID.put(player.getUUID(), player); -+ ++ // this.broadcastAll(ClientboundPlayerInfoUpdatePacket.createPlayerInitializing(List.of(player))); // CraftBukkit - replaced with loop below ++ // Paper start - Fire PlayerJoinEvent when Player is actually ready; correctly register player BEFORE PlayerJoinEvent, so the entity is valid and doesn't require tick delay hacks + player.suppressTrackerForLogin = true; -+ worldserver1.addNewPlayer(player); -+ this.server.getCustomBossEvents().onPlayerConnect(player); ++ this.sendLevelInfo(player, level); ++ level.addNewPlayer(player); ++ this.server.getCustomBossEvents().onPlayerConnect(player); // see commented out section below serverLevel.addPlayerJoin(player); ++ // Paper end - Fire PlayerJoinEvent when Player is actually ready ++ player.initInventoryMenu(); + org.bukkit.craftbukkit.entity.CraftPlayer bukkitPlayer = player.getBukkitEntity(); + -+ player.containerMenu.transferTo(player.containerMenu, bukkitPlayer); + if (!player.connection.isAcceptingMessages()) { -+ return; ++ //return; // Folia - region threading - must still allow the player to connect, as we must add to chunk map before handling disconnect + } + + // org.leavesmc.leaves.protocol.core.LeavesProtocolManager.handlePlayerJoin(player); // Leaves - protocol @@ -399,59 +431,80 @@ index b77968e195d1f87c825c09b2a1622b3a3ed5f772..c95c7b9a3968fc34a900a613b65b5d3e + } + // Leaves end - bot support + -+ final List onlinePlayers = Lists.newArrayListWithExpectedSize(this.players.size() - 1); -+ for (int i = 0; i < this.players.size(); ++i) { -+ ServerPlayer entityplayer1 = this.players.get(i); ++ // CraftBukkit start - sendAll above replaced with this loop ++ ClientboundPlayerInfoUpdatePacket packet = ClientboundPlayerInfoUpdatePacket.createPlayerInitializing(List.of(player)); // Paper - Add Listing API for Player + -+ if (entityplayer1 == player || !bukkitPlayer.canSee(entityplayer1.getBukkitEntity())) { ++ final List onlinePlayers = Lists.newArrayListWithExpectedSize(this.players.size() - 1); // Paper - Use single player info update packet on join ++ for (ServerPlayer entityplayer1 : this.players) { // Folia - region threading ++ ++ if (entityplayer1.getBukkitEntity().canSee(bukkitPlayer)) { ++ // Paper start - Add Listing API for Player ++ if (entityplayer1.getBukkitEntity().isListed(bukkitPlayer)) { ++ // Paper end - Add Listing API for Player ++ entityplayer1.connection.send(packet); ++ // Paper start - Add Listing API for Player ++ } else { ++ entityplayer1.connection.send(ClientboundPlayerInfoUpdatePacket.createSinglePlayerInitializing(player, false)); ++ } ++ // Paper end - Add Listing API for Player ++ } ++ ++ if (entityplayer1 == player || !bukkitPlayer.canSee(entityplayer1.getBukkitEntity())) { // Paper - Use single player info update packet on join; Don't include joining player + continue; + } + -+ // Leaves start - skip photographer -+ if (entityplayer1 instanceof org.leavesmc.leaves.replay.ServerPhotographer) { -+ continue; -+ } -+ // Leaves end - skip photographer -+ -+ onlinePlayers.add(entityplayer1); ++ onlinePlayers.add(entityplayer1); // Paper - Use single player info update packet on join + } ++ // Paper start - Use single player info update packet on join + if (!onlinePlayers.isEmpty()) { -+ player.connection.send(ClientboundPlayerInfoUpdatePacket.createPlayerInitializing(onlinePlayers, player)); ++ player.connection.send(ClientboundPlayerInfoUpdatePacket.createPlayerInitializing(onlinePlayers, player)); // Paper - Add Listing API for Player + } -+ ++ // Paper end - Use single player info update packet on join + player.sentListPacket = true; -+ player.suppressTrackerForLogin = false; -+ ((ServerLevel)player.level()).getChunkSource().chunkMap.addEntity(player); ++ player.suppressTrackerForLogin = false; // Paper - Fire PlayerJoinEvent when Player is actually ready ++ player.level().getChunkSource().addEntity(player); // Paper - Fire PlayerJoinEvent when Player is actually ready; track entity now ++ // CraftBukkit end + -+ this.sendLevelInfo(player, worldserver1); ++ //player.refreshEntityData(player); // CraftBukkit - BungeeCord#2321, send complete data to self on spawn // Paper - THIS IS NOT NEEDED ANYMORE + -+ if (player.level() == worldserver1 && !worldserver1.players().contains(player)) { -+ worldserver1.addNewPlayer(player); ++ this.sendLevelInfo(player, level); ++ ++ // CraftBukkit start - Only add if the player wasn't moved in the event ++ if (player.level() == level && !level.players().contains(player)) { ++ level.addNewPlayer(player); + this.server.getCustomBossEvents().onPlayerConnect(player); + } + -+ worldserver1 = player.level(); -+ java.util.Iterator iterator = player.getActiveEffects().iterator(); -+ while (iterator.hasNext()) { -+ MobEffectInstance mobeffect = iterator.next(); -+ playerconnection.send(new ClientboundUpdateMobEffectPacket(player.getId(), mobeffect, false)); ++ level = player.level(); // CraftBukkit - Update in case join event changed it ++ // CraftBukkit end ++ this.sendActivePlayerEffects(player); ++ // Paper - move loading pearls / parent vehicle up ++ player.initInventoryMenu(); ++ this.server.notificationManager().playerJoined(player); ++ playerConnection.resumeFlushing(); ++ // Paper start - Configurable player collision; Add to collideRule team if needed ++ final net.minecraft.world.scores.Scoreboard scoreboard = this.getServer().getLevel(Level.OVERWORLD).getScoreboard(); ++ final PlayerTeam collideRuleTeam = scoreboard.getPlayerTeam(this.collideRuleTeamName); ++ if (false && this.collideRuleTeamName != null && collideRuleTeam != null && player.getTeam() == null) { // Folia - region threading ++ scoreboard.addPlayerToTeam(player.getScoreboardName(), collideRuleTeam); + } + + if (player.isDeadOrDying()) { -+ net.minecraft.core.Holder plains = worldserver1.registryAccess().lookupOrThrow(net.minecraft.core.registries.Registries.BIOME) ++ net.minecraft.core.Holder plains = level.registryAccess().lookupOrThrow(net.minecraft.core.registries.Registries.BIOME) + .getOrThrow(net.minecraft.world.level.biome.Biomes.PLAINS); + player.connection.send(new net.minecraft.network.protocol.game.ClientboundLevelChunkWithLightPacket( -+ new net.minecraft.world.level.chunk.EmptyLevelChunk(worldserver1, player.chunkPosition(), plains), -+ worldserver1.getLightEngine(), null, null, false) ++ new net.minecraft.world.level.chunk.EmptyLevelChunk(level, player.chunkPosition(), plains), ++ level.getLightEngine(), null, null, true) // Paper - Anti-Xray + ); + } ++ // Paper end - Send empty chunk + } + // Leaves end - replay mod api + public void placeNewPlayer(final Connection connection, final ServerPlayer player, final CommonListenerCookie cookie) { player.isRealPlayer = true; // Paper player.loginTime = System.currentTimeMillis(); // Paper - Replace OfflinePlayer#getLastPlayed -@@ -295,6 +415,7 @@ public abstract class PlayerList { +@@ -295,6 +464,7 @@ public abstract class PlayerList { // player.connection.send(ClientboundPlayerInfoUpdatePacket.createPlayerInitializing(this.players)); // CraftBukkit - replaced with loop below this.players.add(player); @@ -459,7 +512,7 @@ index b77968e195d1f87c825c09b2a1622b3a3ed5f772..c95c7b9a3968fc34a900a613b65b5d3e this.playersByName.put(player.getScoreboardName().toLowerCase(java.util.Locale.ROOT), player); // Spigot this.playersByUUID.put(player.getUUID(), player); // this.broadcastAll(ClientboundPlayerInfoUpdatePacket.createPlayerInitializing(List.of(player))); // CraftBukkit - replaced with loop below -@@ -514,6 +635,7 @@ public abstract class PlayerList { +@@ -510,6 +680,7 @@ public abstract class PlayerList { } protected void save(final ServerPlayer player) { @@ -467,7 +520,7 @@ index b77968e195d1f87c825c09b2a1622b3a3ed5f772..c95c7b9a3968fc34a900a613b65b5d3e if (!player.getBukkitEntity().isPersistent()) return; // CraftBukkit player.lastSave = System.nanoTime(); // Folia - region threading - changed to nanoTime tracking this.playerIo.save(player); -@@ -528,6 +650,47 @@ public abstract class PlayerList { +@@ -524,6 +695,48 @@ public abstract class PlayerList { } } @@ -493,7 +546,8 @@ index b77968e195d1f87c825c09b2a1622b3a3ed5f772..c95c7b9a3968fc34a900a613b65b5d3e + + worldserver.removePlayerImmediately(entityplayer, Entity.RemovalReason.UNLOADED_WITH_PLAYER); + entityplayer.retireScheduler(); -+ entityplayer.getAdvancements().stopListening(); ++ entityplayer.getBukkitEntity().packetProcessor.close(); // Folia - region threading ++ entityplayer.getAdvancements().clearTriggers(); + this.players.remove(entityplayer); + // Leaves - guard name removal so a photographer sharing a real player's name won't evict the real player's mapping + final String nameKey = entityplayer.getScoreboardName().toLowerCase(java.util.Locale.ROOT); @@ -515,15 +569,15 @@ index b77968e195d1f87c825c09b2a1622b3a3ed5f772..c95c7b9a3968fc34a900a613b65b5d3e public net.kyori.adventure.text.@Nullable Component remove(final ServerPlayer player) { // CraftBukkit - return string // Paper - return Component // Paper start - Fix kick event leave message not being sent return this.remove(player, net.kyori.adventure.text.Component.translatable("multiplayer.player.left", net.kyori.adventure.text.format.NamedTextColor.YELLOW, io.papermc.paper.configuration.GlobalConfiguration.get().messages.useDisplayNameInQuitMessage ? player.getBukkitEntity().displayName() : io.papermc.paper.adventure.PaperAdventure.asAdventure(player.getDisplayName()))); -@@ -601,6 +764,7 @@ public abstract class PlayerList { +@@ -597,6 +810,7 @@ public abstract class PlayerList { player.getBukkitEntity().packetProcessor.close(); // Folia - region threading - player.getAdvancements().stopListening(); + player.getAdvancements().clearTriggers(); this.players.remove(player); + this.realPlayers.remove(player); // Leaves - replay api this.playersByName.remove(player.getScoreboardName().toLowerCase(java.util.Locale.ROOT)); // Spigot if (me.earthme.luminol.config.modules.misc.UsernameCheckConfig.allowOldPlayersJoin) this.playedPlayers.remove(player.getGameProfile().name()); // Leaf - Configurable vanilla username check this.server.getCustomBossEvents().onPlayerDisconnect(player); -@@ -912,15 +1076,15 @@ public abstract class PlayerList { +@@ -910,15 +1124,15 @@ public abstract class PlayerList { } public String[] getPlayerNamesArray() { @@ -546,10 +600,10 @@ index b77968e195d1f87c825c09b2a1622b3a3ed5f772..c95c7b9a3968fc34a900a613b65b5d3e // Leaves end - fakeplayer support diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java -index a2f44e4354f6aa1c0502cba40cadaad59193b169..a3c19d725e03c07de6708f3c2d092e0b9aea69c2 100644 +index d64c68651b7142869a06ce0200fb625cd45ae235..1fe317cf3251bff7bb3e0335452a5714d4d31017 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java -@@ -261,7 +261,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -276,7 +276,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin public int useItemRemaining; protected int fallFlyTicks; private long lastKineticHitFeedbackTime = -2147483648L; diff --git a/lophine-server/minecraft-patches/features/0032-Leaves-Creative-fly-no-clip.patch b/lophine-server/minecraft-patches/features/0032-Leaves-Creative-fly-no-clip.patch index 39351d8..326fcc4 100644 --- a/lophine-server/minecraft-patches/features/0032-Leaves-Creative-fly-no-clip.patch +++ b/lophine-server/minecraft-patches/features/0032-Leaves-Creative-fly-no-clip.patch @@ -8,10 +8,10 @@ As a part of : Leaves (https://github.com/LeavesMC/Leaves/blob/da12a58e8d3bd3cd1 Licensed under: GPL-3.0 (https://www.gnu.org/licenses/gpl-3.0.html) diff --git a/net/minecraft/world/entity/ExperienceOrb.java b/net/minecraft/world/entity/ExperienceOrb.java -index e302c6198d71782b524391329aa5c89d2b3e0ccf..2312803297321f66c9057bc54ce56dd17ecb6f1f 100644 +index 700c9c0d40dee1df6c97f7c63ad731f16bc5f3e7..b95c56e0699fbe16e65efcf010cd514f0ac0962f 100644 --- a/net/minecraft/world/entity/ExperienceOrb.java +++ b/net/minecraft/world/entity/ExperienceOrb.java -@@ -199,7 +199,7 @@ public class ExperienceOrb extends Entity { +@@ -204,7 +204,7 @@ public class ExperienceOrb extends Entity { Player prevTarget = this.followingPlayer; // CraftBukkit - store old target if (this.followingPlayer == null || this.followingPlayer.isSpectator() || this.followingPlayer.distanceToSqr(this) > 64.0) { Player nearestPlayer = this.level().getNearestPlayer(this, 8.0); @@ -21,10 +21,10 @@ index e302c6198d71782b524391329aa5c89d2b3e0ccf..2312803297321f66c9057bc54ce56dd1 } else { this.followingPlayer = null; diff --git a/net/minecraft/world/entity/player/Player.java b/net/minecraft/world/entity/player/Player.java -index 20a76138a8625663cf608e4ef97cc8ca4085b844..97057675369875ed71c228a87f5a4d3c3489dded 100644 +index f063e9b7601480d0e66da22ea8e5bec2e8619fee..d46abbea2153cac2d939416fafeac7f905fe0e02 100644 --- a/net/minecraft/world/entity/player/Player.java +++ b/net/minecraft/world/entity/player/Player.java -@@ -280,8 +280,8 @@ public abstract class Player extends Avatar implements ContainerUser { +@@ -284,8 +284,8 @@ public abstract class Player extends Avatar implements ContainerUser { if (this.cullTask != null) this.cullTask.requestCullSignal(); // Luminol - Ray tracing entity tracker // Luminol end @@ -35,7 +35,7 @@ index 20a76138a8625663cf608e4ef97cc8ca4085b844..97057675369875ed71c228a87f5a4d3c this.setOnGround(false); } -@@ -407,7 +407,7 @@ public abstract class Player extends Avatar implements ContainerUser { +@@ -411,7 +411,7 @@ public abstract class Player extends Avatar implements ContainerUser { if (this.canPlayerFitWithinBlocksAndEntitiesWhen(Pose.SWIMMING)) { Pose desiredPose = this.getDesiredPose(); Pose actualPose; @@ -44,7 +44,7 @@ index 20a76138a8625663cf608e4ef97cc8ca4085b844..97057675369875ed71c228a87f5a4d3c actualPose = desiredPose; } else if (this.canPlayerFitWithinBlocksAndEntitiesWhen(Pose.CROUCHING)) { actualPose = Pose.CROUCHING; -@@ -536,7 +536,7 @@ public abstract class Player extends Avatar implements ContainerUser { +@@ -540,7 +540,7 @@ public abstract class Player extends Avatar implements ContainerUser { this.updateSwingTime(); this.yHeadRot = this.getYRot(); this.setSpeed((float)this.getAttributeValue(Attributes.MOVEMENT_SPEED)); @@ -53,7 +53,7 @@ index 20a76138a8625663cf608e4ef97cc8ca4085b844..97057675369875ed71c228a87f5a4d3c AABB pickupArea; if (this.isPassenger() && !this.getVehicle().isRemoved()) { pickupArea = this.getBoundingBox().minmax(this.getVehicle().getBoundingBox()).inflate(1.0, 0.0, 1.0); -@@ -1849,6 +1849,26 @@ public abstract class Player extends Avatar implements ContainerUser { +@@ -1872,6 +1872,26 @@ public abstract class Player extends Avatar implements ContainerUser { return this.gameMode() == GameType.SPECTATOR; } @@ -81,10 +81,10 @@ index 20a76138a8625663cf608e4ef97cc8ca4085b844..97057675369875ed71c228a87f5a4d3c public boolean isPickable() { return !this.isSpectator() && super.isPickable(); diff --git a/net/minecraft/world/item/BlockItem.java b/net/minecraft/world/item/BlockItem.java -index 2e2a8af12f249ec5bd0935fd13f5acbd0a777b5f..07b84bd0144e133d13e8e033a8998f3cf674f746 100644 +index f4b68c02c2beea4438cb4cd212ad70c78cfc68d3..4e31e25df5d57086027413bb5e6aa0e4f39452c7 100644 --- a/net/minecraft/world/item/BlockItem.java +++ b/net/minecraft/world/item/BlockItem.java -@@ -158,8 +158,9 @@ public class BlockItem extends Item { +@@ -160,8 +160,9 @@ public class BlockItem extends Item { Player player = context.getPlayer(); // CraftBukkit start Level world = context.getLevel(); // Paper - Cancel hit for vanished players @@ -96,7 +96,7 @@ index 2e2a8af12f249ec5bd0935fd13f5acbd0a777b5f..07b84bd0144e133d13e8e033a8998f3c org.bukkit.event.block.BlockCanBuildEvent event = new org.bukkit.event.block.BlockCanBuildEvent( diff --git a/net/minecraft/world/item/StandingAndWallBlockItem.java b/net/minecraft/world/item/StandingAndWallBlockItem.java -index cb0a4a9865df69e5504a86de6c144bc4450bd19a..596fb91fccb4c8d6854fa859f9ee357c6d22a81e 100644 +index 1f17f966882320b3a2ced50b3f73925cd0dfa14c..5a75df997c9026bcc740823d7039c8e426ea345a 100644 --- a/net/minecraft/world/item/StandingAndWallBlockItem.java +++ b/net/minecraft/world/item/StandingAndWallBlockItem.java @@ -44,7 +44,7 @@ public class StandingAndWallBlockItem extends BlockItem { @@ -109,7 +109,7 @@ index cb0a4a9865df69e5504a86de6c144bc4450bd19a..596fb91fccb4c8d6854fa859f9ee357c org.bukkit.event.block.BlockCanBuildEvent event = new org.bukkit.event.block.BlockCanBuildEvent(org.bukkit.craftbukkit.block.CraftBlock.at(context.getLevel(), pos), player, stateForPlacement.asBlockData(), defaultReturn, org.bukkit.craftbukkit.CraftEquipmentSlot.getHand(context.getHand())); // Paper - Expose hand in BlockCanBuildEvent diff --git a/net/minecraft/world/level/block/entity/ShulkerBoxBlockEntity.java b/net/minecraft/world/level/block/entity/ShulkerBoxBlockEntity.java -index 6205f52ecad24f80d21b924945c5ff06c6704aca..d84159df4d2a0379ffbb6bdb0807b4a02dbec71e 100644 +index 8025fec49e6b9550d6154d6e735c6a39a2352f24..2c27de099c203b51b0fb317a8160402b3189e41c 100644 --- a/net/minecraft/world/level/block/entity/ShulkerBoxBlockEntity.java +++ b/net/minecraft/world/level/block/entity/ShulkerBoxBlockEntity.java @@ -153,7 +153,7 @@ public class ShulkerBoxBlockEntity extends RandomizableContainerBlockEntity impl @@ -122,7 +122,7 @@ index 6205f52ecad24f80d21b924945c5ff06c6704aca..d84159df4d2a0379ffbb6bdb0807b4a0 MoverType.SHULKER_BOX, new Vec3( diff --git a/net/minecraft/world/level/block/piston/PistonMovingBlockEntity.java b/net/minecraft/world/level/block/piston/PistonMovingBlockEntity.java -index 2ecb10fe97d15954e44c61247eabc8818eb16f34..22663ad55f669081b43644ad2cf1bd4aac48b745 100644 +index 15605dacaec3860e476a70dbdd3743e4197f67a6..199f23547fded9b7d311b9cf21484d863748fd1c 100644 --- a/net/minecraft/world/level/block/piston/PistonMovingBlockEntity.java +++ b/net/minecraft/world/level/block/piston/PistonMovingBlockEntity.java @@ -168,7 +168,7 @@ public class PistonMovingBlockEntity extends BlockEntity { diff --git a/lophine-server/minecraft-patches/features/0033-Leaves-Wool-Hopper-Counter.patch b/lophine-server/minecraft-patches/features/0033-Leaves-Wool-Hopper-Counter.patch index c1696b2..3fb4c8f 100644 --- a/lophine-server/minecraft-patches/features/0033-Leaves-Wool-Hopper-Counter.patch +++ b/lophine-server/minecraft-patches/features/0033-Leaves-Wool-Hopper-Counter.patch @@ -10,40 +10,40 @@ Licensed under: MIT This patch is Powered by fabric-carpet(https://github.com/gnembon/fabric-carpet) diff --git a/net/minecraft/world/level/block/entity/HopperBlockEntity.java b/net/minecraft/world/level/block/entity/HopperBlockEntity.java -index d036018ee64995ee754296014888ee70c0ea5ab3..aa782c6441cdce3eb39aefb28d40f3b1970d4e62 100644 +index 7d35b299533640338aeea6e5617942e89269d048..569f96a1b0b8a03b6a70775f4b7f58a66feed939 100644 --- a/net/minecraft/world/level/block/entity/HopperBlockEntity.java +++ b/net/minecraft/world/level/block/entity/HopperBlockEntity.java -@@ -239,8 +239,30 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen - changed |= action.getAsBoolean(); // Paper - note: this is not a validator, it's what adds/sucks in items - } +@@ -240,8 +240,30 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen + changed |= action.getAsBoolean(); + } -+ // Leaves start - Wool hopper counter -+ if (fun.bm.lophine.config.modules.function.WoolHopperCounterConfig.unlimitedSpeed && org.leavesmc.leaves.util.HopperCounter.isEnabled()) { -+ net.minecraft.world.item.DyeColor woolColor = org.leavesmc.leaves.util.WoolUtils.getWoolColorAtPosition(level, entity.getBlockPos().relative(state.getValue(HopperBlock.FACING))); -+ if (woolColor != null) { -+ for (int i = 0; i < Short.MAX_VALUE; i++) { -+ changed |= suckInItems(level, entity); -+ if (!changed) { -+ break; -+ } else { -+ woolHopperCounter(level, pos, state, HopperBlockEntity.getContainerAt(level, pos)); -+ } ++ // Leaves start - Wool hopper counter ++ if (fun.bm.lophine.config.modules.function.WoolHopperCounterConfig.unlimitedSpeed && org.leavesmc.leaves.util.HopperCounter.isEnabled()) { ++ net.minecraft.world.item.DyeColor woolColor = org.leavesmc.leaves.util.WoolUtils.getWoolColorAtPosition(level, entity.getBlockPos().relative(state.getValue(HopperBlock.FACING))); ++ if (woolColor != null) { ++ for (int i = 0; i < Short.MAX_VALUE; i++) { ++ changed |= suckInItems(level, entity); ++ if (!changed) { ++ break; ++ } else { ++ woolHopperCounter(level, pos, state, HopperBlockEntity.getContainerAt(level, pos)); + } + } + } -+ // Leaves end - Wool hopper counter ++ } ++ // Leaves end - Wool hopper counter + - if (changed) { - entity.setCooldown(level.spigotConfig.hopperTransfer); // Spigot -+ // Leaves start - Wool hopper counter -+ if (fun.bm.lophine.config.modules.function.WoolHopperCounterConfig.unlimitedSpeed && org.leavesmc.leaves.util.HopperCounter.isEnabled() && woolHopperCounter(level, pos, state, HopperBlockEntity.getContainerAt(level, pos))) { -+ entity.setCooldown(0); -+ return true; -+ } -+ // Leaves end - Wool hopper counter - setChanged(level, pos, state); - // Leaves start - Lithium Sleeping Block Entity - if (me.earthme.luminol.config.modules.optimizations.LeavesSleepingBlockEntityConfig.enabled + if (changed) { + entity.setCooldown(level.spigotConfig.hopperTransfer); // Spigot ++ // Leaves start - Wool hopper counter ++ if (fun.bm.lophine.config.modules.function.WoolHopperCounterConfig.unlimitedSpeed && org.leavesmc.leaves.util.HopperCounter.isEnabled() && woolHopperCounter(level, pos, state, HopperBlockEntity.getContainerAt(level, pos))) { ++ entity.setCooldown(0); ++ return true; ++ } ++ // Leaves end - Wool hopper counter + setChanged(level, pos, state); + // Leaves start - Lithium Sleeping Block Entity + if (me.earthme.luminol.config.modules.optimizations.LeavesSleepingBlockEntityConfig.enabled @@ -491,6 +513,13 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen // Paper end - Perf: Optimize Hoppers @@ -59,7 +59,7 @@ index d036018ee64995ee754296014888ee70c0ea5ab3..aa782c6441cdce3eb39aefb28d40f3b1 if (container == null) { return false; @@ -512,6 +541,26 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen - } + return hopperPush(level, container, direction, self); // Paper - Perf: Optimize Hoppers } + // Leaves start - hopper counter diff --git a/lophine-server/minecraft-patches/features/0034-Global-Entities-Counter.patch b/lophine-server/minecraft-patches/features/0034-Global-Entities-Counter.patch index a29e91f..633d441 100644 --- a/lophine-server/minecraft-patches/features/0034-Global-Entities-Counter.patch +++ b/lophine-server/minecraft-patches/features/0034-Global-Entities-Counter.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Global Entities Counter diff --git a/io/papermc/paper/threadedregions/RegionizedWorldData.java b/io/papermc/paper/threadedregions/RegionizedWorldData.java -index eedbeb005d3c8090333c36b9857c837dfb75dbd4..5817f087187e9d3479c752129a1a9d853623a3f7 100644 +index 6a90942f4fc3c0b366aadf7a4cead6f684eba1cd..fd9a69e3ca28923d6fd75f6fc819c7952a0474ea 100644 --- a/io/papermc/paper/threadedregions/RegionizedWorldData.java +++ b/io/papermc/paper/threadedregions/RegionizedWorldData.java @@ -558,6 +558,9 @@ public final class RegionizedWorldData { @@ -35,10 +35,10 @@ index eedbeb005d3c8090333c36b9857c837dfb75dbd4..5817f087187e9d3479c752129a1a9d85 this.updateTickData(); } diff --git a/net/minecraft/server/level/ServerChunkCache.java b/net/minecraft/server/level/ServerChunkCache.java -index 27389ff98942e27c2a877ea5b671caa31353d18c..e9e5f929d638d3ddf279423d3e23b3f824ad7df2 100644 +index c3b14503e1bd9025730febc883bead942beb61f7..591576938f2916125781c94fb1027270c77d8e38 100644 --- a/net/minecraft/server/level/ServerChunkCache.java +++ b/net/minecraft/server/level/ServerChunkCache.java -@@ -513,6 +513,25 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon +@@ -511,6 +511,25 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon this.chunkMap.tick(haveTime); profiler.pop(); this.clearCache(); @@ -64,7 +64,7 @@ index 27389ff98942e27c2a877ea5b671caa31353d18c..e9e5f929d638d3ddf279423d3e23b3f8 } private void tickChunks() { -@@ -577,7 +596,13 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon +@@ -575,7 +594,13 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon } spawnCookie = NaturalSpawner.createState(chunkCount, regionizedWorldData.getLoadedEntities(), this::getFullChunk, null, true); // Folia - region threading - note: function only cares about loaded entities, doesn't need all } else { @@ -79,7 +79,7 @@ index 27389ff98942e27c2a877ea5b671caa31353d18c..e9e5f929d638d3ddf279423d3e23b3f8 } } finally { foliaProfiler.stopTimer(ca.spottedleaf.leafprofiler.LProfilerRegistry.MOB_SPAWN_ENTITY_COUNT); } // Folia - profiler // Paper end - Optional per player mob spawns -@@ -585,7 +610,7 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon +@@ -583,7 +608,7 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon boolean doMobSpawning = this.level.getGameRules().get(GameRules.SPAWN_MOBS) && !this.level.getLocalPlayers().isEmpty(); // CraftBukkit // Folia - region threading int tickSpeed = this.level.getGameRules().get(GameRules.RANDOM_TICK_SPEED); List spawningCategories; @@ -88,7 +88,7 @@ index 27389ff98942e27c2a877ea5b671caa31353d18c..e9e5f929d638d3ddf279423d3e23b3f8 // Paper start - PlayerNaturallySpawnCreaturesEvent for (ServerPlayer player : this.level.getLocalPlayers()) { // Folia - region threading int chunkRange = Math.min(level.spigotConfig.mobSpawnRange, player.getBukkitEntity().getViewDistance()); -@@ -645,7 +670,7 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon +@@ -643,7 +668,7 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon this.level.tickThunder(chunk); } @@ -98,10 +98,10 @@ index 27389ff98942e27c2a877ea5b671caa31353d18c..e9e5f929d638d3ddf279423d3e23b3f8 NaturalSpawner.spawnForChunk(this.level, chunk, spawnCookie, spawningCategories); } diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java -index a7cebb797973cde399dc30c696b064efd40874f2..c0e62a69bb5c9e777265b5474d76ba8d06ccec4b 100644 +index f75249ba1b02efec0f4fc381b02803228e3e1d7c..93d2d2bef01b312ee11c3cdd673ee23b56e2157b 100644 --- a/net/minecraft/server/level/ServerLevel.java +++ b/net/minecraft/server/level/ServerLevel.java -@@ -808,6 +808,11 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet +@@ -822,6 +822,11 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet } public void tick(BooleanSupplier haveTime, final io.papermc.paper.threadedregions.TickRegions.TickRegionData region) { // Folia - regionised ticking @@ -114,10 +114,10 @@ index a7cebb797973cde399dc30c696b064efd40874f2..c0e62a69bb5c9e777265b5474d76ba8d final ca.spottedleaf.leafprofiler.RegionizedProfiler.Handle foliaProfiler = io.papermc.paper.threadedregions.TickRegionScheduler.getProfiler(); // Folia - profiler ProfilerFiller profiler = Profiler.get(); diff --git a/net/minecraft/world/entity/Mob.java b/net/minecraft/world/entity/Mob.java -index fc29654dd7ee3329edf1ccf705f45631d0ecc079..9b8ee2df5a0b6d76d9bfc747187f6cd51bb4a520 100644 +index e7ebdbb8d77f841551c5ebb0f8e7b4402f6a4751..5edd1a3806b7eb1f767395e9eaa134e24921b842 100644 --- a/net/minecraft/world/entity/Mob.java +++ b/net/minecraft/world/entity/Mob.java -@@ -813,6 +813,44 @@ public abstract class Mob extends LivingEntity implements Targeting, EquipmentUs +@@ -826,6 +826,44 @@ public abstract class Mob extends LivingEntity implements Targeting, EquipmentUs } } } else { @@ -163,7 +163,7 @@ index fc29654dd7ee3329edf1ccf705f45631d0ecc079..9b8ee2df5a0b6d76d9bfc747187f6cd5 } } diff --git a/net/minecraft/world/level/NaturalSpawner.java b/net/minecraft/world/level/NaturalSpawner.java -index b3b8160927147468c1dd4a30fac51f96a9d60c9a..cd20d10ee4cd2fe98131c9a93367ae133f96b8d4 100644 +index 500dcbe924fca160bd673592e1aba384f6eb9ed2..0d8d2459457167d78a9a9ea43765980240416947 100644 --- a/net/minecraft/world/level/NaturalSpawner.java +++ b/net/minecraft/world/level/NaturalSpawner.java @@ -121,7 +121,7 @@ public final class NaturalSpawner { @@ -175,7 +175,7 @@ index b3b8160927147468c1dd4a30fac51f96a9d60c9a..cd20d10ee4cd2fe98131c9a93367ae13 return chunk.getNoiseBiome(QuartPos.fromBlock(pos.getX()), QuartPos.fromBlock(pos.getY()), QuartPos.fromBlock(pos.getZ())).value(); } -@@ -628,7 +628,7 @@ public final class NaturalSpawner { +@@ -625,7 +625,7 @@ public final class NaturalSpawner { private @Nullable EntityType lastCheckedType; private double lastCharge; diff --git a/lophine-server/minecraft-patches/features/0035-Leaves-Catch-update-suppression-crash.patch b/lophine-server/minecraft-patches/features/0035-Leaves-Catch-update-suppression-crash.patch index ae542be..c0f4f13 100644 --- a/lophine-server/minecraft-patches/features/0035-Leaves-Catch-update-suppression-crash.patch +++ b/lophine-server/minecraft-patches/features/0035-Leaves-Catch-update-suppression-crash.patch @@ -8,10 +8,10 @@ As a part of : Leaves (https://github.com/LeavesMC/Leaves) Licensed under: GPL-3.0 (https://www.gnu.org/licenses/gpl-3.0.html) diff --git a/net/minecraft/network/PacketProcessor.java b/net/minecraft/network/PacketProcessor.java -index 24f5b890b0126fc817863f99b676da1a548f7608..a25bc31c04778bf12e3b6301ffcfb2275fcc2d90 100644 +index 10fa576838c726d026df078eef6c693d14c2cbda..03c4fab3f9be4f69d8c418e6fdd88211cb1b6ff7 100644 --- a/net/minecraft/network/PacketProcessor.java +++ b/net/minecraft/network/PacketProcessor.java -@@ -106,7 +106,23 @@ public class PacketProcessor implements AutoCloseable { +@@ -105,7 +105,23 @@ public class PacketProcessor implements AutoCloseable { final int packetTimerId = profiler.getOrCreateTimerAndStart(() -> "Packet Handler: ".concat(ListenerAndPacket.this.packet.getClass().getName())); try { // Folia - profiler this.packet.handle(this.listener); } finally { profiler.stopTimer(packetTimerId); } // Folia - profiler @@ -22,9 +22,9 @@ index 24f5b890b0126fc817863f99b676da1a548f7608..a25bc31c04778bf12e3b6301ffcfb227 + } + exception.consume(); + // Lophine end - catch update suppression crash - } catch (Exception var3) { + } catch (Exception e) { + // Lophine start - catch update suppression crash -+ if (var3.getCause() instanceof org.leavesmc.leaves.util.UpdateSuppressionException exception) { ++ if (e.getCause() instanceof org.leavesmc.leaves.util.UpdateSuppressionException exception) { + if (this.listener instanceof net.minecraft.server.network.ServerGamePacketListenerImpl gamePacketListener) { + exception.providePlayer(gamePacketListener.player); + } @@ -32,14 +32,14 @@ index 24f5b890b0126fc817863f99b676da1a548f7608..a25bc31c04778bf12e3b6301ffcfb227 + } + + // Lophine end - catch update suppression crash - if (var3 instanceof ReportedException re && re.getCause() instanceof OutOfMemoryError) { - throw PacketUtils.makeReportedException(var3, this.packet, this.listener); + if (e instanceof ReportedException re && re.getCause() instanceof OutOfMemoryError) { + throw PacketUtils.makeReportedException(e, this.packet, this.listener); } diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java -index f99c02b4d88cea924e20ca8dced67873c83c093f..0c042c4af5d52c08e9fbc03a04c4b696d8a0a7ed 100644 +index d7a7f7e7daf45bc0912aae008f3fed35201925fe..8bbb30c16d14981a21731e090b5aa2e4a48528a7 100644 --- a/net/minecraft/server/MinecraftServer.java +++ b/net/minecraft/server/MinecraftServer.java -@@ -2019,11 +2019,30 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop implements ca.spottedleaf.moonrise.patch +@@ -117,7 +117,16 @@ public abstract class StateHolder implements ca.spottedleaf.moonrise.patch if (ret != null) { return ret; } @@ -182,32 +184,32 @@ index b72861c0164ebb13b6fc3e78cd7ce0a2c484f22d..5bf43973c8de8c2f33d384f28fdd0686 } diff --git a/net/minecraft/world/level/chunk/LevelChunk.java b/net/minecraft/world/level/chunk/LevelChunk.java -index 3708f9ffc46a5b1c038c0e7b2ce84802e2b22397..241c43170b5020c1521f43d349813586ba1f69a5 100644 +index 1affb71bb629f5c8923cc2993052c8037ead9798..a71b37b391ceaf1a77b9e184fd37be86b6c818dd 100644 --- a/net/minecraft/world/level/chunk/LevelChunk.java +++ b/net/minecraft/world/level/chunk/LevelChunk.java -@@ -400,6 +400,8 @@ public class LevelChunk extends ChunkAccess implements DebugValueSource, ca.spot - return null; - } else { - Block newBlock = state.getBlock(); -+ // Lophine start - catch update suppression crash -+ try { - this.heightmaps.get(Heightmap.Types.MOTION_BLOCKING).update(localX, y, localZ, state); - this.heightmaps.get(Heightmap.Types.MOTION_BLOCKING_NO_LEAVES).update(localX, y, localZ, state); - this.heightmaps.get(Heightmap.Types.OCEAN_FLOOR).update(localX, y, localZ, state); -@@ -468,6 +470,11 @@ public class LevelChunk extends ChunkAccess implements DebugValueSource, ca.spot - this.markUnsaved(); - return oldState; - } -+ } catch (org.leavesmc.leaves.util.UpdateSuppressionException exception) { -+ exception.provideBlock(this.level, pos, newBlock); -+ throw exception; -+ } -+ // Lophine end - catch update suppression crash - } +@@ -401,6 +401,8 @@ public class LevelChunk extends ChunkAccess implements DebugValueSource, ca.spot } + + Block newBlock = state.getBlock(); ++ // Lophine start - catch update suppression crash ++ try { + this.heightmaps.get(Heightmap.Types.MOTION_BLOCKING).update(localX, y, localZ, state); + this.heightmaps.get(Heightmap.Types.MOTION_BLOCKING_NO_LEAVES).update(localX, y, localZ, state); + this.heightmaps.get(Heightmap.Types.OCEAN_FLOOR).update(localX, y, localZ, state); +@@ -469,6 +471,11 @@ public class LevelChunk extends ChunkAccess implements DebugValueSource, ca.spot + + this.markUnsaved(); + return oldState; ++ } catch (org.leavesmc.leaves.util.UpdateSuppressionException exception) { ++ exception.provideBlock(this.level, pos, newBlock); ++ throw exception; ++ } ++ // Lophine end - catch update suppression crash } + + @Deprecated diff --git a/net/minecraft/world/level/redstone/NeighborUpdater.java b/net/minecraft/world/level/redstone/NeighborUpdater.java -index 9b8d63f69ed1101f1b7b2728690e35165b9aeb99..6358787f3c7dcfa599b2949613236fa8de025096 100644 +index 44dbe6f83c8593c213132feabc7fe27615cb0049..90145a3ea384b568897ee665b80b24cccba1b6c5 100644 --- a/net/minecraft/world/level/redstone/NeighborUpdater.java +++ b/net/minecraft/world/level/redstone/NeighborUpdater.java @@ -87,9 +87,24 @@ public interface NeighborUpdater { @@ -221,17 +223,17 @@ index 9b8d63f69ed1101f1b7b2728690e35165b9aeb99..6358787f3c7dcfa599b2949613236fa8 + // Lophine end - catch update suppression crash level.lastPhysicsProblem = pos.immutable(); // Spigot end - } catch (Throwable var9) { + } catch (Throwable t) { + // Lophine start - catch update suppression crash + if (fun.bm.lophine.carpet.config.modules.GeneralCompatConfig.mergedUpdateSuppressionCrashEnabled()) { -+ if (var9 instanceof org.leavesmc.leaves.util.UpdateSuppressionException exception) { ++ if (t instanceof org.leavesmc.leaves.util.UpdateSuppressionException exception) { + exception.provideBlock(level, pos, changedBlock); + throw exception; + } -+ throw new org.leavesmc.leaves.util.UpdateSuppressionException(pos, level, changedBlock, null, var9); ++ throw new org.leavesmc.leaves.util.UpdateSuppressionException(pos, level, changedBlock, null, t); + } + + // Lophine end - catch update suppression crash - CrashReport report = CrashReport.forThrowable(var9, "Exception while updating neighbours"); + CrashReport report = CrashReport.forThrowable(t, "Exception while updating neighbours"); CrashReportCategory category = report.addCategory("Block being updated"); category.setDetail( diff --git a/lophine-server/minecraft-patches/features/0036-Leaves-CCE-update-suppression.patch b/lophine-server/minecraft-patches/features/0036-Leaves-CCE-update-suppression.patch index 5d85af9..35914e1 100644 --- a/lophine-server/minecraft-patches/features/0036-Leaves-CCE-update-suppression.patch +++ b/lophine-server/minecraft-patches/features/0036-Leaves-CCE-update-suppression.patch @@ -8,10 +8,10 @@ As a part of : Leaves (https://github.com/LeavesMC/Leaves) Licensed under: GPL-3.0 (https://www.gnu.org/licenses/gpl-3.0.html) diff --git a/net/minecraft/world/level/block/ShulkerBoxBlock.java b/net/minecraft/world/level/block/ShulkerBoxBlock.java -index f9dacc278200b05acb385e1f1cbf858e43d0d9f4..722ce78461b2303f99493c309345697cfc98fb99 100644 +index f347e27ac957c1cdcaaf29f61fdc2ca4bdc36dbb..0dc80ee92f2aed4c8ca4bc60f4b189af764fe81d 100644 --- a/net/minecraft/world/level/block/ShulkerBoxBlock.java +++ b/net/minecraft/world/level/block/ShulkerBoxBlock.java -@@ -183,7 +183,11 @@ public class ShulkerBoxBlock extends BaseEntityBlock { +@@ -185,7 +185,11 @@ public class ShulkerBoxBlock extends BaseEntityBlock { protected int getAnalogOutputSignal(final BlockState state, final Level level, final BlockPos pos, final Direction direction) { // Lophine start - catch update suppression crash try { diff --git a/lophine-server/minecraft-patches/features/0037-Leaves-Redstone-ignore-upwards-update.patch b/lophine-server/minecraft-patches/features/0037-Leaves-Redstone-ignore-upwards-update.patch index ac86fb5..bca1acd 100644 --- a/lophine-server/minecraft-patches/features/0037-Leaves-Redstone-ignore-upwards-update.patch +++ b/lophine-server/minecraft-patches/features/0037-Leaves-Redstone-ignore-upwards-update.patch @@ -10,7 +10,7 @@ As a part of : Leaves (https://github.com/LeavesMC/Leaves) Licensed under: GPL-3.0 (https://www.gnu.org/licenses/gpl-3.0.html) diff --git a/net/minecraft/world/level/block/ComparatorBlock.java b/net/minecraft/world/level/block/ComparatorBlock.java -index 45e11737bc2558a4ebfffe133d43111f45dd7d16..db80f0b400c7356c5524ea799354e6c44de14700 100644 +index 499311de746f868c092e34ff5fffeb37ec8e338a..eac6501e9242bb5b550bab1aeab4868602eb097b 100644 --- a/net/minecraft/world/level/block/ComparatorBlock.java +++ b/net/minecraft/world/level/block/ComparatorBlock.java @@ -59,6 +59,11 @@ public class ComparatorBlock extends DiodeBlock implements EntityBlock { @@ -26,7 +26,7 @@ index 45e11737bc2558a4ebfffe133d43111f45dd7d16..db80f0b400c7356c5524ea799354e6c4 ? Blocks.AIR.defaultBlockState() : super.updateShape(state, level, ticks, pos, directionToNeighbour, neighbourPos, neighbourState, random); diff --git a/net/minecraft/world/level/block/RedStoneWireBlock.java b/net/minecraft/world/level/block/RedStoneWireBlock.java -index 759eb347299813c20226cc2fc5dc7718d12b7f56..30a7208a698a8bd3ba8a08ace6f23b206d90f6a3 100644 +index 957c45b39e9d6f74fb9791ecd121b0e2bd6bc732..973d423a9ab5a6a3338f43c27f6d99d7b7d94301 100644 --- a/net/minecraft/world/level/block/RedStoneWireBlock.java +++ b/net/minecraft/world/level/block/RedStoneWireBlock.java @@ -179,7 +179,11 @@ public class RedStoneWireBlock extends Block { @@ -39,9 +39,9 @@ index 759eb347299813c20226cc2fc5dc7718d12b7f56..30a7208a698a8bd3ba8a08ace6f23b20 + ? state + : !this.canSurviveOn(level, neighbourPos, neighbourState) ? Blocks.AIR.defaultBlockState() : state; + // Lophine end - redstone ignore upwards update - } else if (directionToNeighbour == Direction.UP) { - return this.getConnectionState(level, state, pos); - } else { + } + + if (directionToNeighbour == Direction.UP) { @@ -243,7 +247,10 @@ public class RedStoneWireBlock extends Block { BlockPos relativePos = pos.relative(direction); BlockState relativeState = level.getBlockState(relativePos); @@ -55,7 +55,7 @@ index 759eb347299813c20226cc2fc5dc7718d12b7f56..30a7208a698a8bd3ba8a08ace6f23b20 if (relativeState.isFaceSturdy(level, relativePos, direction.getOpposite())) { return RedstoneSide.UP; diff --git a/net/minecraft/world/level/block/RepeaterBlock.java b/net/minecraft/world/level/block/RepeaterBlock.java -index d301ca4c91e75d715998aa7ed155fd44ccd64785..1985602b11a584fc70b1bb9ca4c643757d4c0ed3 100644 +index 407d1025dbc7c57114c07e41789f12a36d39952d..800539bae071c845864a390f0346707abb899657 100644 --- a/net/minecraft/world/level/block/RepeaterBlock.java +++ b/net/minecraft/world/level/block/RepeaterBlock.java @@ -70,6 +70,11 @@ public class RepeaterBlock extends DiodeBlock { diff --git a/lophine-server/minecraft-patches/features/0038-Instant-Block-Updater.patch b/lophine-server/minecraft-patches/features/0038-Instant-Block-Updater.patch index 41d1a95..0a2531e 100644 --- a/lophine-server/minecraft-patches/features/0038-Instant-Block-Updater.patch +++ b/lophine-server/minecraft-patches/features/0038-Instant-Block-Updater.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Instant Block Updater diff --git a/io/papermc/paper/threadedregions/RegionizedWorldData.java b/io/papermc/paper/threadedregions/RegionizedWorldData.java -index 5817f087187e9d3479c752129a1a9d853623a3f7..1d50a626c15fba4947c966e46f38e7684511e9fe 100644 +index fd9a69e3ca28923d6fd75f6fc819c7952a0474ea..b758dddb768adde0f22d043b42cbd1094dbdf994 100644 --- a/io/papermc/paper/threadedregions/RegionizedWorldData.java +++ b/io/papermc/paper/threadedregions/RegionizedWorldData.java @@ -506,7 +506,7 @@ public final class RegionizedWorldData { @@ -38,10 +38,10 @@ index 5817f087187e9d3479c752129a1a9d853623a3f7..1d50a626c15fba4947c966e46f38e768 \ No newline at end of file +} diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java -index 3e7420cd98504732db17cb6b0fcfdfbb8deeb552..257b440a0eea379433e9a249175c8eb16c37accb 100644 +index 68d65784cfa9c6d19447bbaaa15220f5656a385a..45e00cf1f069d15b13331323c33c7622ee651ddd 100644 --- a/net/minecraft/server/level/ServerLevel.java +++ b/net/minecraft/server/level/ServerLevel.java -@@ -1001,11 +1001,15 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet +@@ -1016,11 +1016,15 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet // Paper - rewrite chunk system profiler.pop(); profiler.push("debugSynchronizers"); diff --git a/lophine-server/minecraft-patches/features/0039-Revert-TrapDoorBlock-changes-form-Paper.patch b/lophine-server/minecraft-patches/features/0039-Revert-TrapDoorBlock-changes-form-Paper.patch index adb0a79..c349725 100644 --- a/lophine-server/minecraft-patches/features/0039-Revert-TrapDoorBlock-changes-form-Paper.patch +++ b/lophine-server/minecraft-patches/features/0039-Revert-TrapDoorBlock-changes-form-Paper.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Revert TrapDoorBlock changes form Paper diff --git a/net/minecraft/world/level/block/TrapDoorBlock.java b/net/minecraft/world/level/block/TrapDoorBlock.java -index cfc8b668980e0cba74b3f0d42c4902eb6aa8b01e..f01894c230b1ae4add3e20329e8dc87571d2c793 100644 +index 614f70a520d13f6fe422ac7e42808c813fb3506d..eb36bea7d3dd593539cdbc6938f1fe29df58dadf 100644 --- a/net/minecraft/world/level/block/TrapDoorBlock.java +++ b/net/minecraft/world/level/block/TrapDoorBlock.java -@@ -133,31 +133,7 @@ public class TrapDoorBlock extends HorizontalDirectionalBlock implements SimpleW +@@ -129,31 +129,7 @@ public class TrapDoorBlock extends HorizontalDirectionalBlock implements SimpleW if (!level.isClientSide()) { boolean signal = level.hasNeighborSignal(pos); if (signal != state.getValue(POWERED)) { diff --git a/lophine-server/minecraft-patches/features/0040-Leaves-Prevent-loss-of-item-drops-due-to-update-supp.patch b/lophine-server/minecraft-patches/features/0040-Leaves-Prevent-loss-of-item-drops-due-to-update-supp.patch index fee315f..31bfc00 100644 --- a/lophine-server/minecraft-patches/features/0040-Leaves-Prevent-loss-of-item-drops-due-to-update-supp.patch +++ b/lophine-server/minecraft-patches/features/0040-Leaves-Prevent-loss-of-item-drops-due-to-update-supp.patch @@ -9,14 +9,14 @@ As a part of : Leaves (https://github.com/LeavesMC/Leaves/blob/ea91106ae57fc4cc1 Licensed under: GPL-3.0 (https://www.gnu.org/licenses/gpl-3.0.html) diff --git a/net/minecraft/server/level/ServerPlayerGameMode.java b/net/minecraft/server/level/ServerPlayerGameMode.java -index e1de10e1a0ec221a1109a03d86fddf47b1c06a5f..71cc37515c268abd698896d514b66cb49859691c 100644 +index 13e981bfd070d9351d8880478b5a86e39bcd73ad..d0ac2d15388e842ed56ec39ecdbc99994e0617bc 100644 --- a/net/minecraft/server/level/ServerPlayerGameMode.java +++ b/net/minecraft/server/level/ServerPlayerGameMode.java -@@ -392,7 +392,18 @@ public class ServerPlayerGameMode { - this.level.getCurrentWorldData().captureDrops = new java.util.ArrayList<>(); // Folia - region threading - // CraftBukkit end - BlockState adjustedState = block.playerWillDestroy(this.level, pos, state, this.player); -- boolean changed = this.level.removeBlock(pos, false); +@@ -394,7 +394,18 @@ public class ServerPlayerGameMode { + this.level.getCurrentWorldData().captureDrops = new java.util.ArrayList<>(); // Folia - region threading + // CraftBukkit end + BlockState adjustedState = block.playerWillDestroy(this.level, pos, state, this.player); +- boolean changed = this.level.removeBlock(pos, false); + // Lophine start - preserve drops before update suppression + boolean changed; + org.leavesmc.leaves.util.UpdateSuppressionException updateSuppressionException = null; @@ -29,18 +29,18 @@ index e1de10e1a0ec221a1109a03d86fddf47b1c06a5f..71cc37515c268abd698896d514b66cb4 + changed = false; + } + // Lophine end - preserve drops before update suppression - if (SharedConstants.DEBUG_BLOCK_BREAK) { - LOGGER.info("server broke {} {} -> {}", pos, adjustedState, this.level.getBlockState(pos)); - } -@@ -424,6 +435,11 @@ public class ServerPlayerGameMode { - if (event.isDropItems()) { - org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockDropItemEvent(bblock, bState, this.player, itemsToDrop); // Paper - capture all item additions to the world - } + if (SharedConstants.DEBUG_BLOCK_BREAK) { + LOGGER.info("server broke {} {} -> {}", pos, adjustedState, this.level.getBlockState(pos)); + } +@@ -422,6 +433,11 @@ public class ServerPlayerGameMode { + if (event.isDropItems()) { + org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockDropItemEvent(bblock, bState, this.player, itemsToDrop); // Paper - capture all item additions to the world + } + // Lophine start - preserve drops before update suppression + if (updateSuppressionException != null) { + throw updateSuppressionException; + } + // Lophine end - preserve drops before update suppression - // Drop event experience - if (changed) { + // Drop event experience + if (changed) { diff --git a/lophine-server/minecraft-patches/features/0041-Leaves-Do-not-reset-placed-block-on-exception-Do-not.patch b/lophine-server/minecraft-patches/features/0041-Leaves-Do-not-reset-placed-block-on-exception-Do-not.patch index 5a54d51..1bfd743 100644 --- a/lophine-server/minecraft-patches/features/0041-Leaves-Do-not-reset-placed-block-on-exception-Do-not.patch +++ b/lophine-server/minecraft-patches/features/0041-Leaves-Do-not-reset-placed-block-on-exception-Do-not.patch @@ -9,42 +9,42 @@ As a part of : Leaves (https://github.com/LeavesMC/Leaves) Licensed under: GPL-3.0 (https://www.gnu.org/licenses/gpl-3.0.html) diff --git a/net/minecraft/world/item/BlockItem.java b/net/minecraft/world/item/BlockItem.java -index 07b84bd0144e133d13e8e033a8998f3cf674f746..9c016e7d93e4c44ddf2df520e5c57d92a0e085b3 100644 +index 4e31e25df5d57086027413bb5e6aa0e4f39452c7..02b8f4aa4aefea0391ab4ce6d634f3a050c80f5a 100644 --- a/net/minecraft/world/item/BlockItem.java +++ b/net/minecraft/world/item/BlockItem.java -@@ -69,20 +69,8 @@ public class BlockItem extends Item { - BlockState placedState = level.getBlockState(pos); - if (placedState.is(placementState.getBlock())) { - placedState = this.updateBlockStateFromTag(pos, level, itemStack, placedState); -- // Paper start - Reset placed block on exception -- try { - this.updateCustomBlockEntityTag(pos, level, player, itemStack, placedState); - updateBlockEntityComponents(level, pos, itemStack); -- } catch (Exception ex) { -- ((org.bukkit.craftbukkit.block.CraftBlockState) previousState).revertPlace(); -- if (player instanceof ServerPlayer serverPlayer) { -- net.minecraft.server.MinecraftServer.LOGGER.warn("Player {} tried placing invalid block", player.getScoreboardName(), ex); -- serverPlayer.connection.disconnect(net.minecraft.network.chat.Component.literal("Packet processing error")); -- return InteractionResult.FAIL; -- } -- throw ex; // Rethrow exception if not placed by a player -- } -- // Paper end - Reset placed block on exception - placedState.getBlock().setPlacedBy(level, pos, placedState, player, itemStack); - // CraftBukkit start - special case for handling block placement with water lilies, frog spawn and snow buckets - if (player != null && (this instanceof PlaceOnWaterBlockItem || this instanceof SolidBucketItem)) { +@@ -76,20 +76,8 @@ public class BlockItem extends Item { + BlockState placedState = level.getBlockState(pos); + if (placedState.is(placementState.getBlock())) { + placedState = this.updateBlockStateFromTag(pos, level, itemStack, placedState); +- // Paper start - Reset placed block on exception +- try { + this.updateCustomBlockEntityTag(pos, level, player, itemStack, placedState); + updateBlockEntityComponents(level, pos, itemStack); +- } catch (Exception ex) { +- ((org.bukkit.craftbukkit.block.CraftBlockState) previousState).revertPlace(false); +- if (player instanceof ServerPlayer serverPlayer) { +- net.minecraft.server.MinecraftServer.LOGGER.warn("Player {} tried placing invalid block", player.getScoreboardName(), ex); +- serverPlayer.connection.disconnect(net.minecraft.network.chat.Component.literal("Packet processing error"), org.bukkit.event.player.PlayerKickEvent.Cause.ILLEGAL_ACTION); +- return InteractionResult.FAIL; +- } +- throw ex; // Rethrow exception if not placed by a player +- } +- // Paper end - Reset placed block on exception + placedState.getBlock().setPlacedBy(level, pos, placedState, player, itemStack); + // CraftBukkit start - special case for handling block placement with water lilies, frog spawn and snow buckets + if (player != null && (this instanceof PlaceOnWaterBlockItem || this instanceof SolidBucketItem)) { diff --git a/net/minecraft/world/level/chunk/LevelChunk.java b/net/minecraft/world/level/chunk/LevelChunk.java -index 241c43170b5020c1521f43d349813586ba1f69a5..316b8d45b0902b1bf01a77307e24fc9a47d1283b 100644 +index a71b37b391ceaf1a77b9e184fd37be86b6c818dd..51e7c9287bc39d1ffaa60946c009711acdfa8572 100644 --- a/net/minecraft/world/level/chunk/LevelChunk.java +++ b/net/minecraft/world/level/chunk/LevelChunk.java -@@ -1017,12 +1017,6 @@ public class LevelChunk extends ChunkAccess implements DebugValueSource, ca.spot +@@ -1018,12 +1018,6 @@ public class LevelChunk extends ChunkAccess implements DebugValueSource, ca.spot profiler.pop(); - } catch (Throwable var5) { + } catch (Throwable t) { - // Paper start - Prevent block entity and entity crashes - final String msg = String.format("BlockEntity threw exception at %s:%s,%s,%s", io.papermc.paper.util.MCUtil.getLevelName(LevelChunk.this.getLevel()), this.getPos().getX(), this.getPos().getY(), this.getPos().getZ()); -- net.minecraft.server.MinecraftServer.LOGGER.error(msg, var5); -- net.minecraft.world.level.chunk.LevelChunk.this.level.getCraftServer().getPluginManager().callEvent(new com.destroystokyo.paper.event.server.ServerExceptionEvent(new com.destroystokyo.paper.exception.ServerInternalException(msg, var5))); // Paper - ServerExceptionEvent +- LevelChunk.LOGGER.error(msg, t); +- LevelChunk.this.level.getCraftServer().getPluginManager().callEvent(new com.destroystokyo.paper.event.server.ServerExceptionEvent(new com.destroystokyo.paper.exception.ServerInternalException(msg, t))); // Paper - ServerExceptionEvent - LevelChunk.this.removeBlockEntity(this.getPos()); - // Paper end - Prevent block entity and entity crashes } diff --git a/lophine-server/minecraft-patches/features/0042-Leaves-Old-Block-remove-behaviour.patch b/lophine-server/minecraft-patches/features/0042-Leaves-Old-Block-remove-behaviour.patch index 3658271..694f2f2 100644 --- a/lophine-server/minecraft-patches/features/0042-Leaves-Old-Block-remove-behaviour.patch +++ b/lophine-server/minecraft-patches/features/0042-Leaves-Old-Block-remove-behaviour.patch @@ -8,7 +8,7 @@ As a part of : Leaves (https://github.com/LeavesMC/Leaves) Licensed under: GPL-3.0 (https://www.gnu.org/licenses/gpl-3.0.html) diff --git a/net/minecraft/world/Containers.java b/net/minecraft/world/Containers.java -index 1311d4936f84652c5ffc51544f99cb98fc293906..3a62831838a60776159dcb1ca783d3f00e6cd35e 100644 +index e9e2ef680cfc72cd47fa13d72c03619d2f1ca5fc..6370f0eb9039941687d37a0fe387fbd676ec151b 100644 --- a/net/minecraft/world/Containers.java +++ b/net/minecraft/world/Containers.java @@ -51,4 +51,16 @@ public class Containers { @@ -61,7 +61,7 @@ index 98561dcc465ca9d5394e58b05ad3e8dc59773ebc..72e3d6c1ce3389972df21d5ff6e4d74b protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { Containers.updateNeighboursAfterDestroy(state, level, pos); diff --git a/net/minecraft/world/level/block/BarrelBlock.java b/net/minecraft/world/level/block/BarrelBlock.java -index 5332fd32fa7a0d3fc3be1b0a7c2ca5dee8e402c6..37667a8e512bdba385c563e950d8c5d5cdd18832 100644 +index 7bb880bfa9008a431acfd7c5d543f1e5a4bb67b2..58e92db685204660b41de9bfc0a5092383c8ec18 100644 --- a/net/minecraft/world/level/block/BarrelBlock.java +++ b/net/minecraft/world/level/block/BarrelBlock.java @@ -51,6 +51,15 @@ public class BarrelBlock extends BaseEntityBlock { @@ -81,7 +81,7 @@ index 5332fd32fa7a0d3fc3be1b0a7c2ca5dee8e402c6..37667a8e512bdba385c563e950d8c5d5 protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { Containers.updateNeighboursAfterDestroy(state, level, pos); diff --git a/net/minecraft/world/level/block/BasePressurePlateBlock.java b/net/minecraft/world/level/block/BasePressurePlateBlock.java -index c2fbf44e93e44c36423465d406b5e4d3db029a80..a28a453f139295834c77aa908027c74c8dfd7aba 100644 +index f2d7c5fc0339a62c4fc56aa5871cd999e1136ca6..75d8bd8f7f3614dbdc89088fc12eb05b317ea0e0 100644 --- a/net/minecraft/world/level/block/BasePressurePlateBlock.java +++ b/net/minecraft/world/level/block/BasePressurePlateBlock.java @@ -133,6 +133,20 @@ public abstract class BasePressurePlateBlock extends Block { @@ -106,11 +106,11 @@ index c2fbf44e93e44c36423465d406b5e4d3db029a80..a28a453f139295834c77aa908027c74c protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { if (!movedByPiston && this.getSignalForState(state) > 0) { diff --git a/net/minecraft/world/level/block/BaseRailBlock.java b/net/minecraft/world/level/block/BaseRailBlock.java -index bc79a7c2cb18237dad15432ae7e1238125108696..5ef16955c69f0e0fecc772067a0fb006e6413011 100644 +index dff6c7868065c93c8b1a8b41a3323b3f1cec4e02..f7030ffad37e30c38a94e3672cd4872755319550 100644 --- a/net/minecraft/world/level/block/BaseRailBlock.java +++ b/net/minecraft/world/level/block/BaseRailBlock.java -@@ -123,6 +123,24 @@ public abstract class BaseRailBlock extends Block implements SimpleWaterloggedBl - } +@@ -118,6 +118,24 @@ public abstract class BaseRailBlock extends Block implements SimpleWaterloggedBl + return new RailState(level, pos, state).place(level.hasNeighborSignal(pos), first, current).getState(); } + // Leaves start - behaviour 1.21.1- @@ -135,10 +135,10 @@ index bc79a7c2cb18237dad15432ae7e1238125108696..5ef16955c69f0e0fecc772067a0fb006 protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { if (!movedByPiston) { diff --git a/net/minecraft/world/level/block/BrewingStandBlock.java b/net/minecraft/world/level/block/BrewingStandBlock.java -index aea12aad3270b966eed7779eaf77d26052f8a21f..6c39edf98f33df437880a77450557082ea9b0f6c 100644 +index 5f14be7cd9abe30292c4c6c614d048cd1e0a9c1f..73f1c44acc9d296b523d5b6ba5978d0e0a2659cc 100644 --- a/net/minecraft/world/level/block/BrewingStandBlock.java +++ b/net/minecraft/world/level/block/BrewingStandBlock.java -@@ -80,6 +80,15 @@ public class BrewingStandBlock extends BaseEntityBlock { +@@ -81,6 +81,15 @@ public class BrewingStandBlock extends BaseEntityBlock { level.addParticle(ParticleTypes.SMOKE, x, y, z, 0.0, 0.0, 0.0); } @@ -155,7 +155,7 @@ index aea12aad3270b966eed7779eaf77d26052f8a21f..6c39edf98f33df437880a77450557082 protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { Containers.updateNeighboursAfterDestroy(state, level, pos); diff --git a/net/minecraft/world/level/block/ButtonBlock.java b/net/minecraft/world/level/block/ButtonBlock.java -index 86f4dcd959bb83247c6d2c5e947c79230aed3189..1b0223f1d533d1a8db5497ab9104052bc799f691 100644 +index 9c859b04519f78988e765a164cf39cd8a99447df..2e6fb4f2021e6f008b85b7c0160f51c0e496ee8c 100644 --- a/net/minecraft/world/level/block/ButtonBlock.java +++ b/net/minecraft/world/level/block/ButtonBlock.java @@ -131,6 +131,20 @@ public class ButtonBlock extends FaceAttachedHorizontalDirectionalBlock { @@ -180,10 +180,10 @@ index 86f4dcd959bb83247c6d2c5e947c79230aed3189..1b0223f1d533d1a8db5497ab9104052b protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { if (!movedByPiston && state.getValue(POWERED)) { diff --git a/net/minecraft/world/level/block/CampfireBlock.java b/net/minecraft/world/level/block/CampfireBlock.java -index 8b706b34914326c039b761387f25e488f30fe6c8..b816594fcd83d26037734ec051f2c5d7f7dbde9f 100644 +index 4a24a36e022356d44a77306028ef2c09cd221fa5..d882980c4a956bd4b6c7f2ad9e71634f4fda41e5 100644 --- a/net/minecraft/world/level/block/CampfireBlock.java +++ b/net/minecraft/world/level/block/CampfireBlock.java -@@ -111,6 +111,21 @@ public class CampfireBlock extends BaseEntityBlock implements SimpleWaterloggedB +@@ -112,6 +112,21 @@ public class CampfireBlock extends BaseEntityBlock implements SimpleWaterloggedB return InteractionResult.TRY_WITH_EMPTY_HAND; } @@ -206,10 +206,10 @@ index 8b706b34914326c039b761387f25e488f30fe6c8..b816594fcd83d26037734ec051f2c5d7 protected void entityInside( final BlockState state, diff --git a/net/minecraft/world/level/block/ChestBlock.java b/net/minecraft/world/level/block/ChestBlock.java -index d3f0680d59ec87990b54dc3dbce27706bfadf5f1..b5595d87339e4d313c5691a06c2b1b3d1b40b6de 100644 +index 4bd84b80199c7f625475ca62da02266d871a8639..70a0d30552d42d91778e0524bb89f6619c1fd0b0 100644 --- a/net/minecraft/world/level/block/ChestBlock.java +++ b/net/minecraft/world/level/block/ChestBlock.java -@@ -257,6 +257,15 @@ public class ChestBlock extends AbstractChestBlock implements +@@ -253,6 +253,15 @@ public class ChestBlock extends AbstractChestBlock implements return this.chestCanConnectTo(state) && state.getValue(TYPE) == ChestType.SINGLE ? state.getValue(FACING) : null; } @@ -226,11 +226,11 @@ index d3f0680d59ec87990b54dc3dbce27706bfadf5f1..b5595d87339e4d313c5691a06c2b1b3d protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { Containers.updateNeighboursAfterDestroy(state, level, pos); diff --git a/net/minecraft/world/level/block/ChiseledBookShelfBlock.java b/net/minecraft/world/level/block/ChiseledBookShelfBlock.java -index 0682acaae12650549eea3c291d8cde7bb17766bd..ac12ef0c99c82d771e5275ec7ced7f76c76f5938 100644 +index b7d7f1acf8e5cb3dddb7fb39fe003d25a9a41840..2627dd2687c67301279dbbb10e36d4db72fceb8b 100644 --- a/net/minecraft/world/level/block/ChiseledBookShelfBlock.java +++ b/net/minecraft/world/level/block/ChiseledBookShelfBlock.java -@@ -168,6 +168,28 @@ public class ChiseledBookShelfBlock extends BaseEntityBlock implements Selectabl - SLOT_OCCUPIED_PROPERTIES.forEach(property -> builder.add(property)); +@@ -171,6 +171,28 @@ public class ChiseledBookShelfBlock extends BaseEntityBlock implements Selectabl + SLOT_OCCUPIED_PROPERTIES.forEach(xva$0 -> var2.add(xva$0)); } + // Leaves start - behaviour 1.21.1- @@ -259,10 +259,10 @@ index 0682acaae12650549eea3c291d8cde7bb17766bd..ac12ef0c99c82d771e5275ec7ced7f76 protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { Containers.updateNeighboursAfterDestroy(state, level, pos); diff --git a/net/minecraft/world/level/block/CrafterBlock.java b/net/minecraft/world/level/block/CrafterBlock.java -index 2b97fd6af1c4956eb173b8c66c2a3efc8772a798..90326fe95673edbf5ed8c1a5d9020735fdd4d53e 100644 +index 08c67084b5347bb1d6e65f17f3365ff33b542ec0..a2f2f0af4dc1df950e6d76717757a52231884857 100644 --- a/net/minecraft/world/level/block/CrafterBlock.java +++ b/net/minecraft/world/level/block/CrafterBlock.java -@@ -130,6 +130,15 @@ public class CrafterBlock extends BaseEntityBlock { +@@ -131,6 +131,15 @@ public class CrafterBlock extends BaseEntityBlock { } } @@ -279,10 +279,10 @@ index 2b97fd6af1c4956eb173b8c66c2a3efc8772a798..90326fe95673edbf5ed8c1a5d9020735 protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { Containers.updateNeighboursAfterDestroy(state, level, pos); diff --git a/net/minecraft/world/level/block/CreakingHeartBlock.java b/net/minecraft/world/level/block/CreakingHeartBlock.java -index 3dd5f8c20ad68e0bd6222c8ba1687df0b2ad3b0d..b2e1e78cd70e20dd1c17ef0199059fc2b4e513b5 100644 +index 57292f216052110c5f03e8f3fe51709c87b7995c..837c2dad0800577fd2dd5cfff25fe18bd7dd14e7 100644 --- a/net/minecraft/world/level/block/CreakingHeartBlock.java +++ b/net/minecraft/world/level/block/CreakingHeartBlock.java -@@ -152,6 +152,17 @@ public class CreakingHeartBlock extends BaseEntityBlock { +@@ -153,6 +153,17 @@ public class CreakingHeartBlock extends BaseEntityBlock { builder.add(AXIS, STATE, NATURAL); } @@ -301,7 +301,7 @@ index 3dd5f8c20ad68e0bd6222c8ba1687df0b2ad3b0d..b2e1e78cd70e20dd1c17ef0199059fc2 protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { Containers.updateNeighboursAfterDestroy(state, level, pos); diff --git a/net/minecraft/world/level/block/DecoratedPotBlock.java b/net/minecraft/world/level/block/DecoratedPotBlock.java -index 3ce41ce3f9d2bf7a79e4b9811e043a69e0dedb13..2856b4081cddb38bac5c1d7199649a7531ef077f 100644 +index 1c131955ba7a01348d9d9d5cf733d107c2531915..b6f18ac0fa511d11c28e3fd2c020b70efabbe0c1 100644 --- a/net/minecraft/world/level/block/DecoratedPotBlock.java +++ b/net/minecraft/world/level/block/DecoratedPotBlock.java @@ -172,6 +172,15 @@ public class DecoratedPotBlock extends BaseEntityBlock implements SimpleWaterlog @@ -321,10 +321,10 @@ index 3ce41ce3f9d2bf7a79e4b9811e043a69e0dedb13..2856b4081cddb38bac5c1d7199649a75 protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { Containers.updateNeighboursAfterDestroy(state, level, pos); diff --git a/net/minecraft/world/level/block/DiodeBlock.java b/net/minecraft/world/level/block/DiodeBlock.java -index 3457a1fa8f5efc4bf173bf155165ab5e5ae9f303..1342607e3bf28ca085f51ade22efaf34f19da170 100644 +index 5e0bd45aad738b0bc15404494e5e004b375f8a71..b79b457f0e618e680b072f0263c7e0481876c748 100644 --- a/net/minecraft/world/level/block/DiodeBlock.java +++ b/net/minecraft/world/level/block/DiodeBlock.java -@@ -180,6 +180,17 @@ public abstract class DiodeBlock extends HorizontalDirectionalBlock { +@@ -182,6 +182,17 @@ public abstract class DiodeBlock extends HorizontalDirectionalBlock { if (me.earthme.luminol.config.modules.optimizations.LeavesSleepingBlockEntityConfig.enabled && this instanceof ComparatorBlock && !oldState.is(Blocks.COMPARATOR)) org.leavesmc.leaves.lithium.common.block.entity.inventory_comparator_tracking.ComparatorTracking.notifyNearbyBlockEntitiesAboutNewComparator(level, pos); // Leaves - Lithium Sleeping Block Entity } @@ -343,10 +343,10 @@ index 3457a1fa8f5efc4bf173bf155165ab5e5ae9f303..1342607e3bf28ca085f51ade22efaf34 protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { if (!movedByPiston) { diff --git a/net/minecraft/world/level/block/DispenserBlock.java b/net/minecraft/world/level/block/DispenserBlock.java -index dca954bd076fa917512af91e0b93d449eb5cac6d..7f880ba7cdd08be392dd4fe5a06fffbf6962318b 100644 +index 754f2a541e80947553c56420bdc962dbcf80d36e..79bb8e34e7a7999b10e19cebc2a7b08ba3571684 100644 --- a/net/minecraft/world/level/block/DispenserBlock.java +++ b/net/minecraft/world/level/block/DispenserBlock.java -@@ -159,6 +159,15 @@ public class DispenserBlock extends BaseEntityBlock { +@@ -161,6 +161,15 @@ public class DispenserBlock extends BaseEntityBlock { return this.defaultBlockState().setValue(FACING, context.getNearestLookingDirection().getOpposite()); } @@ -363,10 +363,10 @@ index dca954bd076fa917512af91e0b93d449eb5cac6d..7f880ba7cdd08be392dd4fe5a06fffbf protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { Containers.updateNeighboursAfterDestroy(state, level, pos); diff --git a/net/minecraft/world/level/block/HopperBlock.java b/net/minecraft/world/level/block/HopperBlock.java -index 88606b84ea3a33ffbb0cfa6e073eb8f59d7188d0..c3ccebd7f27fd4d313cbcd616d58180a70f5f574 100644 +index 1095c94d7adb8e6baa51bf3cb8a31000592aa990..9cc6ca5b329f8cd62620b9cdbfcbf4c2b668d108 100644 --- a/net/minecraft/world/level/block/HopperBlock.java +++ b/net/minecraft/world/level/block/HopperBlock.java -@@ -139,6 +139,15 @@ public class HopperBlock extends BaseEntityBlock implements org.leavesmc.leaves. +@@ -140,6 +140,15 @@ public class HopperBlock extends BaseEntityBlock implements org.leavesmc.leaves. } } @@ -383,11 +383,11 @@ index 88606b84ea3a33ffbb0cfa6e073eb8f59d7188d0..c3ccebd7f27fd4d313cbcd616d58180a protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { Containers.updateNeighboursAfterDestroy(state, level, pos); diff --git a/net/minecraft/world/level/block/JukeboxBlock.java b/net/minecraft/world/level/block/JukeboxBlock.java -index a9e46a66ffc868c3b4ef2bb6257f23a20f12b1a6..cee96a825f0e0e740ede8df0bf6dc5256b9fb8d3 100644 +index f202953a0eacfa61635ad1b13e4dbf9960e004ec..b544b959634e458f482ea863b7a4b28b5de61765 100644 --- a/net/minecraft/world/level/block/JukeboxBlock.java +++ b/net/minecraft/world/level/block/JukeboxBlock.java -@@ -82,6 +82,20 @@ public class JukeboxBlock extends BaseEntityBlock { - } +@@ -83,6 +83,20 @@ public class JukeboxBlock extends BaseEntityBlock { + return !result.consumesAction() ? InteractionResult.TRY_WITH_EMPTY_HAND : result; } + // Leaves start - behaviour 1.21.1- @@ -408,7 +408,7 @@ index a9e46a66ffc868c3b4ef2bb6257f23a20f12b1a6..cee96a825f0e0e740ede8df0bf6dc525 protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { Containers.updateNeighboursAfterDestroy(state, level, pos); diff --git a/net/minecraft/world/level/block/LecternBlock.java b/net/minecraft/world/level/block/LecternBlock.java -index 75660fb19c25444e35dbbe58cd20f9b3d3f7ad32..196051c80baa489f43065a11a61f22a8c61251e7 100644 +index b5ac0a094d7c67afe59716857cef425e11545054..b1fa698160e9ebd950758bfe04381d85ad253859 100644 --- a/net/minecraft/world/level/block/LecternBlock.java +++ b/net/minecraft/world/level/block/LecternBlock.java @@ -200,6 +200,37 @@ public class LecternBlock extends BaseEntityBlock { @@ -450,7 +450,7 @@ index 75660fb19c25444e35dbbe58cd20f9b3d3f7ad32..196051c80baa489f43065a11a61f22a8 protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { if (state.getValue(POWERED)) { diff --git a/net/minecraft/world/level/block/LeverBlock.java b/net/minecraft/world/level/block/LeverBlock.java -index 341960ef67a689f660d0dcf61aaf5bf52bdc9074..6fc372e782f2a34a34a9ef1faed41ace6db5ec1b 100644 +index 772a1cb8b275506ed0310294369b985746f8f567..2a05139db15858991202b53e380b47cde43393b2 100644 --- a/net/minecraft/world/level/block/LeverBlock.java +++ b/net/minecraft/world/level/block/LeverBlock.java @@ -127,6 +127,20 @@ public class LeverBlock extends FaceAttachedHorizontalDirectionalBlock { @@ -475,7 +475,7 @@ index 341960ef67a689f660d0dcf61aaf5bf52bdc9074..6fc372e782f2a34a34a9ef1faed41ace protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { if (!movedByPiston && state.getValue(POWERED)) { diff --git a/net/minecraft/world/level/block/LightningRodBlock.java b/net/minecraft/world/level/block/LightningRodBlock.java -index 47ca45518df306cc4368983eefb89294e56b015a..31be8864aa28eff804b507efdab614b35e3fea6f 100644 +index c2001c9475e0773fb84b987afcf2d02ae136af3a..871a802fce141b3a36acab6b899349754f5d81e1 100644 --- a/net/minecraft/world/level/block/LightningRodBlock.java +++ b/net/minecraft/world/level/block/LightningRodBlock.java @@ -123,6 +123,19 @@ public class LightningRodBlock extends RodBlock implements SimpleWaterloggedBloc @@ -499,10 +499,10 @@ index 47ca45518df306cc4368983eefb89294e56b015a..31be8864aa28eff804b507efdab614b3 protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { if (state.getValue(POWERED)) { diff --git a/net/minecraft/world/level/block/ObserverBlock.java b/net/minecraft/world/level/block/ObserverBlock.java -index 6a3413ca875ce78f48cd8d3ce2cfe7798be1a19e..be572eff561ffdd961a9602eaa6136761c4d48a4 100644 +index 680a357db27407e2dc21c615fadaf9754421c361..1d68ebf02f4e83a69fc30f36e0b9f688799210c3 100644 --- a/net/minecraft/world/level/block/ObserverBlock.java +++ b/net/minecraft/world/level/block/ObserverBlock.java -@@ -128,6 +128,18 @@ public class ObserverBlock extends DirectionalBlock { +@@ -133,6 +133,18 @@ public class ObserverBlock extends DirectionalBlock { } } @@ -522,7 +522,7 @@ index 6a3413ca875ce78f48cd8d3ce2cfe7798be1a19e..be572eff561ffdd961a9602eaa613676 protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { if (state.getValue(POWERED) && level.getBlockTicks().hasScheduledTick(pos, this)) { diff --git a/net/minecraft/world/level/block/RedStoneWireBlock.java b/net/minecraft/world/level/block/RedStoneWireBlock.java -index 30a7208a698a8bd3ba8a08ace6f23b206d90f6a3..7f5b77cd9cb78e693bbe1efd3d5fd7256d7700c5 100644 +index 973d423a9ab5a6a3338f43c27f6d99d7b7d94301..1ccacb7ffa7e8b9c3fdd37910d3e8bded86a4d3a 100644 --- a/net/minecraft/world/level/block/RedStoneWireBlock.java +++ b/net/minecraft/world/level/block/RedStoneWireBlock.java @@ -382,6 +382,28 @@ public class RedStoneWireBlock extends Block { @@ -555,7 +555,7 @@ index 30a7208a698a8bd3ba8a08ace6f23b206d90f6a3..7f5b77cd9cb78e693bbe1efd3d5fd725 protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { if (!movedByPiston) { diff --git a/net/minecraft/world/level/block/RedstoneTorchBlock.java b/net/minecraft/world/level/block/RedstoneTorchBlock.java -index 0d0b5443c5c56825e88fd64c02c993eca6044d45..e2e5552008547fa1782b0a5ed3129162e94647c9 100644 +index 1434dd70d443a6aa7312740d901e5dc40fd926d2..e41f4453e482874e66ec3f4ddfbfaf28de345c6d 100644 --- a/net/minecraft/world/level/block/RedstoneTorchBlock.java +++ b/net/minecraft/world/level/block/RedstoneTorchBlock.java @@ -54,6 +54,16 @@ public class RedstoneTorchBlock extends BaseTorchBlock { @@ -576,10 +576,10 @@ index 0d0b5443c5c56825e88fd64c02c993eca6044d45..e2e5552008547fa1782b0a5ed3129162 protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { if (!movedByPiston) { diff --git a/net/minecraft/world/level/block/SculkSensorBlock.java b/net/minecraft/world/level/block/SculkSensorBlock.java -index 2bbce50d9dd0ca65f9e3bc90c8de098473039bc5..9a9fcb593c4b5f2bb0c57f9268dfdc9eb21d38ea 100644 +index 10cff0f9db2910c543c20fa055c0c5b759becc15..cf349086b8d3faffbe971b3c47fd819b6c7b0502 100644 --- a/net/minecraft/world/level/block/SculkSensorBlock.java +++ b/net/minecraft/world/level/block/SculkSensorBlock.java -@@ -129,6 +129,19 @@ public class SculkSensorBlock extends BaseEntityBlock implements SimpleWaterlogg +@@ -130,6 +130,19 @@ public class SculkSensorBlock extends BaseEntityBlock implements SimpleWaterlogg } } @@ -600,10 +600,10 @@ index 2bbce50d9dd0ca65f9e3bc90c8de098473039bc5..9a9fcb593c4b5f2bb0c57f9268dfdc9e protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { if (getPhase(state) == SculkSensorPhase.ACTIVE) { diff --git a/net/minecraft/world/level/block/SculkShriekerBlock.java b/net/minecraft/world/level/block/SculkShriekerBlock.java -index d7e5ec23c64b60c47ab6b54cbf282e88c3a4a045..037aa3592a963bbb142465d31040f60e95cb146e 100644 +index 5a15671202a0129b1ce97fae5515ddefa5b3fb01..099a1e75f48ca6a2a8eb83571f5c06674b88f3d8 100644 --- a/net/minecraft/world/level/block/SculkShriekerBlock.java +++ b/net/minecraft/world/level/block/SculkShriekerBlock.java -@@ -68,6 +68,17 @@ public class SculkShriekerBlock extends BaseEntityBlock implements SimpleWaterlo +@@ -69,6 +69,17 @@ public class SculkShriekerBlock extends BaseEntityBlock implements SimpleWaterlo super.stepOn(level, pos, onState, entity); } @@ -611,7 +611,7 @@ index d7e5ec23c64b60c47ab6b54cbf282e88c3a4a045..037aa3592a963bbb142465d31040f60e + @Override + protected void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean movedByPiston) { + if (level instanceof ServerLevel serverLevel && state.getValue(SHRIEKING) && !state.is(newState.getBlock())) { -+ serverLevel.getBlockEntity(pos, BlockEntityType.SCULK_SHRIEKER).ifPresent(sculkShrieker -> sculkShrieker.tryRespond(serverLevel)); ++ serverLevel.getBlockEntity(pos, BlockEntityTypes.SCULK_SHRIEKER).ifPresent(sculkShrieker -> sculkShrieker.tryRespond(serverLevel)); + } + super.onRemove(state, level, pos, newState, movedByPiston); + } @@ -622,10 +622,10 @@ index d7e5ec23c64b60c47ab6b54cbf282e88c3a4a045..037aa3592a963bbb142465d31040f60e protected void tick(final BlockState state, final ServerLevel level, final BlockPos pos, final RandomSource random) { if (state.getValue(SHRIEKING)) { diff --git a/net/minecraft/world/level/block/ShulkerBoxBlock.java b/net/minecraft/world/level/block/ShulkerBoxBlock.java -index 722ce78461b2303f99493c309345697cfc98fb99..45dc3e8484842265b26d387d518831ff23da4b5e 100644 +index 0dc80ee92f2aed4c8ca4bc60f4b189af764fe81d..a80535ebb7b4fcc3a6c7b84eb08e275461c7ae36 100644 --- a/net/minecraft/world/level/block/ShulkerBoxBlock.java +++ b/net/minecraft/world/level/block/ShulkerBoxBlock.java -@@ -150,6 +150,20 @@ public class ShulkerBoxBlock extends BaseEntityBlock { +@@ -152,6 +152,20 @@ public class ShulkerBoxBlock extends BaseEntityBlock { // Paper end - re-set loot table if it was cleared } @@ -647,7 +647,7 @@ index 722ce78461b2303f99493c309345697cfc98fb99..45dc3e8484842265b26d387d518831ff protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { Containers.updateNeighboursAfterDestroy(state, level, pos); diff --git a/net/minecraft/world/level/block/TripWireBlock.java b/net/minecraft/world/level/block/TripWireBlock.java -index 04e5995409a3532947dfab1c8ef05bd546a6f66d..6bf811477a27bbbeeeba6c9d768d33fc677ea5e7 100644 +index e19a82ebb7b3be71e51ac28914de58fab32a708e..76aed7ac9fc908dc066001afcaf7e57355233143 100644 --- a/net/minecraft/world/level/block/TripWireBlock.java +++ b/net/minecraft/world/level/block/TripWireBlock.java @@ -107,6 +107,17 @@ public class TripWireBlock extends Block { @@ -669,7 +669,7 @@ index 04e5995409a3532947dfab1c8ef05bd546a6f66d..6bf811477a27bbbeeeba6c9d768d33fc protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { if (io.papermc.paper.configuration.GlobalConfiguration.get().blockUpdates.disableTripwireUpdates) return; // Paper - prevent adjacent tripwires from updating diff --git a/net/minecraft/world/level/block/TripWireHookBlock.java b/net/minecraft/world/level/block/TripWireHookBlock.java -index fd808353181e05f2fc527a391ce7bb990f61b4c7..836eae0c3e0891a3e3309b684f15d65f891215cf 100644 +index 49b3f9e78ae9db257b653a6094619880784c6370..b451f8234e92c36fa1395a80b01dc8780824d88e 100644 --- a/net/minecraft/world/level/block/TripWireHookBlock.java +++ b/net/minecraft/world/level/block/TripWireHookBlock.java @@ -248,6 +248,26 @@ public class TripWireHookBlock extends Block { @@ -700,10 +700,10 @@ index fd808353181e05f2fc527a391ce7bb990f61b4c7..836eae0c3e0891a3e3309b684f15d65f protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { if (!movedByPiston) { diff --git a/net/minecraft/world/level/block/entity/BlockEntityType.java b/net/minecraft/world/level/block/entity/BlockEntityType.java -index ac58bbed01edaf5dfe4839c89649ca865c339c8a..caead1012ff3b5b5f78c24a3baf20b7d00b84cf6 100644 +index ea48b6db56d06ddb12a3b16882e09f0e2eb26433..0a3fec59c53df270c6d7bcc2379e0f6b9d753afd 100644 --- a/net/minecraft/world/level/block/entity/BlockEntityType.java +++ b/net/minecraft/world/level/block/entity/BlockEntityType.java -@@ -301,7 +301,7 @@ public class BlockEntityType { +@@ -28,7 +28,7 @@ public class BlockEntityType { } public boolean isValid(final BlockState state) { @@ -713,11 +713,11 @@ index ac58bbed01edaf5dfe4839c89649ca865c339c8a..caead1012ff3b5b5f78c24a3baf20b7d @Deprecated diff --git a/net/minecraft/world/level/block/piston/MovingPistonBlock.java b/net/minecraft/world/level/block/piston/MovingPistonBlock.java -index 2b6ad989e1e1424d0283bae39e5dae33eba44923..0f47fb528422d591bd03434a089ea69c7f27bf8c 100644 +index 6138c8bd76fc405b67282ac349d41e02a4f9deba..56a397e8a38a960e1334ce65ebb66703ed2e01a4 100644 --- a/net/minecraft/world/level/block/piston/MovingPistonBlock.java +++ b/net/minecraft/world/level/block/piston/MovingPistonBlock.java -@@ -70,6 +70,19 @@ public class MovingPistonBlock extends BaseEntityBlock { - return createTickerHelper(type, BlockEntityType.PISTON, PistonMovingBlockEntity::tick); +@@ -71,6 +71,19 @@ public class MovingPistonBlock extends BaseEntityBlock { + return createTickerHelper(type, BlockEntityTypes.PISTON, PistonMovingBlockEntity::tick); } + // Leaves start - behaviour 1.21.1- @@ -762,10 +762,10 @@ index f8caa0b3c21766dbad73c524c1680346e4257188..b658d602953ade618d89c02745eb46be protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { BlockPos basePos = pos.relative(state.getValue(FACING).getOpposite()); diff --git a/net/minecraft/world/level/block/state/BlockBehaviour.java b/net/minecraft/world/level/block/state/BlockBehaviour.java -index 0fbdf810c785c8a596d461e7651361fdedbb6217..ff1471f40b73582df68efbf2996a854c6aa37d65 100644 +index 7358c75802a37e84e30b1b94a046251d2547a388..972b953a579120c1c05f2dc9bfc2b408d6071d26 100644 --- a/net/minecraft/world/level/block/state/BlockBehaviour.java +++ b/net/minecraft/world/level/block/state/BlockBehaviour.java -@@ -174,6 +174,16 @@ public abstract class BlockBehaviour implements FeatureElement, org.leavesmc.lea +@@ -172,6 +172,16 @@ public abstract class BlockBehaviour implements FeatureElement, org.leavesmc.lea org.spigotmc.AsyncCatcher.catchOp("block onPlace"); // Spigot } @@ -782,7 +782,7 @@ index 0fbdf810c785c8a596d461e7651361fdedbb6217..ff1471f40b73582df68efbf2996a854c protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { } -@@ -889,6 +899,13 @@ public abstract class BlockBehaviour implements FeatureElement, org.leavesmc.lea +@@ -900,6 +910,13 @@ public abstract class BlockBehaviour implements FeatureElement, org.leavesmc.lea // CraftBukkit end } @@ -797,47 +797,26 @@ index 0fbdf810c785c8a596d461e7651361fdedbb6217..ff1471f40b73582df68efbf2996a854c this.getBlock().affectNeighborsAfterRemoval(this.asState(), level, pos, movedByPiston); } diff --git a/net/minecraft/world/level/chunk/LevelChunk.java b/net/minecraft/world/level/chunk/LevelChunk.java -index 316b8d45b0902b1bf01a77307e24fc9a47d1283b..9b3775b0cbca782964e03935331d1bfdd1af140d 100644 +index 51e7c9287bc39d1ffaa60946c009711acdfa8572..c3b32f9c4c2fa17bef629453e3315c12387f5a92 100644 --- a/net/minecraft/world/level/chunk/LevelChunk.java +++ b/net/minecraft/world/level/chunk/LevelChunk.java -@@ -424,22 +424,28 @@ public class LevelChunk extends ChunkAccess implements DebugValueSource, ca.spot - boolean blockChanged = !oldState.is(newBlock); - boolean movedByPiston = (flags & Block.UPDATE_MOVE_BY_PISTON) != 0; - boolean sideEffects = (flags & Block.UPDATE_SKIP_BLOCK_ENTITY_SIDEEFFECTS) == 0; -- if (blockChanged && oldState.hasBlockEntity() && !state.shouldChangedStateKeepBlockEntity(oldState)) { -- if (!this.level.isClientSide() && sideEffects) { -- BlockEntity blockEntity = this.level.getBlockEntity(pos); -- if (blockEntity != null) { -- blockEntity.preRemoveSideEffects(pos, oldState); -+ // Leaves start - behaviour 1.21.1- -+ if (!fun.bm.lophine.config.modules.experiment.RedStoneConfig.oldBlockRemoveBehaviour) { -+ if (blockChanged && oldState.hasBlockEntity() && !state.shouldChangedStateKeepBlockEntity(oldState)) { -+ if (!this.level.isClientSide() && sideEffects) { -+ BlockEntity blockEntity = this.level.getBlockEntity(pos); -+ if (blockEntity != null) { -+ blockEntity.preRemoveSideEffects(pos, oldState); -+ } - } -- } +@@ -425,6 +425,8 @@ public class LevelChunk extends ChunkAccess implements DebugValueSource, ca.spot + boolean blockChanged = !oldState.is(newBlock); + boolean movedByPiston = (flags & Block.UPDATE_MOVE_BY_PISTON) != 0; + boolean sideEffects = (flags & Block.UPDATE_SKIP_BLOCK_ENTITY_SIDEEFFECTS) == 0; ++ // Leaves start - behaviour 1.21.1- ++ if (!fun.bm.lophine.config.modules.experiment.RedStoneConfig.oldBlockRemoveBehaviour) { + if (blockChanged && oldState.hasBlockEntity() && !state.shouldChangedStateKeepBlockEntity(oldState)) { + if (!this.level.isClientSide() && sideEffects) { + BlockEntity blockEntity = this.level.getBlockEntity(pos); +@@ -441,6 +443,10 @@ public class LevelChunk extends ChunkAccess implements DebugValueSource, ca.spot + && ((flags & Block.UPDATE_NEIGHBORS) != 0 || movedByPiston)) { + oldState.affectNeighborsAfterRemoval(serverLevel, pos, movedByPiston); + } ++ } else { ++ oldState.onRemove(this.level, pos, state, movedByPiston); ++ } ++ // Leaves end - behaviour 1.21.1- -- this.removeBlockEntity(pos); -- } -+ this.removeBlockEntity(pos); -+ } - -- if ((blockChanged || newBlock instanceof BaseRailBlock) -- && this.level instanceof ServerLevel serverLevel -- && ((flags & Block.UPDATE_NEIGHBORS) != 0 || movedByPiston)) { -- oldState.affectNeighborsAfterRemoval(serverLevel, pos, movedByPiston); -+ if ((blockChanged || newBlock instanceof BaseRailBlock) -+ && this.level instanceof ServerLevel serverLevel -+ && ((flags & Block.UPDATE_NEIGHBORS) != 0 || movedByPiston)) { -+ oldState.affectNeighborsAfterRemoval(serverLevel, pos, movedByPiston); -+ } -+ } else { -+ oldState.onRemove(this.level, pos, state, movedByPiston); - } -+ // Leaves end - behaviour 1.21.1- - - if (!section.getBlockState(localX, localY, localZ).is(newBlock)) { - return null; + if (!section.getBlockState(localX, localY, localZ).is(newBlock)) { + return null; diff --git a/lophine-server/minecraft-patches/features/0043-MiniTweaks-mob-fire-and-explosion-rules.patch b/lophine-server/minecraft-patches/features/0043-MiniTweaks-mob-fire-and-explosion-rules.patch index 4abc018..c507ea3 100644 --- a/lophine-server/minecraft-patches/features/0043-MiniTweaks-mob-fire-and-explosion-rules.patch +++ b/lophine-server/minecraft-patches/features/0043-MiniTweaks-mob-fire-and-explosion-rules.patch @@ -5,7 +5,7 @@ Subject: [PATCH] MiniTweaks mob fire and explosion rules diff --git a/net/minecraft/world/entity/monster/Creeper.java b/net/minecraft/world/entity/monster/Creeper.java -index 5005f2b923aa94dbc38fb75d5b6f58344888c895..0d4ba81c82b683c32addf6441de3843abf462c3c 100644 +index 4a90294f8d8447bb2f2cef7572119274a1a2c62e..054bfdac44a2bf1d568f2d56b4ae0cb0057862a8 100644 --- a/net/minecraft/world/entity/monster/Creeper.java +++ b/net/minecraft/world/entity/monster/Creeper.java @@ -250,7 +250,8 @@ public class Creeper extends Monster { @@ -19,10 +19,10 @@ index 5005f2b923aa94dbc38fb75d5b6f58344888c895..0d4ba81c82b683c32addf6441de3843a this.triggerOnDeathMobEffects(level, Entity.RemovalReason.KILLED); this.discard(org.bukkit.event.entity.EntityRemoveEvent.Cause.EXPLODE); // CraftBukkit - add Bukkit remove cause diff --git a/net/minecraft/world/entity/projectile/hurtingprojectile/LargeFireball.java b/net/minecraft/world/entity/projectile/hurtingprojectile/LargeFireball.java -index 711b97aa9e49b7edee34c91d77b1005be4fa96bd..1d9232c9061bde9c545e3ee25bc9c6b0417b9ece 100644 +index 8195ab561d12abb33f4359a68b3c1579ce284242..5f79999db6e3ca296a6d018af821fec213bed18a 100644 --- a/net/minecraft/world/entity/projectile/hurtingprojectile/LargeFireball.java +++ b/net/minecraft/world/entity/projectile/hurtingprojectile/LargeFireball.java -@@ -37,7 +37,9 @@ public class LargeFireball extends Fireball { +@@ -38,7 +38,9 @@ public class LargeFireball extends Fireball { // CraftBukkit start - fire ExplosionPrimeEvent org.bukkit.event.entity.ExplosionPrimeEvent event = new org.bukkit.event.entity.ExplosionPrimeEvent((org.bukkit.entity.Explosive) this.getBukkitEntity()); if (event.callEvent()) { @@ -34,10 +34,10 @@ index 711b97aa9e49b7edee34c91d77b1005be4fa96bd..1d9232c9061bde9c545e3ee25bc9c6b0 // CraftBukkit end - fire ExplosionPrimeEvent this.discard(org.bukkit.event.entity.EntityRemoveEvent.Cause.HIT); // CraftBukkit - add Bukkit remove cause diff --git a/net/minecraft/world/entity/projectile/hurtingprojectile/SmallFireball.java b/net/minecraft/world/entity/projectile/hurtingprojectile/SmallFireball.java -index 1a72ee1559f75660796a9cbc1a9d9cdd6883dc90..480042d9401b6d7618fc2f36f16145606414d475 100644 +index ea2ed37063a5f62ad2ade39e9f39f2c2ba6f1772..aae519caab1162af8c7308b81ee33286475b87e6 100644 --- a/net/minecraft/world/entity/projectile/hurtingprojectile/SmallFireball.java +++ b/net/minecraft/world/entity/projectile/hurtingprojectile/SmallFireball.java -@@ -63,7 +63,7 @@ public class SmallFireball extends Fireball { +@@ -64,7 +64,7 @@ public class SmallFireball extends Fireball { super.onHitBlock(hitResult); if (this.level() instanceof ServerLevel serverLevel) { Entity owner = this.getOwner(); diff --git a/lophine-server/minecraft-patches/features/0044-Carpet-features.patch b/lophine-server/minecraft-patches/features/0044-Carpet-features.patch index cbdb34a..5de8c0d 100644 --- a/lophine-server/minecraft-patches/features/0044-Carpet-features.patch +++ b/lophine-server/minecraft-patches/features/0044-Carpet-features.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Carpet features diff --git a/io/papermc/paper/threadedregions/RegionizedServer.java b/io/papermc/paper/threadedregions/RegionizedServer.java -index 6e8ee04967afa410ce9dccff34bf9a43201694fd..4bd923b42d1c98ce7178e05f9324f46d99ffc933 100644 +index 64c9f1d36ac9f02f0dd574ffb995e56a08631bfc..cb68671e513fc812723b2abbdd21e8d6e18cf808 100644 --- a/io/papermc/paper/threadedregions/RegionizedServer.java +++ b/io/papermc/paper/threadedregions/RegionizedServer.java @@ -337,6 +337,7 @@ public final class RegionizedServer { @@ -28,13 +28,13 @@ index 6e8ee04967afa410ce9dccff34bf9a43201694fd..4bd923b42d1c98ce7178e05f9324f46d this.tickConnections(); diff --git a/net/minecraft/commands/arguments/blocks/BlockInput.java b/net/minecraft/commands/arguments/blocks/BlockInput.java -index a4b38651340aff56bb3e3ffd85dea0da538a7532..95f5254b2e84b34b93e53b1aa356ba58cee6b0a9 100644 +index 29dcaa5b33e4f6c649b0918721cfaafe9c74eb01..c7e4f2345c8d48b263eeb537d5fcce3ac43bb59e 100644 --- a/net/minecraft/commands/arguments/blocks/BlockInput.java +++ b/net/minecraft/commands/arguments/blocks/BlockInput.java @@ -65,7 +65,11 @@ public class BlockInput implements Predicate { } - public boolean place(final ServerLevel level, final BlockPos pos, @Block.UpdateFlags final int update) { + public boolean place(final ServerLevel level, final BlockPos pos, final @Block.UpdateFlags int update) { - BlockState state = (update & Block.UPDATE_KNOWN_SHAPE) != 0 ? this.state : Block.updateFromNeighbourShapes(this.state, level, pos); + // Lophine start - Carpet features + BlockState state = (update & Block.UPDATE_KNOWN_SHAPE) != 0 || fun.bm.lophine.carpet.InteractionUpdateCompatHelper.shouldSkipUpdates() @@ -45,7 +45,7 @@ index a4b38651340aff56bb3e3ffd85dea0da538a7532..95f5254b2e84b34b93e53b1aa356ba58 state = this.state; } diff --git a/net/minecraft/core/Direction.java b/net/minecraft/core/Direction.java -index 240fb1346b721e4aaf8517b01fa205760cee4bbd..4879223a54108d1dd1d38b05de96f586f7659ffa 100644 +index 46547155b817a89a8afe2f8d1a30bf881efc07bc..c9a766f14fd2ad7f42af252b702e8ecd9956cb64 100644 --- a/net/minecraft/core/Direction.java +++ b/net/minecraft/core/Direction.java @@ -136,7 +136,7 @@ public enum Direction implements StringRepresentable, ca.spottedleaf.moonrise.pa @@ -58,7 +58,7 @@ index 240fb1346b721e4aaf8517b01fa205760cee4bbd..4879223a54108d1dd1d38b05de96f586 float pitchCos = Mth.cos(pitch); float yawSin = Mth.sin(yaw); diff --git a/net/minecraft/network/chat/SignedMessageValidator.java b/net/minecraft/network/chat/SignedMessageValidator.java -index 5cb693319169dbd95d87ffdc450bf60bab4021aa..8fc4cd2f30e97c1a2d37d87c0d3584a2f6aae4ed 100644 +index a28958b8ab09b3ffdcedba19e0063af07f177080..c37a985102198add61f7d70e33e21d585fb2b399 100644 --- a/net/minecraft/network/chat/SignedMessageValidator.java +++ b/net/minecraft/network/chat/SignedMessageValidator.java @@ -31,7 +31,11 @@ public interface SignedMessageValidator { @@ -75,10 +75,10 @@ index 5cb693319169dbd95d87ffdc450bf60bab4021aa..8fc4cd2f30e97c1a2d37d87c0d3584a2 "Received out-of-order chat message from {}: expected index > {} for session {}, but was {} for session {}", message.sender(), diff --git a/net/minecraft/server/commands/TickCommand.java b/net/minecraft/server/commands/TickCommand.java -index 9f43eff6160ac6855c2e5dd9c23c384b03b7e96c..049b6a2ae0a1d1bc3ad6d15c884903487d119e0f 100644 +index 4421658e4061299dea2ff72a77506214cc9045d8..53bda989ce23d9eb144f1dc3d54fbe2a91cd1e17 100644 --- a/net/minecraft/server/commands/TickCommand.java +++ b/net/minecraft/server/commands/TickCommand.java -@@ -20,7 +20,7 @@ public class TickCommand { +@@ -21,7 +21,7 @@ public class TickCommand { public static void register(final CommandDispatcher dispatcher) { dispatcher.register( Commands.literal("tick") @@ -87,8 +87,8 @@ index 9f43eff6160ac6855c2e5dd9c23c384b03b7e96c..049b6a2ae0a1d1bc3ad6d15c88490348 .then(Commands.literal("query").executes(c -> tickQuery(c.getSource()))) .then( // Lophine - Add tick rate support Commands.literal("rate") -@@ -106,8 +106,14 @@ public class TickCommand { - return 1; +@@ -107,8 +107,14 @@ public class TickCommand { + return Command.SINGLE_SUCCESS; } - private static int setFreeze(final CommandSourceStack source, final boolean freeze) { @@ -103,7 +103,7 @@ index 9f43eff6160ac6855c2e5dd9c23c384b03b7e96c..049b6a2ae0a1d1bc3ad6d15c88490348 if (freeze) { if (manager.isSprinting()) { manager.stopSprinting(); -@@ -163,4 +169,10 @@ public class TickCommand { +@@ -164,4 +170,10 @@ public class TickCommand { return 0; } } @@ -115,7 +115,7 @@ index 9f43eff6160ac6855c2e5dd9c23c384b03b7e96c..049b6a2ae0a1d1bc3ad6d15c88490348 + // Lophine end - Carpet features } diff --git a/net/minecraft/server/dedicated/DedicatedPlayerList.java b/net/minecraft/server/dedicated/DedicatedPlayerList.java -index 1a2b57a100c997b39f8f25ad3da121e04700d5d2..6b0d0a2c0067065b4a995a9f127910666d80011e 100644 +index 8cc4fe9feb57902a4b9a6a26e6175ac00a2cef65..9ab1a812e43145120859734075e2ac995d0357c2 100644 --- a/net/minecraft/server/dedicated/DedicatedPlayerList.java +++ b/net/minecraft/server/dedicated/DedicatedPlayerList.java @@ -14,7 +14,7 @@ public class DedicatedPlayerList extends PlayerList { @@ -128,10 +128,10 @@ index 1a2b57a100c997b39f8f25ad3da121e04700d5d2..6b0d0a2c0067065b4a995a9f12791066 // Paper start - fix converting txt to json file; moved from constructor } diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java -index 020b2fcb5213a618b557f0578a7d44db5a8dc109..5e70e4e8a67e50a067dff1e592d617ca6a0426a9 100644 +index 4a22a07cd0e0d81cf7b12a91e75ec78d7d7b9836..82a9143d43425943d6b730c8a43446881061ac2c 100644 --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java -@@ -257,6 +257,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -260,6 +260,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc private int requestedViewDistance = 2; public String language = null; // Paper - default to null public java.util.Locale adventure$locale = java.util.Locale.US; // Paper @@ -139,7 +139,7 @@ index 020b2fcb5213a618b557f0578a7d44db5a8dc109..5e70e4e8a67e50a067dff1e592d617ca private @Nullable Vec3 startingToFallPosition; private @Nullable Vec3 enteredNetherPosition; private @Nullable Vec3 enteredLavaOnVehiclePosition; -@@ -2831,6 +2832,11 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -2805,6 +2806,11 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc this.setShoulderEntityRight(oldPlayer.getShoulderEntityRight()); this.setLastDeathLocation(oldPlayer.getLastDeathLocation()); this.waypointIcon().copyFrom(oldPlayer.waypointIcon()); @@ -151,7 +151,7 @@ index 020b2fcb5213a618b557f0578a7d44db5a8dc109..5e70e4e8a67e50a067dff1e592d617ca } private void transferInventoryXpAndScore(final Player oldPlayer) { -@@ -3114,6 +3120,11 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -3084,6 +3090,11 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc this.particleStatus = information.particleStatus(); this.getEntityData().set(DATA_PLAYER_MODE_CUSTOMISATION, (byte)information.modelCustomisation()); this.getEntityData().set(DATA_PLAYER_MAIN_HAND, information.mainHand()); @@ -164,10 +164,10 @@ index 020b2fcb5213a618b557f0578a7d44db5a8dc109..5e70e4e8a67e50a067dff1e592d617ca public ClientInformation clientInformation() { diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 83c9418ea45b8d7f639c6bf5e134bad90d9ac039..348885252c3bc01bdef0a1224c7546701500de8b 100644 +index b5e19220cd137c91ee992aa011593d625f741222..d94111b1171e83822885f616db4cd6fccc39298d 100644 --- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -2099,7 +2099,15 @@ public class ServerGamePacketListenerImpl +@@ -2073,7 +2073,15 @@ public class ServerGamePacketListenerImpl this.player.gameMode.capturedBlockEntity = false; this.player.gameMode.captureSentBlockEntities = true; // Paper end - Send block entities after destroy prediction @@ -184,7 +184,7 @@ index 83c9418ea45b8d7f639c6bf5e134bad90d9ac039..348885252c3bc01bdef0a1224c754670 this.ackBlockChangesUpTo(packet.getSequence()); // Paper start - Send block entities after destroy prediction this.player.gameMode.captureSentBlockEntities = false; -@@ -2202,7 +2210,9 @@ public class ServerGamePacketListenerImpl +@@ -2176,7 +2184,9 @@ public class ServerGamePacketListenerImpl if (!me.earthme.luminol.config.modules.fixes.ItemMultitaskConfig.enabled) { // Luminol - Add item multitask config this.player.stopUsingItem(); // CraftBukkit - SPIGOT-4706 } // Luminol - Add item multitask config @@ -195,7 +195,7 @@ index 83c9418ea45b8d7f639c6bf5e134bad90d9ac039..348885252c3bc01bdef0a1224c754670 if (interactionResult.consumesAction()) { CriteriaTriggers.ANY_BLOCK_USE.trigger(this.player, blockHit.getBlockPos(), itemStack); } -@@ -2307,7 +2317,10 @@ public class ServerGamePacketListenerImpl +@@ -2281,7 +2291,10 @@ public class ServerGamePacketListenerImpl } // CraftBukkit end @@ -207,7 +207,7 @@ index 83c9418ea45b8d7f639c6bf5e134bad90d9ac039..348885252c3bc01bdef0a1224c754670 && success.swingSource() == InteractionResult.SwingSource.SERVER) { this.player.swing(hand, true); } -@@ -2315,6 +2328,16 @@ public class ServerGamePacketListenerImpl +@@ -2289,6 +2302,16 @@ public class ServerGamePacketListenerImpl } } @@ -224,7 +224,7 @@ index 83c9418ea45b8d7f639c6bf5e134bad90d9ac039..348885252c3bc01bdef0a1224c754670 @Override public void handleTeleportToEntityPacket(final ServerboundTeleportToEntityPacket packet) { PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level()); -@@ -2695,6 +2718,10 @@ public class ServerGamePacketListenerImpl +@@ -2669,6 +2692,10 @@ public class ServerGamePacketListenerImpl if (true) throw new UnsupportedOperationException(); // Folia - region threading final String conversationInput = rawMessage; this.server.processQueue.add(() -> ServerGamePacketListenerImpl.this.getCraftPlayer().acceptConversationInput(conversationInput)); @@ -235,17 +235,17 @@ index 83c9418ea45b8d7f639c6bf5e134bad90d9ac039..348885252c3bc01bdef0a1224c754670 } else if (this.player.getChatVisibility() == ChatVisiblity.SYSTEM) { // Re-add "Command Only" flag check this.send(new ClientboundSystemChatPacket(Component.translatable("chat.cannotSend").withStyle(ChatFormatting.RED), false)); } else { -@@ -2707,6 +2734,9 @@ public class ServerGamePacketListenerImpl +@@ -2681,6 +2708,9 @@ public class ServerGamePacketListenerImpl // Spigot start - spam exclusions - private void detectRateSpam(String message) { + private void detectRateSpam(final TickThrottler throttler, final String message) { + if (fun.bm.lophine.carpet.config.modules.GeneralCompatConfig.antiSpamDisabled) { + return; + } if (me.earthme.luminol.config.modules.misc.PaperPacketLimiterConfig.forceDisable) return; // Leaves - disable // CraftBukkit start - replaced with thread safe throttle if (org.spigotmc.SpigotConfig.enableSpamExclusions) { -@@ -3642,8 +3672,10 @@ public class ServerGamePacketListenerImpl +@@ -3627,8 +3657,10 @@ public class ServerGamePacketListenerImpl if (org.leavesmc.leaves.util.ItemOverstackUtils.hasOverstackingItem()) this.player.containerMenu.sendSingleSlot(packet.slotNum(), itemStack); // Leaves - item over-stack util - force send carried item if (io.papermc.paper.configuration.GlobalConfiguration.get().unsupportedSettings.updateEquipmentOnPlayerActions) this.player.detectEquipmentUpdates(); // Paper - Force update attributes. } else if (drop && validData) { @@ -259,10 +259,10 @@ index 83c9418ea45b8d7f639c6bf5e134bad90d9ac039..348885252c3bc01bdef0a1224c754670 } else { LOGGER.warn("Player {} was dropping items too fast in creative mode, ignoring.", this.player.getPlainTextName()); diff --git a/net/minecraft/world/entity/ExperienceOrb.java b/net/minecraft/world/entity/ExperienceOrb.java -index 2312803297321f66c9057bc54ce56dd17ecb6f1f..27163558d967eed2035fd167fa51542055fa89fa 100644 +index b95c56e0699fbe16e65efcf010cd514f0ac0962f..0125d59551accd9005aa33a5c7cc8ec288fb7757 100644 --- a/net/minecraft/world/entity/ExperienceOrb.java +++ b/net/minecraft/world/entity/ExperienceOrb.java -@@ -351,8 +351,27 @@ public class ExperienceOrb extends Entity { +@@ -356,8 +356,27 @@ public class ExperienceOrb extends Entity { @Override public void playerTouch(final Player player) { if (player instanceof ServerPlayer serverPlayer) { @@ -291,7 +291,7 @@ index 2312803297321f66c9057bc54ce56dd17ecb6f1f..27163558d967eed2035fd167fa515420 player.take(this, 1); int remaining = this.repairPlayerItems(serverPlayer, this.getValue()); if (remaining > 0) { -@@ -368,6 +387,12 @@ public class ExperienceOrb extends Entity { +@@ -373,6 +392,12 @@ public class ExperienceOrb extends Entity { } private int repairPlayerItems(final ServerPlayer player, final int amount) { @@ -304,7 +304,7 @@ index 2312803297321f66c9057bc54ce56dd17ecb6f1f..27163558d967eed2035fd167fa515420 Optional selected = EnchantmentHelper.getRandomItemWith(EnchantmentEffectComponents.REPAIR_WITH_XP, player, ItemStack::isDamaged); if (selected.isPresent()) { ItemStack itemStack = selected.get().itemStack(); -@@ -397,6 +422,78 @@ public class ExperienceOrb extends Entity { +@@ -402,6 +427,78 @@ public class ExperienceOrb extends Entity { } } @@ -384,10 +384,10 @@ index 2312803297321f66c9057bc54ce56dd17ecb6f1f..27163558d967eed2035fd167fa515420 return this.entityData.get(DATA_VALUE); } diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java -index a3c19d725e03c07de6708f3c2d092e0b9aea69c2..0bd4d786c8e957a31811f52514a992543a0cee92 100644 +index 1fe317cf3251bff7bb3e0335452a5714d4d31017..14a79e8ef5a98b1eef2f2d3e0c63f21cb5bb4dbf 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java -@@ -601,7 +601,10 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -623,7 +623,10 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin public boolean broadcastedDeath = false; // Folia - region threading protected void tickDeath() { this.deathTime++; @@ -400,11 +400,11 @@ index a3c19d725e03c07de6708f3c2d092e0b9aea69c2..0bd4d786c8e957a31811f52514a99254 if (!(this instanceof ServerPlayer)) this.remove(Entity.RemovalReason.KILLED, org.bukkit.event.entity.EntityRemoveEvent.Cause.DEATH); // CraftBukkit - add Bukkit remove cause // Folia - region threading - don't remove, we want the tick scheduler to be running if ((this instanceof ServerPlayer)) this.unRide(); // Folia - region threading - unmount player when dead diff --git a/net/minecraft/world/entity/item/PrimedTnt.java b/net/minecraft/world/entity/item/PrimedTnt.java -index 42aff39d537aa6b138bc4a76304d49f423212acd..5b5717a886dab57b2fe9ad926a8ae7b3d4f30155 100644 +index 4e8385b340686531297324983754fab4150e41b8..34018a6f7a8c97c489a938222df189e8790d015d 100644 --- a/net/minecraft/world/entity/item/PrimedTnt.java +++ b/net/minecraft/world/entity/item/PrimedTnt.java -@@ -70,8 +70,14 @@ public class PrimedTnt extends Entity implements TraceableEntity { - this(EntityType.TNT, level); +@@ -73,8 +73,14 @@ public class PrimedTnt extends Entity implements TraceableEntity { + this(EntityTypes.TNT, level); this.setPos(x, y, z); double rot = this.getRandom().nextDouble() * (float) (Math.PI * 2); // Paper - Don't use level random in entity constructors - this.setDeltaMovement(-Math.sin(rot) * 0.02, 0.2F, -Math.cos(rot) * 0.02); @@ -420,7 +420,7 @@ index 42aff39d537aa6b138bc4a76304d49f423212acd..5b5717a886dab57b2fe9ad926a8ae7b3 this.xo = x; this.yo = y; this.zo = z; -@@ -80,7 +86,7 @@ public class PrimedTnt extends Entity implements TraceableEntity { +@@ -83,7 +89,7 @@ public class PrimedTnt extends Entity implements TraceableEntity { @Override protected void defineSynchedData(final SynchedEntityData.Builder entityData) { @@ -429,7 +429,7 @@ index 42aff39d537aa6b138bc4a76304d49f423212acd..5b5717a886dab57b2fe9ad926a8ae7b3 entityData.define(DATA_BLOCK_STATE_ID, DEFAULT_BLOCK_STATE); } -@@ -177,7 +183,7 @@ public class PrimedTnt extends Entity implements TraceableEntity { +@@ -180,7 +186,7 @@ public class PrimedTnt extends Entity implements TraceableEntity { @Override protected void readAdditionalSaveData(final ValueInput input) { @@ -438,7 +438,7 @@ index 42aff39d537aa6b138bc4a76304d49f423212acd..5b5717a886dab57b2fe9ad926a8ae7b3 this.setBlockState(input.read("block_state", BlockState.CODEC).orElse(DEFAULT_BLOCK_STATE)); this.explosionPower = Mth.clamp(input.getFloatOr("explosion_power", 4.0F), 0.0F, 128.0F); this.owner = EntityReference.read(input, "owner"); -@@ -200,6 +206,12 @@ public class PrimedTnt extends Entity implements TraceableEntity { +@@ -203,6 +209,12 @@ public class PrimedTnt extends Entity implements TraceableEntity { this.entityData.set(DATA_FUSE_ID, time); } @@ -452,7 +452,7 @@ index 42aff39d537aa6b138bc4a76304d49f423212acd..5b5717a886dab57b2fe9ad926a8ae7b3 return this.entityData.get(DATA_FUSE_ID); } diff --git a/net/minecraft/world/entity/monster/EnderMan.java b/net/minecraft/world/entity/monster/EnderMan.java -index 459a05ca83583538f995f45c4d2c977c6d6fcd00..35a275ff953a271a2769a18af8163e81d8634ee2 100644 +index d2ac2a0c5bb18c2bca18e5166ed65afd01166e04..6b3adf1af870c3d710494d34d2f25850126516eb 100644 --- a/net/minecraft/world/entity/monster/EnderMan.java +++ b/net/minecraft/world/entity/monster/EnderMan.java @@ -643,7 +643,7 @@ public class EnderMan extends Monster implements NeutralMob { @@ -481,10 +481,10 @@ index 459a05ca83583538f995f45c4d2c977c6d6fcd00..35a275ff953a271a2769a18af8163e81 } } diff --git a/net/minecraft/world/entity/player/Player.java b/net/minecraft/world/entity/player/Player.java -index 97057675369875ed71c228a87f5a4d3c3489dded..79bc1c2320ffd7b7017b664b5fe376566968c265 100644 +index d46abbea2153cac2d939416fafeac7f905fe0e02..e224c1b8977cd97f2868f7db56c1df22a6820918 100644 --- a/net/minecraft/world/entity/player/Player.java +++ b/net/minecraft/world/entity/player/Player.java -@@ -556,7 +556,15 @@ public abstract class Player extends Avatar implements ContainerUser { +@@ -560,7 +560,15 @@ public abstract class Player extends Avatar implements ContainerUser { } if (!orbs.isEmpty()) { @@ -501,7 +501,7 @@ index 97057675369875ed71c228a87f5a4d3c3489dded..79bc1c2320ffd7b7017b664b5fe37656 } } -@@ -1069,6 +1077,28 @@ public abstract class Player extends Avatar implements ContainerUser { +@@ -1078,6 +1086,28 @@ public abstract class Player extends Avatar implements ContainerUser { if (playerAttackEntityEvent.callEvent() && willAttack) { // Logic moved to willAttack local variable. // Paper end - PlayerAttackEntityEvent @@ -530,7 +530,7 @@ index 97057675369875ed71c228a87f5a4d3c3489dded..79bc1c2320ffd7b7017b664b5fe37656 float baseDamage = this.isAutoSpinAttack() ? this.autoSpinAttackDmg : (float)this.getAttributeValue(Attributes.ATTACK_DAMAGE); ItemStack attackingItemStack = this.getWeaponItem(); DamageSource damageSource = this.createAttackSource(attackingItemStack); final DamageSource dmgSourceFinal = damageSource; // Paper - damage events -@@ -1126,6 +1156,18 @@ public abstract class Player extends Avatar implements ContainerUser { +@@ -1137,6 +1167,18 @@ public abstract class Player extends Avatar implements ContainerUser { } } @@ -550,10 +550,10 @@ index 97057675369875ed71c228a87f5a4d3c3489dded..79bc1c2320ffd7b7017b664b5fe37656 sendSoundEffect(this, this.getX(), this.getY(), this.getZ(), sound, this.getSoundSource(), 1.0F, 1.0F); // Paper - send while respecting visibility } diff --git a/net/minecraft/world/item/BlockItem.java b/net/minecraft/world/item/BlockItem.java -index 9c016e7d93e4c44ddf2df520e5c57d92a0e085b3..3413fe84a40b00e98565cdf7aa93fc1c7da6f128 100644 +index 02b8f4aa4aefea0391ab4ce6d634f3a050c80f5a..af3abbc1b24d0d68cd71f14af2419df52ec5da90 100644 --- a/net/minecraft/world/item/BlockItem.java +++ b/net/minecraft/world/item/BlockItem.java -@@ -147,8 +147,12 @@ public class BlockItem extends Item { +@@ -149,8 +149,12 @@ public class BlockItem extends Item { // CraftBukkit start Level world = context.getLevel(); // Paper - Cancel hit for vanished players CollisionContext collisionContext = player == null ? CollisionContext.empty() : CollisionContext.placementContext(player); // Leaves - creative no clip @@ -568,11 +568,11 @@ index 9c016e7d93e4c44ddf2df520e5c57d92a0e085b3..3413fe84a40b00e98565cdf7aa93fc1c org.bukkit.event.block.BlockCanBuildEvent event = new org.bukkit.event.block.BlockCanBuildEvent( diff --git a/net/minecraft/world/item/ServerItemCooldowns.java b/net/minecraft/world/item/ServerItemCooldowns.java -index cf66ce7cf737b2abd45c76218db55c8d0fc109d4..1fa560f184786620ee8a5a0bb3c67e858bf7fdfc 100644 +index ca548c006dfde82bef3f8855e275df63a42b8e09..c447a5ccce7c859ed61ab42e25d683262df9e062 100644 --- a/net/minecraft/world/item/ServerItemCooldowns.java +++ b/net/minecraft/world/item/ServerItemCooldowns.java -@@ -22,6 +22,11 @@ public class ServerItemCooldowns extends ItemCooldowns { - +@@ -14,6 +14,11 @@ public class ServerItemCooldowns extends ItemCooldowns { + // Paper start - Add PlayerItemCooldownEvent @Override public void addCooldown(ItemStack item, int duration) { + // Lophine start - Carpet features @@ -584,7 +584,7 @@ index cf66ce7cf737b2abd45c76218db55c8d0fc109d4..1fa560f184786620ee8a5a0bb3c67e85 final io.papermc.paper.event.player.PlayerItemCooldownEvent event = new io.papermc.paper.event.player.PlayerItemCooldownEvent( this.player.getBukkitEntity(), diff --git a/net/minecraft/world/item/crafting/RecipeManager.java b/net/minecraft/world/item/crafting/RecipeManager.java -index 298908003d5422b8b58de631145fad381e8294c1..2e5519813260033daff127fef2598cd10b0d9c90 100644 +index 6812ade4d9de26d507234b8357b109ec7e5cbb50..071d2cd7e0c2e5bba0732590ba804a5cb5db3f5e 100644 --- a/net/minecraft/world/item/crafting/RecipeManager.java +++ b/net/minecraft/world/item/crafting/RecipeManager.java @@ -55,6 +55,11 @@ public class RecipeManager extends SimplePreparableReloadListener imp @@ -676,36 +676,38 @@ index 298908003d5422b8b58de631145fad381e8294c1..2e5519813260033daff127fef2598cd1 public void addRecipe(RecipeHolder holder) { org.spigotmc.AsyncCatcher.catchOp("Recipe Add"); // Spigot diff --git a/net/minecraft/world/level/Level.java b/net/minecraft/world/level/Level.java -index 8c051d7322d8efc1ae2e151964fd0124740fd04d..d419d9e3c8f7af424a1b4783f7e7a015bbf541b0 100644 +index fb368e4c09b44744ba634c22934b27ea804ea00e..6d3a5d648f4d04945a64e76995c0f4b5f81af779 100644 --- a/net/minecraft/world/level/Level.java +++ b/net/minecraft/world/level/Level.java -@@ -1175,6 +1175,12 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl - BlockState state = newState; - BlockState blockState = oldState; - BlockState blockState1 = currentState; -+ // Lophine start - Carpet features +@@ -1179,7 +1179,13 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl + // CraftBukkit start - Split off from above in order to directly send client and physic updates + public void notifyAndUpdatePhysics(BlockPos pos, LevelChunk chunk, BlockState oldState, BlockState blockState, BlockState newState, @Block.UpdateFlags int updateFlags, int updateLimit) { + if (newState == blockState) { +- if (oldState != newState) { ++ // Lophine start - Carpet features + boolean skipInteractionUpdates = fun.bm.lophine.carpet.InteractionUpdateCompatHelper.shouldSkipUpdates(); + if (skipInteractionUpdates) { -+ flags &= ~Block.UPDATE_NEIGHBORS; ++ updateFlags &= ~Block.UPDATE_NEIGHBORS; + } + // Lophine end - Carpet features - if (blockState1 == state) { - if (blockState != blockState1) { - this.setBlocksDirty(pos, blockState, blockState1); -@@ -1191,7 +1197,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl ++ if (oldState != newState) { + this.setBlocksDirty(pos, oldState, newState); + } + +@@ -1194,7 +1200,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl } } -- if ((flags & Block.UPDATE_KNOWN_SHAPE) == 0 && recursionLeft > 0) { -+ if (!skipInteractionUpdates && (flags & Block.UPDATE_KNOWN_SHAPE) == 0 && recursionLeft > 0) { // Lophine - Carpet features - int i = flags & ~(Block.UPDATE_SUPPRESS_DROPS | Block.UPDATE_NEIGHBORS); +- if ((updateFlags & Block.UPDATE_KNOWN_SHAPE) == 0 && updateLimit > 0) { ++ if (!skipInteractionUpdates && (updateFlags & Block.UPDATE_KNOWN_SHAPE) == 0 && updateLimit > 0) { // Lophine - Carpet features + int neighbourUpdateFlags = updateFlags & ~(Block.UPDATE_SUPPRESS_DROPS | Block.UPDATE_NEIGHBORS); // CraftBukkit start diff --git a/net/minecraft/world/level/NaturalSpawner.java b/net/minecraft/world/level/NaturalSpawner.java -index cd20d10ee4cd2fe98131c9a93367ae133f96b8d4..c99c66563192629e399d1d904cb654c624fe9837 100644 +index 0d8d2459457167d78a9a9ea43765980240416947..717cd4b18da2c637fc070c738741f926649b097f 100644 --- a/net/minecraft/world/level/NaturalSpawner.java +++ b/net/minecraft/world/level/NaturalSpawner.java -@@ -292,6 +292,12 @@ public final class NaturalSpawner { +@@ -289,6 +289,12 @@ public final class NaturalSpawner { Player nearestPlayer = level.getNearestPlayer(xx, yStart, zz, -1.0, false); if (nearestPlayer != null) { double nearestPlayerDistanceSqr = nearestPlayer.distanceToSqr(xx, yStart, zz); @@ -718,7 +720,7 @@ index cd20d10ee4cd2fe98131c9a93367ae133f96b8d4..c99c66563192629e399d1d904cb654c6 if (level.isLoadedAndInBounds(pos) && isRightDistanceToPlayerAndSpawnPoint(level, chunk, pos, nearestPlayerDistanceSqr)) { // Paper - don't load chunks for mob spawn if (currentSpawnData == null) { Optional nextSpawnData = getRandomSpawnMobAt( -@@ -332,6 +338,12 @@ public final class NaturalSpawner { +@@ -329,6 +335,12 @@ public final class NaturalSpawner { // SPIGOT-7045: Give ocelot babies back their special spawn reason. Note: This is the only modification required as ocelots count as monsters which means they only spawn during normal chunk ticking and do not spawn during chunk generation as starter mobs. level.addFreshEntityWithPassengers(mob, (mob instanceof net.minecraft.world.entity.animal.feline.Ocelot && !((org.bukkit.entity.Ageable) mob.getBukkitEntity()).isAdult()) ? org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.OCELOT_BABY : org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.NATURAL); if (!mob.isRemoved()) { @@ -731,7 +733,7 @@ index cd20d10ee4cd2fe98131c9a93367ae133f96b8d4..c99c66563192629e399d1d904cb654c6 clusterSize++; groupSize++; spawnCallback.run(mob, chunk); -@@ -411,11 +423,24 @@ public final class NaturalSpawner { +@@ -408,11 +420,24 @@ public final class NaturalSpawner { && canSpawnMobAt(level, structureManager, generator, mobCategory, currentSpawnData, pos) && SpawnPlacements.isSpawnPositionOk(type, level, pos) && SpawnPlacements.checkSpawnRules(type, level, EntitySpawnReason.NATURAL, pos, level.random) @@ -757,10 +759,10 @@ index cd20d10ee4cd2fe98131c9a93367ae133f96b8d4..c99c66563192629e399d1d904cb654c6 try { if (type.create(level, EntitySpawnReason.NATURAL) instanceof Mob mob) { return mob; -@@ -536,7 +561,11 @@ public final class NaturalSpawner { +@@ -533,7 +558,11 @@ public final class NaturalSpawner { float width = spawnerData.type().getWidth(); - double fx = Mth.clamp((double)x, (double)xo + width, xo + 16.0 - width); - double fz = Mth.clamp((double)z, (double)zo + width, zo + 16.0 - width); + double fx = Mth.clamp(x, (double)xo + width, xo + 16.0 - width); + double fz = Mth.clamp(z, (double)zo + width, zo + 16.0 - width); - if (!level.noCollision(spawnerData.type().getSpawnAABB(fx, pos.getY(), fz)) + // Lophine start - Carpet features + if (!(fun.bm.lophine.carpet.config.modules.GeneralCompatConfig.lagFreeSpawning @@ -770,7 +772,7 @@ index cd20d10ee4cd2fe98131c9a93367ae133f96b8d4..c99c66563192629e399d1d904cb654c6 || !SpawnPlacements.checkSpawnRules( spawnerData.type(), level, -@@ -568,6 +597,11 @@ public final class NaturalSpawner { +@@ -565,6 +594,11 @@ public final class NaturalSpawner { level, level.getCurrentDifficultyAt(mob.blockPosition()), EntitySpawnReason.CHUNK_GENERATION, groupSpawnData ); level.addFreshEntityWithPassengers(mob, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.CHUNK_GEN); // CraftBukkit @@ -783,7 +785,7 @@ index cd20d10ee4cd2fe98131c9a93367ae133f96b8d4..c99c66563192629e399d1d904cb654c6 } } diff --git a/net/minecraft/world/level/ServerExplosion.java b/net/minecraft/world/level/ServerExplosion.java -index 9fc97e8b01f66ada6af1fe76f4e27c9bb1a5dcfc..69d436268492183ae41fb9a60e61ed1f58a674d9 100644 +index b90077b44ce81d5d60f9d0ad2414f0b7c6b1e720..4f4512d30717e5e41bd98703574485c0e2b866fb 100644 --- a/net/minecraft/world/level/ServerExplosion.java +++ b/net/minecraft/world/level/ServerExplosion.java @@ -371,6 +371,12 @@ public class ServerExplosion implements Explosion { @@ -800,7 +802,7 @@ index 9fc97e8b01f66ada6af1fe76f4e27c9bb1a5dcfc..69d436268492183ae41fb9a60e61ed1f final ObjectArrayList ret = new ObjectArrayList<>(); diff --git a/net/minecraft/world/level/block/CarvedPumpkinBlock.java b/net/minecraft/world/level/block/CarvedPumpkinBlock.java -index a63dddd01ced6ba23067a113d871f2351bb690fc..ffa6cc05b163df8ee0291f2b80846eebee3fb914 100644 +index 4ed03c9bb81a903c6ec68efe72845f20b083f3ac..003c19d8cad2ae5af770923a76735e4944b24c28 100644 --- a/net/minecraft/world/level/block/CarvedPumpkinBlock.java +++ b/net/minecraft/world/level/block/CarvedPumpkinBlock.java @@ -59,7 +59,10 @@ public class CarvedPumpkinBlock extends HorizontalDirectionalBlock { @@ -842,7 +844,7 @@ index a63dddd01ced6ba23067a113d871f2351bb690fc..ffa6cc05b163df8ee0291f2b80846eeb + return; + } + -+ net.minecraft.world.entity.monster.Shulker shulker = EntityType.SHULKER.create(level, EntitySpawnReason.TRIGGERED); ++ net.minecraft.world.entity.monster.Shulker shulker = EntityTypes.SHULKER.create(level, EntitySpawnReason.TRIGGERED); + if (shulker == null) { + return; + } @@ -872,10 +874,10 @@ index a63dddd01ced6ba23067a113d871f2351bb690fc..ffa6cc05b163df8ee0291f2b80846eeb if (this.snowGolemBase == null) { this.snowGolemBase = BlockPatternBuilder.start() diff --git a/net/minecraft/world/level/block/ChestBlock.java b/net/minecraft/world/level/block/ChestBlock.java -index b5595d87339e4d313c5691a06c2b1b3d1b40b6de..6be78cd1faea90e6c38079e2f09a7f11378ca4c2 100644 +index 70a0d30552d42d91778e0524bb89f6619c1fd0b0..ff4f28446759a5d5968286323675a7cdbf75e92b 100644 --- a/net/minecraft/world/level/block/ChestBlock.java +++ b/net/minecraft/world/level/block/ChestBlock.java -@@ -276,7 +276,10 @@ public class ChestBlock extends AbstractChestBlock implements +@@ -272,7 +272,10 @@ public class ChestBlock extends AbstractChestBlock implements final BlockState state, final Level level, final BlockPos pos, final Player player, final BlockHitResult hitResult ) { if (level instanceof ServerLevel serverLevel) { @@ -888,10 +890,10 @@ index b5595d87339e4d313c5691a06c2b1b3d1b40b6de..6be78cd1faea90e6c38079e2f09a7f11 player.awardStat(this.getOpenChestStat()); PiglinAi.angerNearbyPiglins(serverLevel, player, true); diff --git a/net/minecraft/world/level/block/EnderChestBlock.java b/net/minecraft/world/level/block/EnderChestBlock.java -index a9f511a549681a76a962855c26b9af5980f36df7..6163f498a55ede634a704a78307a0debd8f3f1f5 100644 +index bfc34508937befc0f7610176ebe625563f7a4fe0..b96afc074191d91e21d13c28c88f26f4e1881ee0 100644 --- a/net/minecraft/world/level/block/EnderChestBlock.java +++ b/net/minecraft/world/level/block/EnderChestBlock.java -@@ -82,7 +82,10 @@ public class EnderChestBlock extends AbstractChestBlock i +@@ -83,7 +83,10 @@ public class EnderChestBlock extends AbstractChestBlock i PlayerEnderChestContainer container = player.getEnderChestInventory(); if (container != null && level.getBlockEntity(pos) instanceof EnderChestBlockEntity enderChest) { BlockPos above = pos.above(); @@ -901,8 +903,8 @@ index a9f511a549681a76a962855c26b9af5980f36df7..6163f498a55ede634a704a78307a0deb + if (!canOpenForcibly && level.getBlockState(above).isRedstoneConductor(level, above)) { // Paper - diff on change; make sure that EnderChest#isBlocked uses the same logic + // Lophine end - Carpet features return InteractionResult.SUCCESS; - } else { - // Paper start - Fix InventoryOpenEvent cancellation - moved up; + } + diff --git a/net/minecraft/world/level/block/FarmlandBlock.java b/net/minecraft/world/level/block/FarmlandBlock.java index ef55faf83e39c8dfd6bbe33c4943ed88bc473715..f91a8608ba4948217fce4a62affe1e4e6cfb7bf2 100644 --- a/net/minecraft/world/level/block/FarmlandBlock.java @@ -921,7 +923,7 @@ index ef55faf83e39c8dfd6bbe33c4943ed88bc473715..f91a8608ba4948217fce4a62affe1e4e // super.fallOn(level, state, pos, entity, fallDistance); // CraftBukkit - moved up diff --git a/net/minecraft/world/level/block/ObserverBlock.java b/net/minecraft/world/level/block/ObserverBlock.java -index be572eff561ffdd961a9602eaa6136761c4d48a4..49b12425a3bb7bb10999939ca5eedab01a1c6b93 100644 +index 1d68ebf02f4e83a69fc30f36e0b9f688799210c3..505c3b1a99394ec89ea0589e0cad1af44c48959a 100644 --- a/net/minecraft/world/level/block/ObserverBlock.java +++ b/net/minecraft/world/level/block/ObserverBlock.java @@ -89,6 +89,12 @@ public class ObserverBlock extends DirectionalBlock { @@ -938,7 +940,7 @@ index be572eff561ffdd961a9602eaa6136761c4d48a4..49b12425a3bb7bb10999939ca5eedab0 ticks.scheduleTick(pos, this, 2); } diff --git a/net/minecraft/world/level/block/RedStoneWireBlock.java b/net/minecraft/world/level/block/RedStoneWireBlock.java -index 7f5b77cd9cb78e693bbe1efd3d5fd7256d7700c5..6d09ab985c48366742b4e57aec63536872d9f1a0 100644 +index 1ccacb7ffa7e8b9c3fdd37910d3e8bded86a4d3a..239258ad543571a5213d1b06aa9e4e9f44261a14 100644 --- a/net/minecraft/world/level/block/RedStoneWireBlock.java +++ b/net/minecraft/world/level/block/RedStoneWireBlock.java @@ -292,7 +292,10 @@ public class RedStoneWireBlock extends Block { @@ -994,10 +996,10 @@ index 7f5b77cd9cb78e693bbe1efd3d5fd7256d7700c5..6d09ab985c48366742b4e57aec635368 } else // Paper end - optimize redstone (Alternate Current) diff --git a/net/minecraft/world/level/block/ShulkerBoxBlock.java b/net/minecraft/world/level/block/ShulkerBoxBlock.java -index 45dc3e8484842265b26d387d518831ff23da4b5e..ce8bd4a7e8850c25c8c4f1e90361e44be543de16 100644 +index a80535ebb7b4fcc3a6c7b84eb08e275461c7ae36..c470631eba2495e6363ea29aad7515d65dd46f4b 100644 --- a/net/minecraft/world/level/block/ShulkerBoxBlock.java +++ b/net/minecraft/world/level/block/ShulkerBoxBlock.java -@@ -74,9 +74,10 @@ public class ShulkerBoxBlock extends BaseEntityBlock { +@@ -76,9 +76,10 @@ public class ShulkerBoxBlock extends BaseEntityBlock { protected InteractionResult useWithoutItem( final BlockState state, final Level level, final BlockPos pos, final Player player, final BlockHitResult hitResult ) { @@ -1010,7 +1012,7 @@ index 45dc3e8484842265b26d387d518831ff23da4b5e..ce8bd4a7e8850c25c8c4f1e90361e44b player.awardStat(Stats.OPEN_SHULKER_BOX); PiglinAi.angerNearbyPiglins(serverLevel, player, true); diff --git a/net/minecraft/world/level/block/TntBlock.java b/net/minecraft/world/level/block/TntBlock.java -index 58142c276c976b16100e14ee9adb547f74e4cb41..59ace6af88bb73ffdb254881dedf069e80a0cbaa 100644 +index c27fc92d6ff9dd7e07a61513601ef73ff16cf842..e5915893a06e332992c34b8ac511595534f48cdf 100644 --- a/net/minecraft/world/level/block/TntBlock.java +++ b/net/minecraft/world/level/block/TntBlock.java @@ -47,7 +47,10 @@ public class TntBlock extends Block { @@ -1038,16 +1040,7 @@ index 58142c276c976b16100e14ee9adb547f74e4cb41..59ace6af88bb73ffdb254881dedf069e level.removeBlock(pos, false); } } -@@ -76,7 +83,7 @@ public class TntBlock extends Block { - if (level.getGameRules().get(GameRules.TNT_EXPLODES)) { - PrimedTnt primed = new PrimedTnt(level, pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5, explosion.getIndirectSourceEntity()); - int fuse = primed.getFuse(); -- primed.setFuse((short)(level.getRandom().nextInt(fuse / 4) + fuse / 8)); -+ primed.setFuse(level.getRandom().nextInt(Math.max(fuse / 4, 1)) + fuse / 8); // Lophine - Carpet features - level.addFreshEntity(primed); - } - } -@@ -156,4 +163,12 @@ public class TntBlock extends Block { +@@ -154,4 +161,12 @@ public class TntBlock extends Block { protected void createBlockStateDefinition(final StateDefinition.Builder builder) { builder.add(UNSTABLE); } @@ -1061,7 +1054,7 @@ index 58142c276c976b16100e14ee9adb547f74e4cb41..59ace6af88bb73ffdb254881dedf069e + // Lophine end - Carpet features } diff --git a/net/minecraft/world/level/block/entity/HopperBlockEntity.java b/net/minecraft/world/level/block/entity/HopperBlockEntity.java -index aa782c6441cdce3eb39aefb28d40f3b1970d4e62..ac5b419169f8574f92ff7195bfa76c9978bc8a63 100644 +index 569f96a1b0b8a03b6a70775f4b7f58a66feed939..c23976cd72d7556ef96e04a7009031fc07b7a4fd 100644 --- a/net/minecraft/world/level/block/entity/HopperBlockEntity.java +++ b/net/minecraft/world/level/block/entity/HopperBlockEntity.java @@ -296,6 +296,10 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen @@ -1092,23 +1085,23 @@ index aa782c6441cdce3eb39aefb28d40f3b1970d4e62..ac5b419169f8574f92ff7195bfa76c99 origItemStack.setCount(originalItemCount); if (!origItemStack.isEmpty()) { diff --git a/net/minecraft/world/level/block/piston/PistonBaseBlock.java b/net/minecraft/world/level/block/piston/PistonBaseBlock.java -index 5ae07ece1046dda464f284c1dd13b2780f831e02..a4d8ed890fc6bea1e961df814c00d22ae147734f 100644 +index b4f5d462e4012451328210018c24de5a1d9e8c2e..e8f7944220d76d5c9111c6552e7904751aa26018 100644 --- a/net/minecraft/world/level/block/piston/PistonBaseBlock.java +++ b/net/minecraft/world/level/block/piston/PistonBaseBlock.java -@@ -379,7 +379,7 @@ public class PistonBaseBlock extends DirectionalBlock { +@@ -387,7 +387,7 @@ public class PistonBaseBlock extends DirectionalBlock { - for (int i = toPush.size() - 1; i >= 0; i--) { - // Paper start - fix a variety of piston desync dupes -- boolean allowDesync = io.papermc.paper.configuration.GlobalConfiguration.get().unsupportedSettings.allowPistonDuplication; -+ boolean allowDesync = !fun.bm.lophine.carpet.config.modules.GeneralCompatConfig.tntDupingFix; - BlockPos oldPos = toPush.get(i); - BlockPos pos = oldPos; - BlockState blockState = allowDesync ? level.getBlockState(oldPos) : null; + for (int i = toPush.size() - 1; i >= 0; i--) { + // Paper start - fix a variety of piston desync dupes +- boolean allowDesync = io.papermc.paper.configuration.GlobalConfiguration.get().unsupportedSettings.allowPistonDuplication; ++ boolean allowDesync = !fun.bm.lophine.carpet.config.modules.GeneralCompatConfig.tntDupingFix; + BlockPos oldPos = toPush.get(i); + BlockPos pos = oldPos; + BlockState blockState = allowDesync ? level.getBlockState(oldPos) : null; diff --git a/net/minecraft/world/level/block/state/BlockBehaviour.java b/net/minecraft/world/level/block/state/BlockBehaviour.java -index ff1471f40b73582df68efbf2996a854c6aa37d65..a223e3de5d6d302feaff2afbcb858286673be643 100644 +index 972b953a579120c1c05f2dc9bfc2b408d6071d26..a60bb8af6b6aa356193befa9d7e9cdfc7cf38f39 100644 --- a/net/minecraft/world/level/block/state/BlockBehaviour.java +++ b/net/minecraft/world/level/block/state/BlockBehaviour.java -@@ -848,6 +848,12 @@ public abstract class BlockBehaviour implements FeatureElement, org.leavesmc.lea +@@ -859,6 +859,12 @@ public abstract class BlockBehaviour implements FeatureElement, org.leavesmc.lea } public Vec3 getOffset(final BlockPos pos) { @@ -1122,44 +1115,46 @@ index ff1471f40b73582df68efbf2996a854c6aa37d65..a223e3de5d6d302feaff2afbcb858286 return function != null ? function.evaluate(this.asState(), pos) : Vec3.ZERO; } diff --git a/net/minecraft/world/level/chunk/LevelChunk.java b/net/minecraft/world/level/chunk/LevelChunk.java -index 9b3775b0cbca782964e03935331d1bfdd1af140d..a1789d7425fa8b50f9d3656b4dcd6b76af78caec 100644 +index c3b32f9c4c2fa17bef629453e3315c12387f5a92..62e760dcf3f499822800e243103cdc27a25b8cbe 100644 --- a/net/minecraft/world/level/chunk/LevelChunk.java +++ b/net/minecraft/world/level/chunk/LevelChunk.java -@@ -424,10 +424,11 @@ public class LevelChunk extends ChunkAccess implements DebugValueSource, ca.spot - boolean blockChanged = !oldState.is(newBlock); - boolean movedByPiston = (flags & Block.UPDATE_MOVE_BY_PISTON) != 0; - boolean sideEffects = (flags & Block.UPDATE_SKIP_BLOCK_ENTITY_SIDEEFFECTS) == 0; -+ boolean skipInteractionUpdates = fun.bm.lophine.carpet.InteractionUpdateCompatHelper.shouldSkipUpdates(); // Lophine - Carpet features - // Leaves start - behaviour 1.21.1- - if (!fun.bm.lophine.config.modules.experiment.RedStoneConfig.oldBlockRemoveBehaviour) { - if (blockChanged && oldState.hasBlockEntity() && !state.shouldChangedStateKeepBlockEntity(oldState)) { -- if (!this.level.isClientSide() && sideEffects) { -+ if (!this.level.isClientSide() && sideEffects && !skipInteractionUpdates) { - BlockEntity blockEntity = this.level.getBlockEntity(pos); - if (blockEntity != null) { - blockEntity.preRemoveSideEffects(pos, oldState); -@@ -439,6 +440,7 @@ public class LevelChunk extends ChunkAccess implements DebugValueSource, ca.spot +@@ -425,10 +425,10 @@ public class LevelChunk extends ChunkAccess implements DebugValueSource, ca.spot + boolean blockChanged = !oldState.is(newBlock); + boolean movedByPiston = (flags & Block.UPDATE_MOVE_BY_PISTON) != 0; + boolean sideEffects = (flags & Block.UPDATE_SKIP_BLOCK_ENTITY_SIDEEFFECTS) == 0; +- // Leaves start - behaviour 1.21.1- ++ boolean skipInteractionUpdates = fun.bm.lophine.carpet.InteractionUpdateCompatHelper.shouldSkipUpdates(); // Lophine - Carpet features// Leaves start - behaviour 1.21.1- + if (!fun.bm.lophine.config.modules.experiment.RedStoneConfig.oldBlockRemoveBehaviour) { + if (blockChanged && oldState.hasBlockEntity() && !state.shouldChangedStateKeepBlockEntity(oldState)) { +- if (!this.level.isClientSide() && sideEffects) { ++ if (!this.level.isClientSide() && sideEffects&& !skipInteractionUpdates) { + BlockEntity blockEntity = this.level.getBlockEntity(pos); + if (blockEntity != null) { + blockEntity.preRemoveSideEffects(pos, oldState); +@@ -440,7 +440,8 @@ public class LevelChunk extends ChunkAccess implements DebugValueSource, ca.spot - if ((blockChanged || newBlock instanceof BaseRailBlock) - && this.level instanceof ServerLevel serverLevel -+ && !skipInteractionUpdates - && ((flags & Block.UPDATE_NEIGHBORS) != 0 || movedByPiston)) { - oldState.affectNeighborsAfterRemoval(serverLevel, pos, movedByPiston); - } -@@ -450,7 +452,10 @@ public class LevelChunk extends ChunkAccess implements DebugValueSource, ca.spot - if (!section.getBlockState(localX, localY, localZ).is(newBlock)) { - return null; - } else { -- if (!this.level.isClientSide() && (flags & Block.UPDATE_SKIP_ON_PLACE) == 0 && (!this.level.getCurrentWorldData().captureBlockStates || newBlock instanceof net.minecraft.world.level.block.BaseEntityBlock)) { // CraftBukkit - Don't place while processing the BlockPlaceEvent, unless it's a BlockContainer. Prevents blocks such as TNT from activating when cancelled. // Folia - region threading -+ if (!this.level.isClientSide() + if ((blockChanged || newBlock instanceof BaseRailBlock) + && this.level instanceof ServerLevel serverLevel +- && ((flags & Block.UPDATE_NEIGHBORS) != 0 || movedByPiston)) { ++ && !skipInteractionUpdates ++ && ((flags & Block.UPDATE_NEIGHBORS) != 0 || movedByPiston)) { + oldState.affectNeighborsAfterRemoval(serverLevel, pos, movedByPiston); + } + } else { +@@ -452,7 +453,10 @@ public class LevelChunk extends ChunkAccess implements DebugValueSource, ca.spot + return null; + } + +- if (!this.level.isClientSide() && (flags & Block.UPDATE_SKIP_ON_PLACE) == 0 && (!this.level.getCurrentWorldData().captureBlockStates || newBlock instanceof net.minecraft.world.level.block.BaseEntityBlock)) { // CraftBukkit - Don't place while processing the BlockPlaceEvent, unless it's a BlockContainer. Prevents blocks such as TNT from activating when cancelled. // Folia - region threading ++ if (!this.level.isClientSide() + && !skipInteractionUpdates + && (flags & Block.UPDATE_SKIP_ON_PLACE) == 0 + && (!this.level.getCurrentWorldData().captureBlockStates || newBlock instanceof net.minecraft.world.level.block.BaseEntityBlock)) { // CraftBukkit - Don't place while processing the BlockPlaceEvent, unless it's a BlockContainer. Prevents blocks such as TNT from activating when cancelled. // Folia - region threading - state.onPlace(this.level, pos, oldState, movedByPiston); - } + state.onPlace(this.level, pos, oldState, movedByPiston); + } diff --git a/net/minecraft/world/level/dimension/end/DragonRespawnStage.java b/net/minecraft/world/level/dimension/end/DragonRespawnStage.java -index e02f5432d90866a06c48a58895908f7178ef1051..d9d07b0ea5a78b8862bdc5826c2e01618023a855 100644 +index 8d33e8888980f57d4f6d502b4f6912a5f56eff06..f90eb5768b1af9ca07bf6abdea7dbb2509ceb358 100644 --- a/net/minecraft/world/level/dimension/end/DragonRespawnStage.java +++ b/net/minecraft/world/level/dimension/end/DragonRespawnStage.java @@ -55,16 +55,19 @@ public enum DragonRespawnStage implements StringRepresentable { @@ -1190,7 +1185,7 @@ index e02f5432d90866a06c48a58895908f7178ef1051..d9d07b0ea5a78b8862bdc5826c2e0161 Feature.END_SPIKE .place( diff --git a/net/minecraft/world/level/levelgen/feature/EndSpikeFeature.java b/net/minecraft/world/level/levelgen/feature/EndSpikeFeature.java -index 3fdf80e32bdcaab4daac8f1c7329a2bc7b2bd625..792ca2756edb780cabcbdde65b0fee68e7ce1689 100644 +index f18523cc88dad77b4c7f2174f7db6ca13a199c7c..2e09964a0b3ae755d4b79cfdfe2ae52bd14f37bb 100644 --- a/net/minecraft/world/level/levelgen/feature/EndSpikeFeature.java +++ b/net/minecraft/world/level/levelgen/feature/EndSpikeFeature.java @@ -68,6 +68,12 @@ public class EndSpikeFeature extends Feature { @@ -1207,11 +1202,11 @@ index 3fdf80e32bdcaab4daac8f1c7329a2bc7b2bd625..792ca2756edb780cabcbdde65b0fee68 for (BlockPos pos : BlockPos.betweenClosed( diff --git a/net/minecraft/world/level/redstone/NeighborUpdater.java b/net/minecraft/world/level/redstone/NeighborUpdater.java -index 6358787f3c7dcfa599b2949613236fa8de025096..c1af4530c68a1f050a64720b2139d99c143d7d7b 100644 +index 90145a3ea384b568897ee665b80b24cccba1b6c5..4556860c8a8c728e8c64b6b3081fdc7f8608df98 100644 --- a/net/minecraft/world/level/redstone/NeighborUpdater.java +++ b/net/minecraft/world/level/redstone/NeighborUpdater.java @@ -42,6 +42,12 @@ public interface NeighborUpdater { - @Block.UpdateFlags final int updateFlags, + final @Block.UpdateFlags int updateFlags, final int updateLimit ) { + // Lophine start - Carpet features diff --git a/lophine-server/minecraft-patches/features/0045-Carpet-Features-Compatible.patch b/lophine-server/minecraft-patches/features/0045-Carpet-Features-Compatible.patch index 8acc380..039a814 100644 --- a/lophine-server/minecraft-patches/features/0045-Carpet-Features-Compatible.patch +++ b/lophine-server/minecraft-patches/features/0045-Carpet-Features-Compatible.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Carpet Features Compatible diff --git a/io/papermc/paper/threadedregions/RegionizedServer.java b/io/papermc/paper/threadedregions/RegionizedServer.java -index 4bd923b42d1c98ce7178e05f9324f46d99ffc933..55bd9581c8c4bd3b1b7ba75cc80c94cf7548638a 100644 +index cb68671e513fc812723b2abbdd21e8d6e18cf808..fb8dc7e4e6652222ed901b77a7bc263f671123bb 100644 --- a/io/papermc/paper/threadedregions/RegionizedServer.java +++ b/io/papermc/paper/threadedregions/RegionizedServer.java @@ -340,7 +340,7 @@ public final class RegionizedServer { @@ -27,7 +27,7 @@ index 4bd923b42d1c98ce7178e05f9324f46d99ffc933..55bd9581c8c4bd3b1b7ba75cc80c94cf } } diff --git a/io/papermc/paper/threadedregions/TickRegionScheduler.java b/io/papermc/paper/threadedregions/TickRegionScheduler.java -index a37f392146ccc0319cf56ee0058ae8782b598fe3..2223f0b38e8f628af64d1c916fb2310c4704a407 100644 +index 57a35d7a801621fc461e896eb2bba533d9d5bc1b..ae424c8931a2f82c6c8d4ddd8422a2c142a77a95 100644 --- a/io/papermc/paper/threadedregions/TickRegionScheduler.java +++ b/io/papermc/paper/threadedregions/TickRegionScheduler.java @@ -576,7 +576,7 @@ public final class TickRegionScheduler { @@ -40,7 +40,7 @@ index a37f392146ccc0319cf56ee0058ae8782b598fe3..2223f0b38e8f628af64d1c916fb2310c } // Luminol end - Add a config to enable tick command diff --git a/net/minecraft/commands/Commands.java b/net/minecraft/commands/Commands.java -index 74ef76058e5a410d12f88aa09450e7d90f63b5e6..1761167da363cd074a26499caadeaeb916461706 100644 +index 03f3fe221b14f0317947d74e25049bcce2ebeb66..6882e85fb6413e5c346c189a82b69f3e408aafba 100644 --- a/net/minecraft/commands/Commands.java +++ b/net/minecraft/commands/Commands.java @@ -268,7 +268,7 @@ public class Commands { @@ -53,23 +53,23 @@ index 74ef76058e5a410d12f88aa09450e7d90f63b5e6..1761167da363cd074a26499caadeaeb9 } // Luminol end - Add a config to enable tick command diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java -index 5e70e4e8a67e50a067dff1e592d617ca6a0426a9..63300acdcb1cdab2bf080c4939abb256fe05efa1 100644 +index 82a9143d43425943d6b730c8a43446881061ac2c..e764440aed35868c6c8617505ee84dc9e61aa9f3 100644 --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java -@@ -2191,7 +2191,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc - this.lastSentFood = -1; - this.teleportSpectators(transition, oldLevel); - // Leaves start - bot support -- if (fun.bm.lophine.config.modules.function.FakeplayerConfig.enable) { -+ if (fun.bm.lophine.config.modules.function.FakeplayerConfig.checkEnabled()) { - this.server.getBotList().bots.forEach(bot -> bot.sendFakeDataIfNeed(this, true)); // Leaves - render bot - } - // Leaves end - bot support +@@ -2169,7 +2169,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc + this.lastSentFood = -1; + this.teleportSpectators(transition, oldLevel); + // Leaves start - bot support +- if (fun.bm.lophine.config.modules.function.FakeplayerConfig.enable) { ++ if (fun.bm.lophine.config.modules.function.FakeplayerConfig.checkEnabled()) { + this.server.getBotList().bots.forEach(bot -> bot.sendFakeDataIfNeed(this, true)); // Leaves - render bot + } + // Leaves end - bot support diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java -index c95c7b9a3968fc34a900a613b65b5d3e1abb24bf..64779d7b28e61c91897db5226158d65c32bfc835 100644 +index 049648756f9053895e773efdca33fe65b3555b10..36b8cf8c466c9cd4369ceab49e3ac84f224142b8 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java -@@ -281,7 +281,7 @@ public abstract class PlayerList { +@@ -308,7 +308,7 @@ public abstract class PlayerList { // org.leavesmc.leaves.protocol.core.LeavesProtocolManager.handlePlayerJoin(player); // Leaves - protocol // Leaves start - bot support @@ -78,7 +78,7 @@ index c95c7b9a3968fc34a900a613b65b5d3e1abb24bf..64779d7b28e61c91897db5226158d65c org.leavesmc.leaves.bot.ServerBot bot = this.server.getBotList().getBotByName(player.getScoreboardName()); if (bot != null) { this.server.getBotList().removeBot(bot, org.leavesmc.leaves.event.bot.BotRemoveEvent.RemoveReason.INTERNAL, player.getBukkitEntity(), false, false); -@@ -442,7 +442,7 @@ public abstract class PlayerList { +@@ -491,7 +491,7 @@ public abstract class PlayerList { org.leavesmc.leaves.protocol.core.LeavesProtocolManager.handlePlayerJoin(player); // Leaves - protocol // Leaves start - bot support @@ -87,7 +87,7 @@ index c95c7b9a3968fc34a900a613b65b5d3e1abb24bf..64779d7b28e61c91897db5226158d65c org.leavesmc.leaves.bot.ServerBot bot = this.server.getBotList().getBotByName(player.getScoreboardName()); if (bot != null) { this.server.getBotList().removeBot(bot, org.leavesmc.leaves.event.bot.BotRemoveEvent.RemoveReason.INTERNAL, player.getBukkitEntity(), false, false); -@@ -971,7 +971,7 @@ public abstract class PlayerList { +@@ -1019,7 +1019,7 @@ public abstract class PlayerList { ).callEvent(); // Paper end // Leaves start - bot support @@ -97,27 +97,27 @@ index c95c7b9a3968fc34a900a613b65b5d3e1abb24bf..64779d7b28e61c91897db5226158d65c } // Leaves end - bot support diff --git a/net/minecraft/world/level/block/entity/HopperBlockEntity.java b/net/minecraft/world/level/block/entity/HopperBlockEntity.java -index ac5b419169f8574f92ff7195bfa76c9978bc8a63..8066cdcaba8d2fcfa2e9ba3b040a2867dbbc6978 100644 +index c23976cd72d7556ef96e04a7009031fc07b7a4fd..df57ae93f91daf8daed2fef48b685c72f0615763 100644 --- a/net/minecraft/world/level/block/entity/HopperBlockEntity.java +++ b/net/minecraft/world/level/block/entity/HopperBlockEntity.java -@@ -240,7 +240,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen - } +@@ -241,7 +241,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen + } + // Leaves start - Wool hopper counter +- if (fun.bm.lophine.config.modules.function.WoolHopperCounterConfig.unlimitedSpeed && org.leavesmc.leaves.util.HopperCounter.isEnabled()) { ++ if (fun.bm.lophine.carpet.config.modules.WoolHopperCounterConfig.hopperCountersUnlimitedSpeed && org.leavesmc.leaves.util.HopperCounter.isEnabled()) { + net.minecraft.world.item.DyeColor woolColor = org.leavesmc.leaves.util.WoolUtils.getWoolColorAtPosition(level, entity.getBlockPos().relative(state.getValue(HopperBlock.FACING))); + if (woolColor != null) { + for (int i = 0; i < Short.MAX_VALUE; i++) { +@@ -259,7 +259,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen + if (changed) { + entity.setCooldown(level.spigotConfig.hopperTransfer); // Spigot // Leaves start - Wool hopper counter -- if (fun.bm.lophine.config.modules.function.WoolHopperCounterConfig.unlimitedSpeed && org.leavesmc.leaves.util.HopperCounter.isEnabled()) { -+ if (fun.bm.lophine.carpet.config.modules.WoolHopperCounterConfig.hopperCountersUnlimitedSpeed && org.leavesmc.leaves.util.HopperCounter.isEnabled()) { - net.minecraft.world.item.DyeColor woolColor = org.leavesmc.leaves.util.WoolUtils.getWoolColorAtPosition(level, entity.getBlockPos().relative(state.getValue(HopperBlock.FACING))); - if (woolColor != null) { - for (int i = 0; i < Short.MAX_VALUE; i++) { -@@ -258,7 +258,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen - if (changed) { - entity.setCooldown(level.spigotConfig.hopperTransfer); // Spigot - // Leaves start - Wool hopper counter -- if (fun.bm.lophine.config.modules.function.WoolHopperCounterConfig.unlimitedSpeed && org.leavesmc.leaves.util.HopperCounter.isEnabled() && woolHopperCounter(level, pos, state, HopperBlockEntity.getContainerAt(level, pos))) { -+ if (fun.bm.lophine.carpet.config.modules.WoolHopperCounterConfig.hopperCountersUnlimitedSpeed && org.leavesmc.leaves.util.HopperCounter.isEnabled() && woolHopperCounter(level, pos, state, HopperBlockEntity.getContainerAt(level, pos))) { - entity.setCooldown(0); - return true; - } +- if (fun.bm.lophine.config.modules.function.WoolHopperCounterConfig.unlimitedSpeed && org.leavesmc.leaves.util.HopperCounter.isEnabled() && woolHopperCounter(level, pos, state, HopperBlockEntity.getContainerAt(level, pos))) { ++ if (fun.bm.lophine.carpet.config.modules.WoolHopperCounterConfig.hopperCountersUnlimitedSpeed && org.leavesmc.leaves.util.HopperCounter.isEnabled() && woolHopperCounter(level, pos, state, HopperBlockEntity.getContainerAt(level, pos))) { + entity.setCooldown(0); + return true; + } @@ -668,7 +668,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen } @@ -128,7 +128,7 @@ index ac5b419169f8574f92ff7195bfa76c9978bc8a63..8066cdcaba8d2fcfa2e9ba3b040a2867 // CraftBukkit start if (org.bukkit.event.inventory.InventoryPickupItemEvent.getHandlerList().getRegisteredListeners().length > 0) { // Paper - optimize hoppers diff --git a/net/minecraft/world/level/dimension/end/EnderDragonFight.java b/net/minecraft/world/level/dimension/end/EnderDragonFight.java -index 5ca008b3dca83c00f2ae86a608d726972a8d9f9d..125d5f59bdfdee5aa4bae2aa4756db363ee17f4b 100644 +index 8ff7320973dc4fd6ccc4ef7c1742686e0ed0e29a..373de7d03492ce907dba39a12749442116705d90 100644 --- a/net/minecraft/world/level/dimension/end/EnderDragonFight.java +++ b/net/minecraft/world/level/dimension/end/EnderDragonFight.java @@ -323,7 +323,7 @@ public class EnderDragonFight extends SavedData { diff --git a/lophine-server/paper-patches/features/0001-Rebrand-to-Lophine.patch b/lophine-server/paper-patches/features/0001-Rebrand-to-Lophine.patch index 39e824f..aca64cc 100644 --- a/lophine-server/paper-patches/features/0001-Rebrand-to-Lophine.patch +++ b/lophine-server/paper-patches/features/0001-Rebrand-to-Lophine.patch @@ -35,7 +35,7 @@ index fcdfd4f6de5e1c2d5e80c7f3d8cb0b33a62d257d..6eaa4e9bd1ecbfa531313ce1f470d55e metrics.addCustomChart(new Metrics.DrilldownPie("java_version", () -> { Map> map = new HashMap<>(); diff --git a/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java b/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java -index a5f2e4454258886536251288c3694f58386c7420..28371ecf31d5fc280aaa03ed9a86f5b565cf32f6 100644 +index 5dc8e9065ea1f3eeea73fcd049c1f9818f5d25d8..a6b22e9bd010815607e19034cc141784bec398f0 100644 --- a/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java +++ b/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java @@ -40,8 +40,8 @@ public class PaperVersionFetcher implements VersionFetcher { diff --git a/lophine-server/paper-patches/features/0004-Leaves-Leaves-Base-Protocol-Core.patch b/lophine-server/paper-patches/features/0004-Leaves-Leaves-Base-Protocol-Core.patch index c38781d..7616db1 100644 --- a/lophine-server/paper-patches/features/0004-Leaves-Leaves-Base-Protocol-Core.patch +++ b/lophine-server/paper-patches/features/0004-Leaves-Leaves-Base-Protocol-Core.patch @@ -8,10 +8,10 @@ As a part of : Leaves (https://github.com/LeavesMC/Leaves/blob/3e7f4a313ff0d2469 Licensed under: GPL-3.0 (https://www.gnu.org/licenses/gpl-3.0.html) diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index ba0779211405b8b83f7c7e7b1c55b3e4846029a3..5f685b07878443bfe5f63147a0728df0708d79ad 100644 +index 5cbb85056892e71227004ec73463eb390051c9fd..c93a44017c675fb090767e573b5583c8ccbb4e47 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -483,6 +483,7 @@ public final class CraftServer implements Server { +@@ -479,6 +479,7 @@ public final class CraftServer implements Server { this.potionBrewer = new io.papermc.paper.potion.PaperPotionBrewer(console); // Paper - custom potion mixes datapackManager = new io.papermc.paper.datapack.PaperDatapackManager(console.getPackRepository()); // Paper if (false) this.spark = new io.papermc.paper.SparksFly(this); // Paper - spark // Luminol - Force disable builtin spark @@ -19,7 +19,7 @@ index ba0779211405b8b83f7c7e7b1c55b3e4846029a3..5f685b07878443bfe5f63147a0728df0 } public boolean getCommandBlockOverride(String command) { -@@ -1057,6 +1058,7 @@ public final class CraftServer implements Server { +@@ -1052,6 +1053,7 @@ public final class CraftServer implements Server { if (false) this.spark.registerCommandBeforePlugins(this); // Paper - spark // Luminol - Force disable builtin spark this.overrideAllCommandBlockCommands = this.commandsConfiguration.getStringList("command-block-overrides").contains("*"); this.ignoreVanillaPermissions = this.commandsConfiguration.getBoolean("ignore-vanilla-permissions"); diff --git a/lophine-server/paper-patches/features/0006-Leaves-Leaves-Fakeplayer.patch b/lophine-server/paper-patches/features/0006-Leaves-Leaves-Fakeplayer.patch index 8c6c2c2..e87fee6 100644 --- a/lophine-server/paper-patches/features/0006-Leaves-Leaves-Fakeplayer.patch +++ b/lophine-server/paper-patches/features/0006-Leaves-Leaves-Fakeplayer.patch @@ -41,10 +41,10 @@ index 9180f23529a31b6b0a5b38bb7cda3e32d487f691..d0b763f07aee56f69a67c87d7dd15a44 if (!registration.getPlugin().isEnabled()) { continue; diff --git a/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java b/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java -index 5339ff469a38d35e72ea7227503a84395462f84a..d75b4ecb24f2ea42afc82ac255775d8f35121fe5 100644 +index 3a47e4c633ee016d5deeb6a5ee9e2e26769d5193..efb47f914fd0c0e966c6921ed1b26c4139754c55 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java -@@ -373,6 +373,7 @@ public abstract class CraftRegionAccessor implements RegionAccessor { +@@ -375,6 +375,7 @@ public abstract class CraftRegionAccessor implements RegionAccessor { @SuppressWarnings("unchecked") public T addEntity(T entity) { Preconditions.checkArgument(!entity.isInWorld(), "Entity has already been added to a world"); @@ -53,10 +53,10 @@ index 5339ff469a38d35e72ea7227503a84395462f84a..d75b4ecb24f2ea42afc82ac255775d8f if (nmsEntity.level() != this.getHandle().getLevel()) { throw new IllegalArgumentException(entity + " wasn't created with this world, you must create the entity with the world you want to add it to."); diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index 5f685b07878443bfe5f63147a0728df0708d79ad..0eb89fc127738e02e8d4d49418b83baaffe00cbd 100644 +index c93a44017c675fb090767e573b5583c8ccbb4e47..3a95cdcb5c507ae61d32b64502b556b5d6f2dc9d 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -303,6 +303,7 @@ public final class CraftServer implements Server { +@@ -304,6 +304,7 @@ public final class CraftServer implements Server { private final io.papermc.paper.potion.PaperPotionBrewer potionBrewer; public io.papermc.paper.SparksFly spark; // Paper - spark // Luminol - Force disable builtin spark private final ServerConfiguration serverConfig = new PaperServerConfiguration(); @@ -64,7 +64,7 @@ index 5f685b07878443bfe5f63147a0728df0708d79ad..0eb89fc127738e02e8d4d49418b83baa // Paper start - Folia region threading API private final io.papermc.paper.threadedregions.scheduler.FoliaRegionScheduler regionizedScheduler = new io.papermc.paper.threadedregions.scheduler.FoliaRegionScheduler(); // Folia - region threading -@@ -484,6 +485,7 @@ public final class CraftServer implements Server { +@@ -480,6 +481,7 @@ public final class CraftServer implements Server { datapackManager = new io.papermc.paper.datapack.PaperDatapackManager(console.getPackRepository()); // Paper if (false) this.spark = new io.papermc.paper.SparksFly(this); // Paper - spark // Luminol - Force disable builtin spark org.leavesmc.leaves.protocol.core.LeavesProtocolManager.init(); // Leaves - protocol @@ -72,7 +72,7 @@ index 5f685b07878443bfe5f63147a0728df0708d79ad..0eb89fc127738e02e8d4d49418b83baa } public boolean getCommandBlockOverride(String command) { -@@ -1377,7 +1379,7 @@ public final class CraftServer implements Server { +@@ -1380,7 +1382,7 @@ public final class CraftServer implements Server { return false; } @@ -81,7 +81,7 @@ index 5f685b07878443bfe5f63147a0728df0708d79ad..0eb89fc127738e02e8d4d49418b83baa return false; } -@@ -3113,6 +3115,13 @@ public final class CraftServer implements Server { +@@ -3115,6 +3117,13 @@ public final class CraftServer implements Server { } // Leaves end - Feature API @@ -96,10 +96,10 @@ index 5f685b07878443bfe5f63147a0728df0708d79ad..0eb89fc127738e02e8d4d49418b83baa /** * Gets the TPS from the region which owns the specified location, or {@code null} if no region owns diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java -index 03ad9254c4b5556119fe73d533ceac7073b8fe74..fd2e24b6219219fa1fe7d2ba1d877ee4c24676ca 100644 +index 0232298df7804675cc5bdb85e99991fa9bbfa57a..4e4ff1cdcf88890ad76b39a89399e353edba54bb 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java -@@ -255,7 +255,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -247,7 +247,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public int getPlayerCount() { @@ -108,7 +108,7 @@ index 03ad9254c4b5556119fe73d533ceac7073b8fe74..fd2e24b6219219fa1fe7d2ba1d877ee4 } @Override -@@ -1126,9 +1126,9 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1121,9 +1121,9 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public List getPlayers() { @@ -120,7 +120,7 @@ index 03ad9254c4b5556119fe73d533ceac7073b8fe74..fd2e24b6219219fa1fe7d2ba1d877ee4 HumanEntity bukkitEntity = human.getBukkitEntity(); if ((bukkitEntity != null) && (bukkitEntity instanceof Player)) { -@@ -1628,7 +1628,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1623,7 +1623,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { public void playSound(final net.kyori.adventure.sound.Sound sound) { org.spigotmc.AsyncCatcher.catchOp("play sound"); // Paper final long seed = sound.seed().orElseGet(this.world.getRandom()::nextLong); @@ -129,7 +129,7 @@ index 03ad9254c4b5556119fe73d533ceac7073b8fe74..fd2e24b6219219fa1fe7d2ba1d877ee4 player.connection.send(io.papermc.paper.adventure.PaperAdventure.asSoundPacket(sound, player.getX(), player.getY(), player.getZ(), seed, null)); } } -@@ -1656,7 +1656,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1651,7 +1651,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { org.spigotmc.AsyncCatcher.catchOp("play sound"); // Paper final long seed = sound.seed().orElseGet(this.getHandle().getRandom()::nextLong); if (emitter == net.kyori.adventure.sound.Sound.Emitter.self()) { @@ -138,7 +138,7 @@ index 03ad9254c4b5556119fe73d533ceac7073b8fe74..fd2e24b6219219fa1fe7d2ba1d877ee4 player.connection.send(io.papermc.paper.adventure.PaperAdventure.asSoundPacket(sound, player, seed, null)); } } else if (emitter instanceof CraftEntity craftEntity) { -@@ -1779,7 +1779,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1774,7 +1774,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { Preconditions.checkArgument(particle.getDataType().isInstance(data), "data (%s) should be %s", data.getClass(), particle.getDataType()); } this.getHandle().sendParticlesSource( @@ -148,10 +148,10 @@ index 03ad9254c4b5556119fe73d533ceac7073b8fe74..fd2e24b6219219fa1fe7d2ba1d877ee4 CraftParticle.createParticleParam(particle, data), // Particle force, diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java -index d43b1a6e6a8ac2a21b0a048e838115b0403170dd..42c2c6a05645e5aef26e9d3a91ad93563a297ca3 100644 +index b4efe7185fcefd8e9d62d6eb4348c3e5d8b9eba1..7b14ffd2c68db673a08d9693062e97eac39827be 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java -@@ -127,6 +127,8 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { +@@ -128,6 +128,8 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { return new CraftHumanEntity(server, (net.minecraft.world.entity.player.Player) entity); } @@ -161,10 +161,10 @@ index d43b1a6e6a8ac2a21b0a048e838115b0403170dd..42c2c6a05645e5aef26e9d3a91ad9356 if (entity instanceof EnderDragonPart complexPart) { if (complexPart.parentMob instanceof EnderDragon) { diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java -index 23882dbe5fdfe9f0cf98a13791f70fe83393639d..41cf8145a6a5f1542e06af522201fccef1d5f07d 100644 +index 0754bd441290bacc27f3d1ae2d6cf5af94345745..04119b949c878064a0ae1028f7147de7c0e7aa16 100644 --- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java -@@ -1004,7 +1004,11 @@ public class CraftEventFactory { +@@ -1009,7 +1009,11 @@ public class CraftEventFactory { event.setKeepInventory(keepInventory); event.setKeepLevel(victim.keepLevel); // SPIGOT-2222: pre-set keepLevel populateFields(victim, event); // Paper - make cancellable diff --git a/lophine-server/paper-patches/features/0007-Leaves-Replay-Mod-API.patch b/lophine-server/paper-patches/features/0007-Leaves-Replay-Mod-API.patch index 404d684..2a0de04 100644 --- a/lophine-server/paper-patches/features/0007-Leaves-Replay-Mod-API.patch +++ b/lophine-server/paper-patches/features/0007-Leaves-Replay-Mod-API.patch @@ -21,10 +21,10 @@ index d0b763f07aee56f69a67c87d7dd15a44b6f44db7..bd301425f4c3cdf2b2bd22c1775b7ca9 } // Leaves end - skip bot diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index 0eb89fc127738e02e8d4d49418b83baaffe00cbd..53e49df883ec0fab984f2329d044d12ed6b1edff 100644 +index 3a95cdcb5c507ae61d32b64502b556b5d6f2dc9d..ff7afd6bda0cd7be176881c8b7924bf1b5329bbd 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -304,6 +304,7 @@ public final class CraftServer implements Server { +@@ -305,6 +305,7 @@ public final class CraftServer implements Server { public io.papermc.paper.SparksFly spark; // Paper - spark // Luminol - Force disable builtin spark private final ServerConfiguration serverConfig = new PaperServerConfiguration(); private final org.leavesmc.leaves.entity.bot.CraftBotManager botManager; // Leaves @@ -32,16 +32,16 @@ index 0eb89fc127738e02e8d4d49418b83baaffe00cbd..53e49df883ec0fab984f2329d044d12e // Paper start - Folia region threading API private final io.papermc.paper.threadedregions.scheduler.FoliaRegionScheduler regionizedScheduler = new io.papermc.paper.threadedregions.scheduler.FoliaRegionScheduler(); // Folia - region threading -@@ -398,7 +399,7 @@ public final class CraftServer implements Server { +@@ -399,7 +400,7 @@ public final class CraftServer implements Server { public CraftServer(DedicatedServer console, PlayerList playerList) { this.console = console; this.playerList = (DedicatedPlayerList) playerList; -- this.playerView = Collections.unmodifiableList(Lists.transform(playerList.players, new Function() { -+ this.playerView = Collections.unmodifiableList(Lists.transform(playerList.realPlayers, new Function() { // Leaves - replay api - @Override - public CraftPlayer apply(ServerPlayer player) { - return player.getBukkitEntity(); -@@ -3186,4 +3187,11 @@ public final class CraftServer implements Server { +- this.playerView = MCUtil.transformUnmodifiable(playerList.getPlayers(), ServerPlayer::getBukkitEntity); ++ this.playerView = MCUtil.transformUnmodifiable(playerList.realPlayers, ServerPlayer::getBukkitEntity); + this.serverVersion = io.papermc.paper.ServerBuildInfo.buildInfo().asString(io.papermc.paper.ServerBuildInfo.StringRepresentation.VERSION_SIMPLE); // Paper - improve version + this.structureManager = new CraftStructureManager(console.getStructureManager(), console.registryAccess()); + this.serverTickManager = new CraftServerTickManager(console.tickRateManager()); +@@ -3188,4 +3189,11 @@ public final class CraftServer implements Server { } } // Folia end - region TPS API @@ -54,10 +54,10 @@ index 0eb89fc127738e02e8d4d49418b83baaffe00cbd..53e49df883ec0fab984f2329d044d12e + // Leaves end - replay mod api } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java -index 42c2c6a05645e5aef26e9d3a91ad93563a297ca3..759d54f1f012461fc322d452bb26f7fd6e601039 100644 +index 7b14ffd2c68db673a08d9693062e97eac39827be..62bbd17b4f0109ed78f24caf7666edd69c04831b 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java -@@ -128,6 +128,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { +@@ -129,6 +129,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { } if (entity instanceof org.leavesmc.leaves.bot.ServerBot bot) { return new org.leavesmc.leaves.entity.bot.CraftBot(server, bot); } @@ -66,10 +66,10 @@ index 42c2c6a05645e5aef26e9d3a91ad93563a297ca3..759d54f1f012461fc322d452bb26f7fd // Special case complex part, since there is no extra entity type for them if (entity instanceof EnderDragonPart complexPart) { diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 59e3a15cce0ed34aa3b75b92db9e349c9fe481fa..044f3168583b23542e18fe14853d3b98bad3fa4d 100644 +index e655c6b817b1ef2b3186c4b16a1039081139e97f..96d8ed40eae0765d5d48b1397de525581b8bf2fb 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -2086,7 +2086,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player, PluginMessa +@@ -2085,7 +2085,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player, PluginMessa @Override public boolean canSee(Player player) { @@ -79,10 +79,10 @@ index 59e3a15cce0ed34aa3b75b92db9e349c9fe481fa..044f3168583b23542e18fe14853d3b98 @Override diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java -index fa3e2bf2b31ca5173d71082e93eb7eaa4faa2816..bd3c4eb10489f13562b31f4b809e80b19717bc25 100644 +index c189f583598f94fc7944afcabe130c5ee9504c0d..2e56d20d50d8a5d5630816b822b10a43ce3fa6c7 100644 --- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java +++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java -@@ -347,7 +347,7 @@ public final class CraftMagicNumbers implements UnsafeValues { +@@ -294,7 +294,7 @@ public final class CraftMagicNumbers implements UnsafeValues { Bukkit.getLogger().log(Level.SEVERE, "Error saving advancement " + key, ex); } @@ -92,14 +92,14 @@ index fa3e2bf2b31ca5173d71082e93eb7eaa4faa2816..bd3c4eb10489f13562b31f4b809e80b1 player.getAdvancements().flushDirty(player, false); }); diff --git a/src/main/java/org/bukkit/craftbukkit/util/LazyPlayerSet.java b/src/main/java/org/bukkit/craftbukkit/util/LazyPlayerSet.java -index 25aae550dcdcef2df268d0dd99bdcc9bbd49fcf8..83af50de50a03e164d572f3c3466b6d0b42ed138 100644 +index 15261d2e96347584e4baf65f12b336b73a68cd37..83af50de50a03e164d572f3c3466b6d0b42ed138 100644 --- a/src/main/java/org/bukkit/craftbukkit/util/LazyPlayerSet.java +++ b/src/main/java/org/bukkit/craftbukkit/util/LazyPlayerSet.java @@ -23,7 +23,7 @@ public class LazyPlayerSet extends LazyHashSet { } public static Set makePlayerSet(final MinecraftServer server) { -- List players = server.getPlayerList().players; +- List players = server.getPlayerList().getPlayers(); + List players = server.getPlayerList().realPlayers; // Leaves - only real players Set reference = new HashSet<>(players.size()); for (ServerPlayer player : players) { diff --git a/lophine-server/src/main/java/fun/bm/lophine/carpet/RedirectedConfigs.java b/lophine-server/src/main/java/fun/bm/lophine/carpet/RedirectedConfigs.java deleted file mode 100644 index 805f9c0..0000000 --- a/lophine-server/src/main/java/fun/bm/lophine/carpet/RedirectedConfigs.java +++ /dev/null @@ -1,162 +0,0 @@ -package fun.bm.lophine.carpet; - -import fun.bm.lophine.carpet.config.modules.GeneralCompatConfig; -import fun.bm.lophine.carpet.config.modules.WoolHopperCounterConfig; -import fun.bm.lophine.config.modules.function.FakeplayerConfig; -import me.earthme.luminol.config.ConfigManager; -import me.earthme.luminol.config.ConfigsInstance; - -public class RedirectedConfigs { - public static void redirect() { - updateSuppressionCrashFix(); - commandTick(); - optimizedDragonRespawn(); - woolHopperCounter(); - fakeplayer(); - creativeFlyNoClip(); - redstoneChanges(); - } - - private static void updateSuppressionCrashFix() { - ConfigsInstance config = ConfigManager.getConfigs("lophine"); - try { - boolean updateSuppressionCrashFixEnabled = config.getConfigOrigin("fixes.update-suppression-crash-fix.enabled"); - if (updateSuppressionCrashFixEnabled) { - ConfigsInstance carpetConfig = ConfigManager.getConfigs("lophine_carpet"); - GeneralCompatConfig.amsUpdateSuppressionCrashFix = true; - carpetConfig.setConfig(new String[]{"carpet", "general", "amsUpdateSuppressionCrashFix"}, true); - GeneralCompatConfig.yeetUpdateSuppressionCrash = true; - carpetConfig.setConfig(new String[]{"carpet", "general", "yeetUpdateSuppressionCrash"}, true); - } - config.removeConfig(new String[]{"fixes", "update-suppression-crash-fix", "enabled"}); - } catch (Exception ignored) { - } - } - - private static void commandTick() { - try { - boolean shouldEnabled = false; - // first check lophine - try { - ConfigsInstance config = ConfigManager.getConfigs("lophine"); - shouldEnabled = config.getConfigOrigin("experiment.command.tick_command_enabled"); - config.removeConfig(new String[]{"experiment", "command", "tick_command_enabled"}); - } catch (Exception ignored) { - } - // then check luminol - try { - ConfigsInstance config = ConfigManager.getConfigs("luminol"); - shouldEnabled = shouldEnabled || (boolean) config.getConfigOrigin("experiment.command.enable_tick_command"); - config.removeConfig(new String[]{"experiment", "command", "enable_tick_command"}); - } catch (Exception ignored) { - } - - if (shouldEnabled) { - ConfigsInstance carpetConfig = ConfigManager.getConfigs("lophine_carpet"); - GeneralCompatConfig.commandTick = true; - carpetConfig.setConfig(new String[]{"carpet", "general", "commandTick"}, true); - } - } catch (Exception ignored) { - } - } - - private static void optimizedDragonRespawn() { - ConfigsInstance config = ConfigManager.getConfigs("luminol"); - try { - boolean optimizedDragonRespawnEnabled = config.getConfigOrigin("optimizations.end_dragon.optimized_dragon_respawn"); - if (optimizedDragonRespawnEnabled) { - ConfigsInstance carpetConfig = ConfigManager.getConfigs("lophine_carpet"); - GeneralCompatConfig.optimizedDragonRespawn = true; - carpetConfig.setConfig(new String[]{"carpet", "general", "optimizedDragonRespawn"}, true); - } - config.removeConfig(new String[]{"optimizations", "end_dragon", "optimized_dragon_respawn"}); - } catch (Exception ignored) { - } - } - - private static void woolHopperCounter() { - ConfigsInstance config = ConfigManager.getConfigs("lophine"); - ConfigsInstance carpetConfig = ConfigManager.getConfigs("lophine_carpet"); - try { - boolean woolHopperCounterEnabled = config.getConfigOrigin("function.wool-hopper-counter.enabled"); - if (woolHopperCounterEnabled) { - WoolHopperCounterConfig.hopperCounters = true; - carpetConfig.setConfig(new String[]{"carpet", "hopper_counter", "hopperCounters"}, true); - } - config.removeConfig(new String[]{"function", "wool-hopper-counter", "enabled"}); - } catch (Exception ignored) { - } - try { - boolean woolHopperCounterUnlimitedSpeed = config.getConfigOrigin("function.wool-hopper-counter.unlimited-speed"); - if (woolHopperCounterUnlimitedSpeed) { - WoolHopperCounterConfig.hopperCountersUnlimitedSpeed = true; - carpetConfig.setConfig(new String[]{"carpet", "hopper_counter", "hopperCountersUnlimitedSpeed"}, true); - } - config.removeConfig(new String[]{"function", "wool-hopper-counter", "unlimited-speed"}); - } catch (Exception ignored) { - } - } - - private static void fakeplayer() { - ConfigsInstance carpetConfig = ConfigManager.getConfigs("lophine_carpet"); - try { - boolean bot = carpetConfig.getConfigOrigin("carpet.fakeplayer.commandBot"); - if (bot) { - try { - ConfigsInstance lophineConfig = ConfigManager.getConfigs("lophine"); - FakeplayerConfig.enable = true; - lophineConfig.setConfig(new String[]{"function", "fakeplayer", "enable"}, true); - } catch (Exception ignored) { - } - } - } catch (Exception ignored) { - } - carpetConfig.removeConfig(new String[]{"carpet", "fakeplayer", "commandBot"}); - } - - private static void creativeFlyNoClip() { - ConfigsInstance config = ConfigManager.getConfigs("lophine"); - try { - boolean creativeFlyNoClipEnabled = config.getConfigOrigin("function.creative_fly_no_clip.enabled"); - if (creativeFlyNoClipEnabled) { - ConfigsInstance carpetConfig = ConfigManager.getConfigs("lophine_carpet"); - GeneralCompatConfig.creativeNoClip = true; - carpetConfig.setConfig(new String[]{"carpet", "general", "creativeNoClip"}, true); - } - config.removeConfig(new String[]{"function", "creative_fly_no_clip", "enabled"}); - } catch (Exception ignored) { - } - } - - private static void redstoneChanges() { - ConfigsInstance config = ConfigManager.getConfigs("lophine"); - ConfigsInstance carpetConfig = ConfigManager.getConfigs("lophine_carpet"); - try { - boolean dustTrapdoorReintroduced = config.getConfigOrigin("experiment.redstone.redstone-ignore-upwards-update"); - if (dustTrapdoorReintroduced) { - GeneralCompatConfig.dustTrapdoorReintroduced = true; - carpetConfig.setConfig(new String[]{"carpet", "general", "dustTrapdoorReintroduced"}, true); - } - config.removeConfig(new String[]{"experiment", "redstone", "redstone-ignore-upwards-update"}); - } catch (Exception ignored) { - } - try { - boolean shulkerBoxCCEReintroduced = config.getConfigOrigin("experiment.redstone.cce-update-suppression"); - if (shulkerBoxCCEReintroduced) { - GeneralCompatConfig.shulkerBoxCCEReintroduced = true; - carpetConfig.setConfig(new String[]{"carpet", "general", "shulkerBoxCCEReintroduced"}, true); - } - config.removeConfig(new String[]{"experiment", "redstone", "cce-update-suppression"}); - } catch (Exception ignored) { - } - try { - boolean instantBlockUpdaterReintroduced = config.getConfigOrigin("experiment.redstone.instant-block-updater"); - if (instantBlockUpdaterReintroduced) { - GeneralCompatConfig.instantBlockUpdaterReintroduced = true; - carpetConfig.setConfig(new String[]{"carpet", "general", "instantBlockUpdaterReintroduced"}, true); - } - config.removeConfig(new String[]{"experiment", "redstone", "instant-block-updater"}); - } catch (Exception ignored) { - } - } -} diff --git a/lophine-server/src/main/java/fun/bm/lophine/carpet/config/modules/GeneralCompatConfig.java b/lophine-server/src/main/java/fun/bm/lophine/carpet/config/modules/GeneralCompatConfig.java index 68c5219..a044798 100644 --- a/lophine-server/src/main/java/fun/bm/lophine/carpet/config/modules/GeneralCompatConfig.java +++ b/lophine-server/src/main/java/fun/bm/lophine/carpet/config/modules/GeneralCompatConfig.java @@ -1,11 +1,9 @@ package fun.bm.lophine.carpet.config.modules; import fun.bm.lophine.carpet.CarpetCompatSync; -import fun.bm.lophine.carpet.RedirectedConfigs; import me.earthme.luminol.config.IConfigModule; import me.earthme.luminol.config.flags.ConfigClassInfo; import me.earthme.luminol.config.flags.ConfigInfo; -import me.earthme.luminol.config.flags.TransformedConfig; import me.earthme.luminol.enums.EnumConfigCategory; import java.util.List; @@ -19,7 +17,6 @@ import java.util.List; Only rules that already have a working server-side implementation are exposed here.""" ) public class GeneralCompatConfig implements IConfigModule { - @TransformedConfig(name = "language", directory = {"carpet", "general"}, transformComments = false) @ConfigInfo(name = "language", comments = """ Carpet language value. ATTENTION: This config will not update in Lophine global now!""") @@ -269,10 +266,7 @@ public class GeneralCompatConfig implements IConfigModule { @Override public void beforeFinalLoad() { - // Should remove in next Minecraft version update - RedirectedConfigs.redirect(); - - // after all config updated, send changes to client + // send changes to client CarpetCompatSync.apply(); } } diff --git a/lophine-server/src/main/java/fun/bm/lophine/carpet/config/modules/RemovedConfig.java b/lophine-server/src/main/java/fun/bm/lophine/carpet/config/modules/RemovedConfig.java index 5f32064..779e427 100644 --- a/lophine-server/src/main/java/fun/bm/lophine/carpet/config/modules/RemovedConfig.java +++ b/lophine-server/src/main/java/fun/bm/lophine/carpet/config/modules/RemovedConfig.java @@ -3,12 +3,10 @@ package fun.bm.lophine.carpet.config.modules; import me.earthme.luminol.config.IConfigModule; import me.earthme.luminol.config.flags.ConfigClassInfo; import me.earthme.luminol.config.flags.ConfigInfo; -import me.earthme.luminol.config.flags.TransformedConfig; import me.earthme.luminol.enums.EnumConfigCategory; @ConfigClassInfo(category = EnumConfigCategory.REMOVED, name = "removed_config") public class RemovedConfig implements IConfigModule { - @TransformedConfig(name = "enabled", directory = {"carpet", "core"}) @ConfigInfo(name = "removed", comments = """ RemovedConfig redirect to here, no any function.""") diff --git a/lophine-server/src/main/java/fun/bm/lophine/config/modules/removed/RemovedConfig.java b/lophine-server/src/main/java/fun/bm/lophine/config/modules/removed/RemovedConfig.java index a5e347d..261f1d9 100644 --- a/lophine-server/src/main/java/fun/bm/lophine/config/modules/removed/RemovedConfig.java +++ b/lophine-server/src/main/java/fun/bm/lophine/config/modules/removed/RemovedConfig.java @@ -3,13 +3,10 @@ package fun.bm.lophine.config.modules.removed; import me.earthme.luminol.config.IConfigModule; import me.earthme.luminol.config.flags.ConfigClassInfo; import me.earthme.luminol.config.flags.ConfigInfo; -import me.earthme.luminol.config.flags.TransformedConfig; import me.earthme.luminol.enums.EnumConfigCategory; @ConfigClassInfo(category = EnumConfigCategory.REMOVED, name = "removed_config") public class RemovedConfig implements IConfigModule { - @TransformedConfig(name = "always_count", directory = {"experiment", "global_entities_counter"}) - @TransformedConfig(name = "enabled", directory = {"misc", "auto_update"}) @ConfigInfo(name = "removed", comments = """ RemovedConfig redirect to here, no any function.""") diff --git a/lophine-server/src/main/java/fun/bm/lophine/protocol/CarpetLoggerProtocol.java b/lophine-server/src/main/java/fun/bm/lophine/protocol/CarpetLoggerProtocol.java index b71f9cf..85d0527 100644 --- a/lophine-server/src/main/java/fun/bm/lophine/protocol/CarpetLoggerProtocol.java +++ b/lophine-server/src/main/java/fun/bm/lophine/protocol/CarpetLoggerProtocol.java @@ -137,7 +137,7 @@ public class CarpetLoggerProtocol implements LeavesProtocol { private static net.minecraft.network.chat.Component buildTpsLine(MinecraftServer server) { ServerTickRateManager tickManager = server.tickRateManager(); - ca.spottedleaf.moonrise.common.time.TickData.TickReportData tickData = TickRegionScheduler.getCurrentRegion().getData().getRegionSchedulingHandle().getTickReport5s(System.nanoTime()); + ca.spottedleaf.common.time.TickData.TickReportData tickData = TickRegionScheduler.getCurrentRegion().getData().getRegionSchedulingHandle().getTickReport5s(System.nanoTime()); final double tps = tickData.tpsData().segmentAll().average(); final double mspt = tickData.timePerTickData().segmentAll().average() / 1.0E6; diff --git a/lophine-server/src/main/java/fun/bm/lophine/utils/EntitiesCounterUtil.java b/lophine-server/src/main/java/fun/bm/lophine/utils/EntitiesCounterUtil.java index fad87d5..6347d5b 100644 --- a/lophine-server/src/main/java/fun/bm/lophine/utils/EntitiesCounterUtil.java +++ b/lophine-server/src/main/java/fun/bm/lophine/utils/EntitiesCounterUtil.java @@ -186,7 +186,7 @@ public class EntitiesCounterUtil { // Paper start - Optional per player mob spawns if (countMobs) { - chunk.level.getChunkSource().chunkMap.updatePlayerMobTypeMap(entity); + ((ServerLevel) chunk.getLevel()).getChunkSource().chunkMap.updatePlayerMobTypeMap(entity); } // Paper end - Optional per player mob spawns }); diff --git a/lophine-server/src/main/java/org/leavesmc/leaves/bot/BotList.java b/lophine-server/src/main/java/org/leavesmc/leaves/bot/BotList.java index 6a11bf2..b03cc52 100644 --- a/lophine-server/src/main/java/org/leavesmc/leaves/bot/BotList.java +++ b/lophine-server/src/main/java/org/leavesmc/leaves/bot/BotList.java @@ -18,6 +18,7 @@ package org.leavesmc.leaves.bot; import ca.spottedleaf.moonrise.common.util.TickThread; +import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.mojang.authlib.GameProfile; import com.mojang.authlib.properties.Property; @@ -32,20 +33,33 @@ import io.papermc.paper.threadedregions.scheduler.FoliaGlobalRegionScheduler; import io.papermc.paper.util.MCUtil; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.Style; +import net.minecraft.ChatFormatting; import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.Connection; +import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.Component; -import net.minecraft.network.protocol.game.ClientboundRemoveEntitiesPacket; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.network.protocol.game.*; +import net.minecraft.network.protocol.status.ServerStatus; import net.minecraft.resources.ResourceKey; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.network.CommonListenerCookie; +import net.minecraft.server.network.ServerGamePacketListenerImpl; +import net.minecraft.server.players.NameAndId; +import net.minecraft.server.players.UserNameToIdResolver; import net.minecraft.util.ProblemReporter; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.npc.villager.AbstractVillager; import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.projectile.throwableitemprojectile.ThrownEnderpearl; +import net.minecraft.world.item.crafting.RecipeManager; import net.minecraft.world.level.Level; +import net.minecraft.world.level.gamerules.GameRules; +import net.minecraft.world.level.storage.LevelData; import net.minecraft.world.level.storage.ValueInput; +import net.minecraft.world.scores.PlayerTeam; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.command.CommandSender; @@ -190,33 +204,110 @@ public class BotList { public ServerBot placeNewBot(@NotNull ServerBot bot, ServerLevel world, Location location, ValueInput save) { Optional optional = Optional.ofNullable(save); - bot.isRealPlayer = true; - bot.loginTime = System.currentTimeMillis(); + CommonListenerCookie cookie = CommonListenerCookie.createInitial(bot.gameProfile, false); + bot.isRealPlayer = true; // Paper + bot.loginTime = System.currentTimeMillis(); // Paper - Replace OfflinePlayer#getLastPlayed bot.connection = new ServerBotPacketListenerImpl(this.server, bot); if (bot.connection.connection.getPlayer() != bot) { throw new IllegalStateException("Bot connection is not bound to its bot player"); } - bot.connection.markClientLoaded(); + bot.getBukkitEntity().setMetadata("NPC", new FixedMetadataValue(MinecraftInternalPlugin.INSTANCE, true)); - bot.setServerLevel(world); BotSpawnLocationEvent event = new BotSpawnLocationEvent(bot.getBukkitEntity(), location); this.server.server.getPluginManager().callEvent(event); - location = event.getSpawnLocation(); - bot.spawnIn(world); - bot.gameMode.setLevel(bot.level()); + Connection connection = bot.connection.connection; + NameAndId gameProfile = bot.nameAndId(); + UserNameToIdResolver profileCache = this.server.services().nameToIdCache(); + Optional oldProfile = profileCache.get(gameProfile.id()); + String oldName = oldProfile.map(NameAndId::name).orElse(gameProfile.name()); + if (bot.lastKnownName != null) { + oldName = bot.lastKnownName; + bot.lastKnownName = null; + } // CraftBukkit - Better rename detection + profileCache.add(gameProfile); + final ServerLevel[] level = {bot.level()}; + String address = connection.getLoggableAddress(this.server.logIPs()); + LevelData levelData = level[0].getLevelData(); + ServerGamePacketListenerImpl playerConnection = new ServerGamePacketListenerImpl(this.server, connection, bot, cookie); + // Folia start - rewrite login process + // only after setting the connection listener to game type, add the connection to this regions list + level[0].getCurrentWorldData().connections.add(connection); + // Folia end - rewrite login process + if (!me.earthme.luminol.config.modules.optimizations.AsyncProtocolChangeConfig.enabled) { // Luminol - Async protocol switch // we will run async switch once these main thread logics became done + connection.setupInboundProtocol( + GameProtocols.SERVERBOUND_TEMPLATE.bind(RegistryFriendlyByteBuf.decorator(this.server.registryAccess()), playerConnection), playerConnection + ); + } // Luminol - Async protocol switch + playerConnection.suspendFlushing(); + GameRules gameRules = level[0].getGameRules(); + boolean immediateRespawn = gameRules.get(GameRules.IMMEDIATE_RESPAWN); + boolean reducedDebugInfo = gameRules.get(GameRules.REDUCED_DEBUG_INFO); + boolean doLimitedCrafting = gameRules.get(GameRules.LIMITED_CRAFTING); + playerConnection.send( + new ClientboundLoginPacket( + bot.getId(), + levelData.isHardcore(), + this.server.levelKeys(), + this.server.getPlayerList().getMaxPlayers(), + io.papermc.paper.FeatureHooks.getViewDistance(level[0]), // Paper - view distance + io.papermc.paper.FeatureHooks.getSimulationDistance(level[0]), // Paper - simulation distance + reducedDebugInfo, + !immediateRespawn, + doLimitedCrafting, + bot.createCommonSpawnInfo(level[0]), + this.server.usesAuthentication(), + this.server.enforceSecureProfile() + ) + ); + bot.getBukkitEntity().sendSupportedChannels(); // CraftBukkit + playerConnection.send(new ClientboundChangeDifficultyPacket(levelData.getDifficulty(), levelData.isDifficultyLocked())); + playerConnection.send(new ClientboundPlayerAbilitiesPacket(bot.getAbilities())); + playerConnection.send(new ClientboundSetHeldSlotPacket(bot.getInventory().getSelectedSlot())); + RecipeManager recipeManager = this.server.getRecipeManager(); + playerConnection.send( + new ClientboundUpdateRecipesPacket(recipeManager.getSynchronizedItemProperties(), recipeManager.getSynchronizedStonecutterRecipes()) + ); + this.server.getPlayerList().sendPlayerPermissionLevel(bot); + bot.getStats().markAllDirty(); + bot.getRecipeBook().sendInitialRecipeBook(bot); + //this.updateEntireScoreboard(level.getScoreboard(), player); // Folia - region threading + this.server.invalidateStatus(); + MutableComponent component; + if (bot.getGameProfile().name().equalsIgnoreCase(oldName)) { + component = Component.translatable("multiplayer.player.joined", bot.getDisplayName()); + } else { + component = Component.translatable("multiplayer.player.joined.renamed", bot.getDisplayName(), oldName); + } - bot.setPosRaw(location.getX(), location.getY(), location.getZ()); - bot.setRot(location.getYaw(), location.getPitch()); - - bot.connection.teleport(bot.getX(), bot.getY(), bot.getZ(), bot.getYRot(), bot.getXRot()); + // CraftBukkit start + component.withStyle(ChatFormatting.YELLOW); + final Component[] joinMessage = {component}; // Paper - Adventure + playerConnection.teleport(bot.getX(), bot.getY(), bot.getZ(), bot.getYRot(), bot.getXRot()); + ServerStatus status = this.server.getStatus(); + if (status != null && !cookie.transferred()) { + bot.sendServerStatus(status); + } + // player.connection.send(ClientboundPlayerInfoUpdatePacket.createPlayerInitializing(this.players)); // CraftBukkit - replaced with loop below + this.server.getPlayerList().getPlayers().add(bot); this.bots.add(bot); this.botsByName.put(bot.getScoreboardName().toLowerCase(Locale.ROOT), bot); this.botsByUUID.put(bot.getUUID(), bot); - + // this.broadcastAll(ClientboundPlayerInfoUpdatePacket.createPlayerInitializing(List.of(player))); // CraftBukkit - replaced with loop below + // Paper start - Fire PlayerJoinEvent when Player is actually ready; correctly register player BEFORE PlayerJoinEvent, so the entity is valid and doesn't require tick delay hacks bot.suppressTrackerForLogin = true; + this.server.getPlayerList().sendLevelInfo(bot, level[0]); + level[0].addNewPlayer(bot); + this.server.getCustomBossEvents().onPlayerConnect(bot); // see commented out section below serverLevel.addPlayerJoin(player); + // Paper end - Fire PlayerJoinEvent when Player is actually ready + bot.initInventoryMenu(); + // CraftBukkit start + org.bukkit.craftbukkit.entity.CraftPlayer bukkitPlayer = bot.getBukkitEntity(); + + // Ensure that player inventory is populated with its viewer + bot.containerMenu.transferTo(bot.containerMenu, bukkitPlayer); Runnable task = () -> { optional.ifPresent(nbt -> { @@ -228,21 +319,100 @@ public class BotList { BotJoinEvent event1 = new BotJoinEvent(bot.getBukkitEntity(), PaperAdventure.asAdventure(Component.translatable("multiplayer.player.joined", bot.getDisplayName())).style(Style.style(NamedTextColor.YELLOW))); this.server.server.getPluginManager().callEvent(event1); - net.kyori.adventure.text.Component joinMessage = event1.joinMessage(); - if (joinMessage != null && !joinMessage.equals(net.kyori.adventure.text.Component.empty())) { - this.server.getPlayerList().broadcastSystemMessage(PaperAdventure.asVanilla(joinMessage), false); + if (!bot.connection.isAcceptingMessages()) { + //return; // Folia - region threading - must still allow the player to connect, as we must add to chunk map before handling disconnect } - bot.renderInfo(); - bot.suppressTrackerForLogin = false; + org.leavesmc.leaves.protocol.core.LeavesProtocolManager.handlePlayerJoin(bot); // Leaves - protocol - bot.level().getChunkSource().chunkMap.addEntity(bot); - bot.renderData(); + final net.kyori.adventure.text.Component jm = event1.joinMessage(); + + if (jm != null && !jm.equals(net.kyori.adventure.text.Component.empty())) { // Paper - Adventure + joinMessage[0] = io.papermc.paper.adventure.PaperAdventure.asVanilla(jm); // Paper - Adventure + this.server.getPlayerList().broadcastSystemMessage(joinMessage[0], false); // Paper - Adventure + } + // CraftBukkit end + + // CraftBukkit start - sendAll above replaced with this loop + ClientboundPlayerInfoUpdatePacket packet = ClientboundPlayerInfoUpdatePacket.createPlayerInitializing(List.of(bot)); // Paper - Add Listing API for Player + + final List onlinePlayers = Lists.newArrayListWithExpectedSize(this.server.getPlayerList().getPlayers().size() - 1); // Paper - Use single player info update packet on join + for (ServerPlayer entityplayer1 : this.server.getPlayerList().getPlayers()) { // Folia - region threading + + if (entityplayer1.getBukkitEntity().canSee(bukkitPlayer)) { + // Paper start - Add Listing API for Player + if (entityplayer1.getBukkitEntity().isListed(bukkitPlayer)) { + // Paper end - Add Listing API for Player + entityplayer1.connection.send(packet); + // Paper start - Add Listing API for Player + } else { + entityplayer1.connection.send(ClientboundPlayerInfoUpdatePacket.createSinglePlayerInitializing(bot, false)); + } + // Paper end - Add Listing API for Player + } + + if (entityplayer1 == bot || !bukkitPlayer.canSee(entityplayer1.getBukkitEntity())) { // Paper - Use single player info update packet on join; Don't include joining player + continue; + } + + onlinePlayers.add(entityplayer1); // Paper - Use single player info update packet on join + } + // Paper start - Use single player info update packet on join + if (!onlinePlayers.isEmpty()) { + bot.connection.send(ClientboundPlayerInfoUpdatePacket.createPlayerInitializing(onlinePlayers, bot)); // Paper - Add Listing API for Player + } + // Paper end - Use single player info update packet on join + bot.sentListPacket = true; + bot.suppressTrackerForLogin = false; // Paper - Fire PlayerJoinEvent when Player is actually ready + bot.level().getChunkSource().addEntity(bot); // Paper - Fire PlayerJoinEvent when Player is actually ready; track entity now + // CraftBukkit end + + //player.refreshEntityData(player); // CraftBukkit - BungeeCord#2321, send complete data to self on spawn // Paper - THIS IS NOT NEEDED ANYMORE + + this.server.getPlayerList().sendLevelInfo(bot, level[0]); + + // CraftBukkit start - Only add if the player wasn't moved in the event + if (bot.level() == level[0] && !level[0].players().contains(bot)) { + level[0].addNewPlayer(bot); + this.server.getCustomBossEvents().onPlayerConnect(bot); + } + + level[0] = bot.level(); // CraftBukkit - Update in case join event changed it + // CraftBukkit end + this.server.getPlayerList().sendActivePlayerEffects(bot); + // Paper - move loading pearls / parent vehicle up bot.initInventoryMenu(); - botsNameByWorldUuid - .computeIfAbsent(bot.level().uuid.toString(), (k) -> new HashSet<>()) - .add(bot.getBukkitEntity().getName()); - BotList.LOGGER.info("{}[{}] logged in with entity id {} at ([{}]{}, {}, {})", bot.getName().getString(), "Local", bot.getId(), bot.level().serverLevelData.getLevelName(), bot.getX(), bot.getY(), bot.getZ()); + this.server.notificationManager().playerJoined(bot); + playerConnection.resumeFlushing(); + // Paper start - Configurable player collision; Add to collideRule team if needed + final net.minecraft.world.scores.Scoreboard scoreboard = this.server.getPlayerList().getServer().getLevel(Level.OVERWORLD).getScoreboard(); + final PlayerTeam collideRuleTeam = scoreboard.getPlayerTeam(this.server.getPlayerList().collideRuleTeamName); + if (false && this.server.getPlayerList().collideRuleTeamName != null && collideRuleTeam != null && bot.getTeam() == null) { // Folia - region threading + scoreboard.addPlayerToTeam(bot.getScoreboardName(), collideRuleTeam); + } + // Paper end - Configurable player collision + // CraftBukkit start - moved down + LOGGER.info( + "{}[{}] logged in with entity id {} at ([{}]{}, {}, {})", // Paper - add world identifier + bot.getPlainTextName(), + address, + bot.getId(), + level[0].dimension().identifier(), // Paper - add world identifier + bot.getX(), + bot.getY(), + bot.getZ() + ); + // CraftBukkit end - moved down + // Paper start - Send empty chunk, so players aren't stuck in the world loading screen with our chunk system not sending chunks when dead + if (bot.isDeadOrDying()) { + net.minecraft.core.Holder plains = level[0].registryAccess().lookupOrThrow(net.minecraft.core.registries.Registries.BIOME) + .getOrThrow(net.minecraft.world.level.biome.Biomes.PLAINS); + bot.connection.send(new net.minecraft.network.protocol.game.ClientboundLevelChunkWithLightPacket( + new net.minecraft.world.level.chunk.EmptyLevelChunk(level[0], bot.chunkPosition(), plains), + level[0].getLightEngine(), (java.util.BitSet) null, (java.util.BitSet) null, true) // Paper - Anti-Xray + ); + } + // Paper end - Send empty chunk }; if (TickThread.isTickThreadFor(world, location.blockX() >> 4, location.blockZ() >> 4)) { task.run(); diff --git a/lophine-server/src/main/java/org/leavesmc/leaves/bot/ServerBot.java b/lophine-server/src/main/java/org/leavesmc/leaves/bot/ServerBot.java index 12aaa72..30e1da3 100644 --- a/lophine-server/src/main/java/org/leavesmc/leaves/bot/ServerBot.java +++ b/lophine-server/src/main/java/org/leavesmc/leaves/bot/ServerBot.java @@ -329,11 +329,11 @@ public class ServerBot extends ServerPlayer { } @Override - public void knockback(double strength, double x, double z, @Nullable Entity attacker, EntityKnockbackEvent.@NotNull Cause eventCause) { + public void knockback(double power, double xd, double zd, final DamageSource source, final float damage, final boolean comesFromEffect, @Nullable Entity attacker, EntityKnockbackEvent.Cause eventCause) { if (!this.hurtMarked) { return; } - super.knockback(strength, x, z, attacker, eventCause); + super.knockback(power, xd, zd, source, damage, comesFromEffect, attacker, eventCause); } @Override diff --git a/lophine-server/src/main/java/org/leavesmc/leaves/protocol/BBORProtocol.java b/lophine-server/src/main/java/org/leavesmc/leaves/protocol/BBORProtocol.java index d5bb51d..2f78542 100644 --- a/lophine-server/src/main/java/org/leavesmc/leaves/protocol/BBORProtocol.java +++ b/lophine-server/src/main/java/org/leavesmc/leaves/protocol/BBORProtocol.java @@ -86,8 +86,8 @@ public class BBORProtocol implements LeavesProtocol { ServerLevel overworld = MinecraftServer.getServer().overworld(); ProtocolUtils.sendBytebufPacket(player, INITIALIZE_CLIENT, buf -> { buf.writeLong(overworld.getSeed()); - buf.writeInt(overworld.levelData.getRespawnData().pos().getX()); - buf.writeInt(overworld.levelData.getRespawnData().pos().getZ()); + buf.writeInt(overworld.getLevelData().getRespawnData().pos().getX()); + buf.writeInt(overworld.getLevelData().getRespawnData().pos().getZ()); }); sendStructureList(player); } diff --git a/lophine-server/src/main/java/org/leavesmc/leaves/protocol/jade/util/LootTableMineableCollector.java b/lophine-server/src/main/java/org/leavesmc/leaves/protocol/jade/util/LootTableMineableCollector.java index cd11ac5..b917283 100644 --- a/lophine-server/src/main/java/org/leavesmc/leaves/protocol/jade/util/LootTableMineableCollector.java +++ b/lophine-server/src/main/java/org/leavesmc/leaves/protocol/jade/util/LootTableMineableCollector.java @@ -18,7 +18,7 @@ package org.leavesmc.leaves.protocol.jade.util; import com.google.common.collect.Lists; -import net.minecraft.advancements.criterion.ItemPredicate; +import net.minecraft.advancements.predicates.ItemPredicate; import net.minecraft.core.Holder; import net.minecraft.core.HolderGetter; import net.minecraft.core.registries.BuiltInRegistries; diff --git a/lophine-server/src/main/java/org/leavesmc/leaves/protocol/servux/ServuxHudDataProtocol.java b/lophine-server/src/main/java/org/leavesmc/leaves/protocol/servux/ServuxHudDataProtocol.java index 2b94900..aad6d42 100644 --- a/lophine-server/src/main/java/org/leavesmc/leaves/protocol/servux/ServuxHudDataProtocol.java +++ b/lophine-server/src/main/java/org/leavesmc/leaves/protocol/servux/ServuxHudDataProtocol.java @@ -184,7 +184,7 @@ public class ServuxHudDataProtocol implements LeavesProtocol { private static void putWorldData(@NotNull CompoundTag metadata) { ServerLevel level = MinecraftServer.getServer().overworld(); - BlockPos spawnPos = level.levelData.getRespawnData().pos(); + BlockPos spawnPos = level.getLevelData().getRespawnData().pos(); metadata.putInt("spawnPosX", spawnPos.getX()); metadata.putInt("spawnPosY", spawnPos.getY()); metadata.putInt("spawnPosZ", spawnPos.getZ()); diff --git a/lophine-server/src/main/java/org/leavesmc/leaves/protocol/servux/litematics/utils/EntityUtils.java b/lophine-server/src/main/java/org/leavesmc/leaves/protocol/servux/litematics/utils/EntityUtils.java index a95d5b2..9a0a955 100644 --- a/lophine-server/src/main/java/org/leavesmc/leaves/protocol/servux/litematics/utils/EntityUtils.java +++ b/lophine-server/src/main/java/org/leavesmc/leaves/protocol/servux/litematics/utils/EntityUtils.java @@ -20,10 +20,7 @@ package org.leavesmc.leaves.protocol.servux.litematics.utils; import com.google.common.collect.ImmutableList; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.EntitySpawnReason; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.*; import net.minecraft.world.level.Level; import org.leavesmc.leaves.util.TagFactory; @@ -36,7 +33,7 @@ public class EntityUtils { @Nullable private static Entity createEntityFromNBTSingle(CompoundTag nbt, Level world) { try { - Optional optional = EntityType.create(TagFactory.input(nbt), world, EntitySpawnReason.LOAD); + Optional optional = EntityType.create(TagFactory.input(nbt), world, new EntitySpawnRequest(EntitySpawnReason.LOAD, false)); if (optional.isPresent()) { Entity entity = optional.get(); diff --git a/lophine-server/src/main/java/org/leavesmc/leaves/protocol/servux/logger/DataLogger.java b/lophine-server/src/main/java/org/leavesmc/leaves/protocol/servux/logger/DataLogger.java index 369bce7..36ab341 100644 --- a/lophine-server/src/main/java/org/leavesmc/leaves/protocol/servux/logger/DataLogger.java +++ b/lophine-server/src/main/java/org/leavesmc/leaves/protocol/servux/logger/DataLogger.java @@ -119,7 +119,7 @@ public abstract class DataLogger { ServerTickRateManager tickManager = server.tickRateManager(); boolean frozen = tickManager.isFrozen(); boolean sprinting = tickManager.isSprinting(); - ca.spottedleaf.moonrise.common.time.TickData.TickReportData tickData = TickRegionScheduler.getCurrentRegion().getData().getRegionSchedulingHandle().getTickReport5s(System.nanoTime()); + ca.spottedleaf.common.time.TickData.TickReportData tickData = TickRegionScheduler.getCurrentRegion().getData().getRegionSchedulingHandle().getTickReport5s(System.nanoTime()); final double tps = tickData.tpsData().segmentAll().average(); final double mspt = tickData.timePerTickData().segmentAll().average() / 1.0E6; diff --git a/lophine-server/src/main/java/org/leavesmc/leaves/replay/Recorder.java b/lophine-server/src/main/java/org/leavesmc/leaves/replay/Recorder.java index 96e8cea..b125a51 100644 --- a/lophine-server/src/main/java/org/leavesmc/leaves/replay/Recorder.java +++ b/lophine-server/src/main/java/org/leavesmc/leaves/replay/Recorder.java @@ -43,7 +43,7 @@ import net.minecraft.server.MinecraftServer; import net.minecraft.server.RegistryLayer; import net.minecraft.server.packs.repository.KnownPack; import net.minecraft.tags.TagNetworkSerialization; -import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.EntityTypes; import net.minecraft.world.entity.PositionMoveRotation; import net.minecraft.world.flag.FeatureFlags; import org.jetbrains.annotations.NotNull; @@ -103,7 +103,7 @@ public class Recorder extends Connection { metaData.mcversion = SharedConstants.getCurrentVersion().name(); // TODO start event - this.savePacket(new ClientboundLoginFinishedPacket(photographer.getGameProfile()), ConnectionProtocol.LOGIN); + this.savePacket(new ClientboundLoginFinishedPacket(photographer.getGameProfile(), photographer.getUUID()), ConnectionProtocol.LOGIN); this.startConfiguration(); savePacket(ClientboundPlayerPositionPacket.of(photographer.getId(), PositionMoveRotation.of(photographer), Collections.emptySet())); @@ -194,7 +194,7 @@ public class Recorder extends Connection { return; } case ClientboundAddEntityPacket packet1 -> { - if (packet1.getType() == EntityType.PLAYER) { + if (packet1.getType() == EntityTypes.PLAYER) { synchronized (metaData) { metaData.players.add(packet1.getUUID()); } diff --git a/lophine-server/src/main/java/org/leavesmc/leaves/replay/ServerPhotographer.java b/lophine-server/src/main/java/org/leavesmc/leaves/replay/ServerPhotographer.java index 968ecae..abf2ea9 100644 --- a/lophine-server/src/main/java/org/leavesmc/leaves/replay/ServerPhotographer.java +++ b/lophine-server/src/main/java/org/leavesmc/leaves/replay/ServerPhotographer.java @@ -102,7 +102,7 @@ public class ServerPhotographer extends ServerPlayer { private static void placePhotographer(MinecraftServer server, ServerPhotographer photographer, ServerLevel world, @NotNull PhotographerCreateState state) { server.getPlayerList().placeNewPhotographer(photographer.recorder, photographer, world); - photographer.level().chunkSource.move(photographer); + photographer.level().getChunkSource().move(photographer); photographer.setInvisible(true); LOGGER.info("Photographer {} created", state.id); @@ -115,7 +115,7 @@ public class ServerPhotographer extends ServerPlayer { if (this.tickCount % 10 == 0) { connection.resetPosition(); - this.level().chunkSource.move(this); + this.level().getChunkSource().move(this); } if (this.followPlayer != null) { diff --git a/lophine-server/src/main/java/org/leavesmc/leaves/util/HopperCounter.java b/lophine-server/src/main/java/org/leavesmc/leaves/util/HopperCounter.java index bae9f15..b77b0b9 100644 --- a/lophine-server/src/main/java/org/leavesmc/leaves/util/HopperCounter.java +++ b/lophine-server/src/main/java/org/leavesmc/leaves/util/HopperCounter.java @@ -43,10 +43,7 @@ import net.minecraft.world.item.crafting.RecipeManager; import net.minecraft.world.item.crafting.display.RecipeDisplay; import net.minecraft.world.item.crafting.display.SlotDisplayContext; import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.AbstractBannerBlock; -import net.minecraft.world.level.block.BeaconBeamBlock; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.*; import net.minecraft.world.level.material.MapColor; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -157,19 +154,19 @@ public class HopperCounter { } private static final Map DEFAULTS = Map.ofEntries( - entry(Items.DANDELION, Blocks.YELLOW_WOOL), - entry(Items.POPPY, Blocks.RED_WOOL), - entry(Items.BLUE_ORCHID, Blocks.LIGHT_BLUE_WOOL), - entry(Items.ALLIUM, Blocks.MAGENTA_WOOL), + entry(Items.DANDELION, Blocks.WOOL.yellow()), + entry(Items.POPPY, Blocks.WOOL.red()), + entry(Items.BLUE_ORCHID, Blocks.WOOL.lightBlue()), + entry(Items.ALLIUM, Blocks.WOOL.magenta()), entry(Items.AZURE_BLUET, Blocks.SNOW_BLOCK), - entry(Items.RED_TULIP, Blocks.RED_WOOL), - entry(Items.ORANGE_TULIP, Blocks.ORANGE_WOOL), + entry(Items.RED_TULIP, Blocks.WOOL.red()), + entry(Items.ORANGE_TULIP, Blocks.WOOL.orange()), entry(Items.WHITE_TULIP, Blocks.SNOW_BLOCK), - entry(Items.PINK_TULIP, Blocks.PINK_WOOL), + entry(Items.PINK_TULIP, Blocks.WOOL.pink()), entry(Items.OXEYE_DAISY, Blocks.SNOW_BLOCK), - entry(Items.CORNFLOWER, Blocks.BLUE_WOOL), - entry(Items.WITHER_ROSE, Blocks.BLACK_WOOL), - entry(Items.LILY_OF_THE_VALLEY, Blocks.WHITE_WOOL), + entry(Items.CORNFLOWER, Blocks.WOOL.blue()), + entry(Items.WITHER_ROSE, Blocks.WOOL.black()), + entry(Items.LILY_OF_THE_VALLEY, Blocks.WOOL.white()), entry(Items.BROWN_MUSHROOM, Blocks.BROWN_MUSHROOM_BLOCK), entry(Items.RED_MUSHROOM, Blocks.RED_MUSHROOM_BLOCK), entry(Items.STICK, Blocks.OAK_PLANKS), @@ -177,51 +174,51 @@ public class HopperCounter { entry(Items.IRON_INGOT, Blocks.IRON_BLOCK), entry(Items.DIAMOND, Blocks.DIAMOND_BLOCK), entry(Items.NETHERITE_INGOT, Blocks.NETHERITE_BLOCK), - entry(Items.SUNFLOWER, Blocks.YELLOW_WOOL), - entry(Items.LILAC, Blocks.MAGENTA_WOOL), - entry(Items.ROSE_BUSH, Blocks.RED_WOOL), - entry(Items.PEONY, Blocks.PINK_WOOL), - entry(Items.CARROT, Blocks.ORANGE_WOOL), - entry(Items.APPLE, Blocks.RED_WOOL), + entry(Items.SUNFLOWER, Blocks.WOOL.yellow()), + entry(Items.LILAC, Blocks.WOOL.magenta()), + entry(Items.ROSE_BUSH, Blocks.WOOL.red()), + entry(Items.PEONY, Blocks.WOOL.pink()), + entry(Items.CARROT, Blocks.WOOL.orange()), + entry(Items.APPLE, Blocks.WOOL.red()), entry(Items.WHEAT, Blocks.HAY_BLOCK), - entry(Items.PORKCHOP, Blocks.PINK_WOOL), - entry(Items.RABBIT, Blocks.PINK_WOOL), - entry(Items.CHICKEN, Blocks.WHITE_TERRACOTTA), + entry(Items.PORKCHOP, Blocks.WOOL.pink()), + entry(Items.RABBIT, Blocks.WOOL.pink()), + entry(Items.CHICKEN, Blocks.GLAZED_TERRACOTTA.white()), entry(Items.BEEF, Blocks.NETHERRACK), entry(Items.ENCHANTED_GOLDEN_APPLE, Blocks.GOLD_BLOCK), - entry(Items.COD, Blocks.WHITE_TERRACOTTA), + entry(Items.COD, Blocks.GLAZED_TERRACOTTA.white()), entry(Items.SALMON, Blocks.ACACIA_PLANKS), - entry(Items.ROTTEN_FLESH, Blocks.BROWN_WOOL), - entry(Items.PUFFERFISH, Blocks.YELLOW_TERRACOTTA), - entry(Items.TROPICAL_FISH, Blocks.ORANGE_WOOL), - entry(Items.POTATO, Blocks.WHITE_TERRACOTTA), - entry(Items.MUTTON, Blocks.RED_WOOL), + entry(Items.ROTTEN_FLESH, Blocks.WOOL.brown()), + entry(Items.PUFFERFISH, Blocks.GLAZED_TERRACOTTA.yellow()), + entry(Items.TROPICAL_FISH, Blocks.WOOL.orange()), + entry(Items.POTATO, Blocks.GLAZED_TERRACOTTA.white()), + entry(Items.MUTTON, Blocks.WOOL.red()), entry(Items.BEETROOT, Blocks.NETHERRACK), entry(Items.MELON_SLICE, Blocks.MELON), entry(Items.POISONOUS_POTATO, Blocks.SLIME_BLOCK), entry(Items.SPIDER_EYE, Blocks.NETHERRACK), - entry(Items.GUNPOWDER, Blocks.GRAY_WOOL), - entry(Items.TURTLE_SCUTE, Blocks.LIME_WOOL), + entry(Items.GUNPOWDER, Blocks.WOOL.gray()), + entry(Items.TURTLE_SCUTE, Blocks.WOOL.lime()), entry(Items.ARMADILLO_SCUTE, Blocks.ANCIENT_DEBRIS), - entry(Items.FEATHER, Blocks.WHITE_WOOL), - entry(Items.FLINT, Blocks.BLACK_WOOL), + entry(Items.FEATHER, Blocks.WOOL.white()), + entry(Items.FLINT, Blocks.WOOL.black()), entry(Items.LEATHER, Blocks.SPRUCE_PLANKS), entry(Items.GLOWSTONE_DUST, Blocks.GLOWSTONE), - entry(Items.PAPER, Blocks.WHITE_WOOL), + entry(Items.PAPER, Blocks.WOOL.white()), entry(Items.BRICK, Blocks.BRICKS), - entry(Items.INK_SAC, Blocks.BLACK_WOOL), + entry(Items.INK_SAC, Blocks.WOOL.black()), entry(Items.SNOWBALL, Blocks.SNOW_BLOCK), entry(Items.WATER_BUCKET, Blocks.WATER), entry(Items.LAVA_BUCKET, Blocks.LAVA), - entry(Items.MILK_BUCKET, Blocks.WHITE_WOOL), + entry(Items.MILK_BUCKET, Blocks.WOOL.white()), entry(Items.CLAY_BALL, Blocks.CLAY), entry(Items.COCOA_BEANS, Blocks.COCOA), entry(Items.BONE, Blocks.BONE_BLOCK), - entry(Items.COD_BUCKET, Blocks.BROWN_TERRACOTTA), - entry(Items.PUFFERFISH_BUCKET, Blocks.YELLOW_TERRACOTTA), - entry(Items.SALMON_BUCKET, Blocks.PINK_TERRACOTTA), - entry(Items.TROPICAL_FISH_BUCKET, Blocks.ORANGE_TERRACOTTA), - entry(Items.SUGAR, Blocks.WHITE_WOOL), + entry(Items.COD_BUCKET, Blocks.GLAZED_TERRACOTTA.brown()), + entry(Items.PUFFERFISH_BUCKET, Blocks.GLAZED_TERRACOTTA.yellow()), + entry(Items.SALMON_BUCKET, Blocks.GLAZED_TERRACOTTA.pink()), + entry(Items.TROPICAL_FISH_BUCKET, Blocks.GLAZED_TERRACOTTA.orange()), + entry(Items.SUGAR, Blocks.WOOL.white()), entry(Items.BLAZE_POWDER, Blocks.GOLD_BLOCK), entry(Items.ENDER_PEARL, Blocks.WARPED_PLANKS), entry(Items.NETHER_STAR, Blocks.DIAMOND_BLOCK), @@ -234,12 +231,12 @@ public class HopperCounter { entry(Items.HEART_OF_THE_SEA, Blocks.CONDUIT), entry(Items.HONEYCOMB, Blocks.HONEYCOMB_BLOCK), entry(Items.NAME_TAG, Blocks.BONE_BLOCK), - entry(Items.TOTEM_OF_UNDYING, Blocks.YELLOW_TERRACOTTA), + entry(Items.TOTEM_OF_UNDYING, Blocks.GLAZED_TERRACOTTA.yellow()), entry(Items.TRIDENT, Blocks.PRISMARINE), - entry(Items.GHAST_TEAR, Blocks.WHITE_WOOL), + entry(Items.GHAST_TEAR, Blocks.WOOL.white()), entry(Items.PHANTOM_MEMBRANE, Blocks.BONE_BLOCK), entry(Items.EGG, Blocks.BONE_BLOCK), - entry(Items.COPPER_INGOT, Blocks.COPPER_BLOCK), + entry(Items.COPPER_INGOT, Blocks.COPPER_BLOCK.waxed().pick(WeatheringCopper.WeatherState.UNAFFECTED)), entry(Items.AMETHYST_SHARD, Blocks.AMETHYST_BLOCK) ); diff --git a/lophine-server/src/main/java/org/leavesmc/leaves/util/WoolUtils.java b/lophine-server/src/main/java/org/leavesmc/leaves/util/WoolUtils.java index 40676e8..ebe908d 100644 --- a/lophine-server/src/main/java/org/leavesmc/leaves/util/WoolUtils.java +++ b/lophine-server/src/main/java/org/leavesmc/leaves/util/WoolUtils.java @@ -30,22 +30,22 @@ import static java.util.Map.entry; public class WoolUtils { private static final Map WOOL_BLOCK_TO_DYE = Map.ofEntries( - entry(Blocks.WHITE_WOOL, DyeColor.WHITE), - entry(Blocks.ORANGE_WOOL, DyeColor.ORANGE), - entry(Blocks.MAGENTA_WOOL, DyeColor.MAGENTA), - entry(Blocks.LIGHT_BLUE_WOOL, DyeColor.LIGHT_BLUE), - entry(Blocks.YELLOW_WOOL, DyeColor.YELLOW), - entry(Blocks.LIME_WOOL, DyeColor.LIME), - entry(Blocks.PINK_WOOL, DyeColor.PINK), - entry(Blocks.GRAY_WOOL, DyeColor.GRAY), - entry(Blocks.LIGHT_GRAY_WOOL, DyeColor.LIGHT_GRAY), - entry(Blocks.CYAN_WOOL, DyeColor.CYAN), - entry(Blocks.PURPLE_WOOL, DyeColor.PURPLE), - entry(Blocks.BLUE_WOOL, DyeColor.BLUE), - entry(Blocks.BROWN_WOOL, DyeColor.BROWN), - entry(Blocks.GREEN_WOOL, DyeColor.GREEN), - entry(Blocks.RED_WOOL, DyeColor.RED), - entry(Blocks.BLACK_WOOL, DyeColor.BLACK) + entry(Blocks.WOOL.white(), DyeColor.WHITE), + entry(Blocks.WOOL.orange(), DyeColor.ORANGE), + entry(Blocks.WOOL.magenta(), DyeColor.MAGENTA), + entry(Blocks.WOOL.lightBlue(), DyeColor.LIGHT_BLUE), + entry(Blocks.WOOL.yellow(), DyeColor.YELLOW), + entry(Blocks.WOOL.lime(), DyeColor.LIME), + entry(Blocks.WOOL.pink(), DyeColor.PINK), + entry(Blocks.WOOL.gray(), DyeColor.GRAY), + entry(Blocks.WOOL.lightGray(), DyeColor.LIGHT_GRAY), + entry(Blocks.WOOL.cyan(), DyeColor.CYAN), + entry(Blocks.WOOL.purple(), DyeColor.PURPLE), + entry(Blocks.WOOL.blue(), DyeColor.BLUE), + entry(Blocks.WOOL.brown(), DyeColor.BROWN), + entry(Blocks.WOOL.green(), DyeColor.GREEN), + entry(Blocks.WOOL.red(), DyeColor.RED), + entry(Blocks.WOOL.black(), DyeColor.BLACK) ); public static DyeColor getWoolColorAtPosition(Level worldIn, BlockPos pos) {