diff --git a/build.gradle.kts b/build.gradle.kts index 3d3ef508..65198a69 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -298,4 +298,4 @@ tasks.register("showPatchTaskStatus") { } } } -} \ No newline at end of file +} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 1b33c55b..f8e1ee31 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 2e111328..23449a2b 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-9.1.0-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index 23d15a93..adff685a 100755 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright © 2015-2021 the original authors. +# Copyright © 2015 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -114,7 +114,6 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH="\\\"\\\"" # Determine the Java command to use to start the JVM. @@ -172,7 +171,6 @@ fi # For Cygwin or MSYS, switch paths to Windows format before running java if "$cygwin" || "$msys" ; then APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) JAVACMD=$( cygpath --unix "$JAVACMD" ) @@ -212,7 +210,6 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" diff --git a/gradlew.bat b/gradlew.bat index db3a6ac2..c4bdd3ab 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -70,11 +70,10 @@ goto fail :execute @rem Setup the command line -set CLASSPATH= @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell diff --git a/leaves-server/minecraft-patches/features/0004-Leaves-Protocol-Core.patch b/leaves-server/minecraft-patches/features/0004-Leaves-Protocol-Core.patch index 9cd8e843..a714dd74 100644 --- a/leaves-server/minecraft-patches/features/0004-Leaves-Protocol-Core.patch +++ b/leaves-server/minecraft-patches/features/0004-Leaves-Protocol-Core.patch @@ -126,14 +126,14 @@ index c6db2c96db96453daaf49779f588f75f7c3d3d60..adb26ae4dfd5dc111cc55000b71c15f9 this.connection.setReadOnly(); // CraftBukkit - Don't wait diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java -index cc5d1e8007e2ea32605bd68d0a73683e8fb6886e..d9fbc5dc6665fd13cc2aa9978ea6edef4c736548 100644 +index cc5d1e8007e2ea32605bd68d0a73683e8fb6886e..c495cf4ad53486c4bd965f34eeec107d6755e4d6 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java @@ -239,6 +239,8 @@ public abstract class PlayerList { return; } -+ org.leavesmc.leaves.protocol.core.LeavesProtocolManager.handlePlayerJoin(player); ++ org.leavesmc.leaves.protocol.core.LeavesProtocolManager.handlePlayerJoin(player); + final net.kyori.adventure.text.Component jm = playerJoinEvent.joinMessage(); diff --git a/leaves-server/minecraft-patches/features/0007-Leaves-Fakeplayer.patch b/leaves-server/minecraft-patches/features/0007-Leaves-Fakeplayer.patch index 13f92ccb..72ac5eef 100644 --- a/leaves-server/minecraft-patches/features/0007-Leaves-Fakeplayer.patch +++ b/leaves-server/minecraft-patches/features/0007-Leaves-Fakeplayer.patch @@ -30,7 +30,7 @@ index 14addbaf68b7ad80490187d12d9c9b00891e2ce1..b186b5e0d3b32d7b51b2f58f0ef4b2bf private DisconnectionDetails disconnectionDetails; private boolean encrypted; diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java -index 2493722c47b92cbcd13c08af0caf38a543ac7e37..309ff4c55b2a4ccf3d18951b51c2e10d0ff39bfc 100644 +index 2493722c47b92cbcd13c08af0caf38a543ac7e37..9ae09e08afbc99cd2f54d55f8822bc92d317f960 100644 --- a/net/minecraft/server/MinecraftServer.java +++ b/net/minecraft/server/MinecraftServer.java @@ -378,6 +378,8 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 0) { + this.playerList.saveAll(playerSaveInterval); ++ org.leavesmc.leaves.bot.BotList.INSTANCE.saveAllResumeBots(playerSaveInterval); // Leaves - resident fakeplayer + } + for (final ServerLevel level : this.getAllLevels()) { + if (level.paperConfig().chunks.autoSaveInterval.value() > 0) { +@@ -1857,6 +1861,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop dimension, Packet packet) { -@@ -960,6 +991,7 @@ public abstract class PlayerList { - } - // Paper end - Incremental chunk and player saving - } -+ org.leavesmc.leaves.bot.BotList.INSTANCE.saveAllResumeBots(); // Leaves - resident fakeplayer - return null; }); // Paper - ensure main - } - -@@ -1226,7 +1258,13 @@ public abstract class PlayerList { +@@ -1226,7 +1257,13 @@ public abstract class PlayerList { @Nullable public ServerPlayer getPlayer(UUID playerUUID) { @@ -683,7 +683,7 @@ index adab5dc640a7a0299c04020225a68317282aebe9..e127a670935186ba3d96a8d85640cf46 protected SoundEvent getPaddleSound() { return switch (this.getStatus()) { diff --git a/net/minecraft/world/inventory/AbstractContainerMenu.java b/net/minecraft/world/inventory/AbstractContainerMenu.java -index 670090c4466d6472a83263e1769f19e3e491c927..4e53e7c05af11cae2ce8cf313c69a83336e22ba6 100644 +index 670090c4466d6472a83263e1769f19e3e491c927..c097bfe559c648bc279a9dffe874f3180ff80e27 100644 --- a/net/minecraft/world/inventory/AbstractContainerMenu.java +++ b/net/minecraft/world/inventory/AbstractContainerMenu.java @@ -400,6 +400,7 @@ public abstract class AbstractContainerMenu { diff --git a/leaves-server/minecraft-patches/features/0015-No-chat-sign.patch b/leaves-server/minecraft-patches/features/0015-No-chat-sign.patch index 5702d95a..083a694e 100644 --- a/leaves-server/minecraft-patches/features/0015-No-chat-sign.patch +++ b/leaves-server/minecraft-patches/features/0015-No-chat-sign.patch @@ -148,10 +148,10 @@ index adb26ae4dfd5dc111cc55000b71c15f95239b090..20b9dfe68dfbcd5bb999ee4ec0500bdf if (packet == null || this.processedDisconnect) { // Spigot return; diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java -index 6dec8565e9d290302ce7766357a56b8c2295c163..bf5d8fe260aaca48a73d6ffe9d1312f5161f9365 100644 +index 5d1d71858c730c431120d4a66244969ebf2a5164..73f8562658d30ba17d5ecf2c778622e5e75ae135 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java -@@ -1186,7 +1186,7 @@ public abstract class PlayerList { +@@ -1185,7 +1185,7 @@ public abstract class PlayerList { } public boolean verifyChatTrusted(PlayerChatMessage message) { diff --git a/leaves-server/minecraft-patches/features/0035-Return-nether-portal-fix.patch b/leaves-server/minecraft-patches/features/0035-Return-nether-portal-fix.patch index 774819ad..abe1b24e 100644 --- a/leaves-server/minecraft-patches/features/0035-Return-nether-portal-fix.patch +++ b/leaves-server/minecraft-patches/features/0035-Return-nether-portal-fix.patch @@ -32,7 +32,7 @@ index d4df6ca7360d4bc605a51061444191d7929c7778..134f6eba6655b7294ebcdf5cf5d9e218 if (this.isBlocking()) { this.stopUsingItem(); diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java -index bf5d8fe260aaca48a73d6ffe9d1312f5161f9365..7977a0cfe18c99c4c6ba8c5b56387b690ede554d 100644 +index 73f8562658d30ba17d5ecf2c778622e5e75ae135..cf3c9f2a19377f2d446f6220180f63557ef8a901 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java @@ -700,6 +700,20 @@ public abstract class PlayerList { @@ -70,7 +70,7 @@ index ce4c8e14d3d7b5837dcce006fa67722f3f430fa4..759c320fc331704efe5df10d3f1f33aa @Nullable private DamageSource lastDamageSource; diff --git a/net/minecraft/world/level/block/NetherPortalBlock.java b/net/minecraft/world/level/block/NetherPortalBlock.java -index d3f0a61c0c91d3a6a1dc4e59d57743ba89a9c19a..1ad863dc255a7b91d0b163000b6bb5d43e2ad204 100644 +index d3f0a61c0c91d3a6a1dc4e59d57743ba89a9c19a..3d006562b2ba6f9a2059a8b534fbee3288067f78 100644 --- a/net/minecraft/world/level/block/NetherPortalBlock.java +++ b/net/minecraft/world/level/block/NetherPortalBlock.java @@ -179,7 +179,18 @@ public class NetherPortalBlock extends Block implements Portal { @@ -87,7 +87,7 @@ index d3f0a61c0c91d3a6a1dc4e59d57743ba89a9c19a..1ad863dc255a7b91d0b163000b6bb5d4 + } + } + if (optional.isEmpty()) { -+ level.getPortalForcer().findClosestPortalPosition(exitPos, worldBorder, result.searchRadius()); // CraftBukkit ++ optional = level.getPortalForcer().findClosestPortalPosition(exitPos, worldBorder, result.searchRadius()); // CraftBukkit + } + // Leaves end - fix return portal BlockUtil.FoundRectangle largestRectangleAround; diff --git a/leaves-server/minecraft-patches/features/0038-Catch-update-suppression-crash.patch b/leaves-server/minecraft-patches/features/0038-Catch-update-suppression-crash.patch index b6922099..22a2427c 100644 --- a/leaves-server/minecraft-patches/features/0038-Catch-update-suppression-crash.patch +++ b/leaves-server/minecraft-patches/features/0038-Catch-update-suppression-crash.patch @@ -30,10 +30,10 @@ index 3e4241976fdfe65bc0aae90a9097770745c0ddf1..8e3e9a8aaee8fd4fbe986f9f07994517 throw PacketUtils.makeReportedException(var3, this.packet, this.listener); } diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java -index c8135525666da2cedc134025327e240fbe6cd63c..bd9d83675d40b383678c6066b73b9e053b5ea6a6 100644 +index 2c9451bb024a6d185729e9b1fad508883401e468..cef816d3526cec1b7cb5b03e62454609eec876bb 100644 --- a/net/minecraft/server/MinecraftServer.java +++ b/net/minecraft/server/MinecraftServer.java -@@ -1808,7 +1808,16 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop= resultLimit) { diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java -index fa2ae16481541308d525d0ac70a8bbc2c66a8851..89067dceacb1f4fb6f7acacd4ec16874da049efe 100644 +index d9d661f72c90d04a3fca0d5698cc38a004717581..7daa09a9e088647c5147c7aa6376030834c46526 100644 --- a/net/minecraft/server/MinecraftServer.java +++ b/net/minecraft/server/MinecraftServer.java -@@ -1720,7 +1720,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop public - if (this.server.getForcedGameType() != null && this.server.getForcedGameType() != readPlayerMode(input, "playerGameType")) { - if (new org.bukkit.event.player.PlayerGameModeChangeEvent(this.getBukkitEntity(), org.bukkit.GameMode.getByValue(this.server.getDefaultGameType().getId()), org.bukkit.event.player.PlayerGameModeChangeEvent.Cause.DEFAULT_GAMEMODE, null).callEvent()) { - this.gameMode.setGameModeForPlayer(this.server.getForcedGameType(), GameType.DEFAULT_MODE); diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java -index 7977a0cfe18c99c4c6ba8c5b56387b690ede554d..c8628c6d505a7599b0765decfcd037c8b3212054 100644 +index cf3c9f2a19377f2d446f6220180f63557ef8a901..b6e4a227d49ca97e8482c56ea0819a030b52097c 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java @@ -126,6 +126,7 @@ public abstract class PlayerList { @@ -326,7 +313,7 @@ index 7977a0cfe18c99c4c6ba8c5b56387b690ede554d..c8628c6d505a7599b0765decfcd037c8 // CraftBukkit start private org.bukkit.craftbukkit.CraftServer cserver; -@@ -149,6 +150,125 @@ public abstract class PlayerList { +@@ -149,6 +150,124 @@ public abstract class PlayerList { abstract public void loadAndSaveFiles(); // Paper - fix converting txt to json file; moved from DedicatedPlayerList constructor @@ -339,11 +326,10 @@ index 7977a0cfe18c99c4c6ba8c5b56387b690ede554d..c8628c6d505a7599b0765decfcd037c8 + + player.setServerLevel(worldserver1); + player.spawnIn(worldserver1); -+ player.gameMode.setLevel((ServerLevel) player.level()); ++ player.gameMode.setLevel(player.level()); + + LevelData worlddata = worldserver1.getLevelData(); + -+ player.loadGameTypes(null); + ServerGamePacketListenerImpl playerconnection = new ServerGamePacketListenerImpl(this.server, connection, player, CommonListenerCookie.createInitial(player.gameProfile, false)); + GameRules gamerules = worldserver1.getGameRules(); + boolean flag = gamerules.getBoolean(GameRules.RULE_DO_IMMEDIATE_RESPAWN); @@ -452,7 +438,7 @@ index 7977a0cfe18c99c4c6ba8c5b56387b690ede554d..c8628c6d505a7599b0765decfcd037c8 public void placeNewPlayer(Connection connection, ServerPlayer player, CommonListenerCookie cookie) { player.isRealPlayer = true; // Paper player.loginTime = System.currentTimeMillis(); // Paper - Replace OfflinePlayer#getLastPlayed -@@ -216,6 +336,7 @@ public abstract class PlayerList { +@@ -216,6 +335,7 @@ public abstract class PlayerList { // player.connection.send(ClientboundPlayerInfoUpdatePacket.createPlayerInitializing(this.players)); // CraftBukkit - replaced with loop below this.players.add(player); @@ -460,7 +446,7 @@ index 7977a0cfe18c99c4c6ba8c5b56387b690ede554d..c8628c6d505a7599b0765decfcd037c8 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 -@@ -420,6 +541,7 @@ public abstract class PlayerList { +@@ -420,6 +540,7 @@ public abstract class PlayerList { } protected void save(ServerPlayer player) { @@ -468,7 +454,7 @@ index 7977a0cfe18c99c4c6ba8c5b56387b690ede554d..c8628c6d505a7599b0765decfcd037c8 if (!player.getBukkitEntity().isPersistent()) return; // CraftBukkit player.lastSave = MinecraftServer.currentTick; // Paper - Incremental chunk and player saving this.playerIo.save(player); -@@ -434,6 +556,43 @@ public abstract class PlayerList { +@@ -434,6 +555,43 @@ public abstract class PlayerList { } } @@ -512,7 +498,7 @@ index 7977a0cfe18c99c4c6ba8c5b56387b690ede554d..c8628c6d505a7599b0765decfcd037c8 public @Nullable net.kyori.adventure.text.Component remove(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()))); -@@ -507,6 +666,7 @@ public abstract class PlayerList { +@@ -507,6 +665,7 @@ public abstract class PlayerList { player.retireScheduler(); // Paper - Folia schedulers player.getAdvancements().stopListening(); this.players.remove(player); @@ -520,7 +506,7 @@ index 7977a0cfe18c99c4c6ba8c5b56387b690ede554d..c8628c6d505a7599b0765decfcd037c8 this.playersByName.remove(player.getScoreboardName().toLowerCase(java.util.Locale.ROOT)); // Spigot this.server.getCustomBossEvents().onPlayerDisconnect(player); UUID uuid = player.getUUID(); -@@ -835,14 +995,14 @@ public abstract class PlayerList { +@@ -835,14 +994,14 @@ public abstract class PlayerList { } public String[] getPlayerNamesArray() { @@ -540,7 +526,7 @@ index 7977a0cfe18c99c4c6ba8c5b56387b690ede554d..c8628c6d505a7599b0765decfcd037c8 } // Leaves end - fakeplayer support -@@ -911,7 +1071,7 @@ public abstract class PlayerList { +@@ -911,7 +1070,7 @@ public abstract class PlayerList { // Paper start - whitelist verify event / login event public LoginResult canBypassFullServerLogin(final NameAndId nameAndId, final LoginResult currentResult) { diff --git a/leaves-server/minecraft-patches/features/0095-Bytebuf-API.patch b/leaves-server/minecraft-patches/features/0095-Bytebuf-API.patch index 319dc2d0..be982d40 100644 --- a/leaves-server/minecraft-patches/features/0095-Bytebuf-API.patch +++ b/leaves-server/minecraft-patches/features/0095-Bytebuf-API.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Bytebuf API diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java -index c8628c6d505a7599b0765decfcd037c8b3212054..f376b03e267ae9c3acc9636b6ccee733497027d2 100644 +index b6e4a227d49ca97e8482c56ea0819a030b52097c..7f21903070ab733249441e796a1faa5adf873ffb 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java -@@ -290,6 +290,13 @@ public abstract class PlayerList { +@@ -289,6 +289,13 @@ public abstract class PlayerList { boolean _boolean = gameRules.getBoolean(GameRules.RULE_DO_IMMEDIATE_RESPAWN); boolean _boolean1 = gameRules.getBoolean(GameRules.RULE_REDUCEDDEBUGINFO); boolean _boolean2 = gameRules.getBoolean(GameRules.RULE_LIMITED_CRAFTING); diff --git a/leaves-server/minecraft-patches/features/0108-Xaero-Map-Protocol.patch b/leaves-server/minecraft-patches/features/0108-Xaero-Map-Protocol.patch index d9060e37..44a1e159 100644 --- a/leaves-server/minecraft-patches/features/0108-Xaero-Map-Protocol.patch +++ b/leaves-server/minecraft-patches/features/0108-Xaero-Map-Protocol.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Xaero Map Protocol diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java -index f376b03e267ae9c3acc9636b6ccee733497027d2..5661e05cc1ffbfc7015ca45cf0820e0ba616bcc6 100644 +index 7f21903070ab733249441e796a1faa5adf873ffb..e1ce47f1f507d7d1ec8606b02815b0d8fb970734 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java -@@ -1204,6 +1204,7 @@ public abstract class PlayerList { +@@ -1202,6 +1202,7 @@ public abstract class PlayerList { player.connection.send(new ClientboundSetChunkCacheRadiusPacket(level.spigotConfig.viewDistance)); player.connection.send(new ClientboundSetSimulationDistancePacket(level.spigotConfig.simulationDistance)); // Paper end diff --git a/leaves-server/minecraft-patches/features/0123-Fast-exp-orb-absorb.patch b/leaves-server/minecraft-patches/features/0123-Fast-exp-orb-absorb.patch index d3a0e78f..65a62661 100644 --- a/leaves-server/minecraft-patches/features/0123-Fast-exp-orb-absorb.patch +++ b/leaves-server/minecraft-patches/features/0123-Fast-exp-orb-absorb.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Fast exp orb absorb diff --git a/net/minecraft/world/entity/ExperienceOrb.java b/net/minecraft/world/entity/ExperienceOrb.java -index 8bd430c5c417c76db02cf1e2c0bc6f229ed150f1..80eab68a6b5a34c4dd37ff4d74b9b6133be090b9 100644 +index 47bdbf9c73f19ff85ae93f3e31e45d35fe8c0a92..e3d5140ed9e7e9435213954ab603a9eb15c43a8d 100644 --- a/net/minecraft/world/entity/ExperienceOrb.java +++ b/net/minecraft/world/entity/ExperienceOrb.java @@ -358,6 +358,20 @@ public class ExperienceOrb extends Entity { @@ -18,7 +18,7 @@ index 8bd430c5c417c76db02cf1e2c0bc6f229ed150f1..80eab68a6b5a34c4dd37ff4d74b9b613 + entity.take(this, 1); + int i = this.repairPlayerItems(serverPlayer, this.getValue()); + if (i > 0) { -+ entity.giveExperiencePoints(org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerExpChangeEvent(entity, this, 1).getAmount()); // CraftBukkit - this.value -> event.getAmount() // Paper - supply experience orb object ++ entity.giveExperiencePoints(org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerExpChangeEvent(entity, this, i).getAmount()); // CraftBukkit - this.value -> event.getAmount() // Paper - supply experience orb object + } + this.count--; + } diff --git a/leaves-server/minecraft-patches/features/0144-Fix-stacked-container-destroyed-drop.patch b/leaves-server/minecraft-patches/features/0144-Fix-stacked-container-destroyed-drop.patch new file mode 100644 index 00000000..afab8ae9 --- /dev/null +++ b/leaves-server/minecraft-patches/features/0144-Fix-stacked-container-destroyed-drop.patch @@ -0,0 +1,27 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Lumine1909 <133463833+Lumine1909@users.noreply.github.com> +Date: Sat, 29 Nov 2025 21:01:21 +0800 +Subject: [PATCH] Fix stacked container destroyed drop + + +diff --git a/net/minecraft/world/item/ItemUtils.java b/net/minecraft/world/item/ItemUtils.java +index 16fc5c89b652194afac64aaa29f72a25ba7ffcae..53ac755a10b2e915053feab358aa3b9fbc25547a 100644 +--- a/net/minecraft/world/item/ItemUtils.java ++++ b/net/minecraft/world/item/ItemUtils.java +@@ -39,6 +39,16 @@ public class ItemUtils { + } + + public static void onContainerDestroyed(ItemEntity container, Iterable contents) { ++ if (org.leavesmc.leaves.LeavesConfig.fix.stackedContainerDestroyedDrop) { ++ for (int i = 0; i < container.getItem().getCount(); i++) { ++ createDroppedItem(container, contents); ++ } ++ } else { ++ createDroppedItem(container, contents); ++ } ++ } ++ ++ private static void createDroppedItem(ItemEntity container, Iterable contents) { + Level level = container.level(); + if (!level.isClientSide()) { + // Paper start - call EntityDropItemEvent diff --git a/leaves-server/minecraft-patches/features/0145-Force-minecraft-command.patch b/leaves-server/minecraft-patches/features/0145-Force-minecraft-command.patch new file mode 100644 index 00000000..88e059ff --- /dev/null +++ b/leaves-server/minecraft-patches/features/0145-Force-minecraft-command.patch @@ -0,0 +1,33 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Lumine1909 <133463833+Lumine1909@users.noreply.github.com> +Date: Sat, 29 Nov 2025 23:32:57 +0800 +Subject: [PATCH] Force minecraft command + + +diff --git a/net/minecraft/commands/Commands.java b/net/minecraft/commands/Commands.java +index 83f05b042630891d43cfb567e98666831df80f6e..f7990278fe2e112025fffe9bfa3649db7aa4150a 100644 +--- a/net/minecraft/commands/Commands.java ++++ b/net/minecraft/commands/Commands.java +@@ -176,7 +176,21 @@ public class Commands { + return node.getRequirement() instanceof PermissionCheck permissionCheck && permissionCheck.requiredLevel() > 0; + } + }; +- private final CommandDispatcher dispatcher = new CommandDispatcher<>(); ++ // Leaves start - force minecraft command ++ private final CommandDispatcher dispatcher = new CommandDispatcher<>() { ++ ++ @Override ++ public com.mojang.brigadier.tree.LiteralCommandNode register(com.mojang.brigadier.builder.LiteralArgumentBuilder command) { ++ try { ++ if (org.leavesmc.leaves.LeavesConfig.mics.forceMinecraftCommand && getRoot().getChild("minecraft:" + command.getLiteral()) != null) { ++ return command.build(); ++ } ++ } catch (Exception ignored) { ++ } ++ return super.register(command); ++ } ++ }; ++ // Leaves end - force minecraft command + + public Commands(Commands.CommandSelection selection, CommandBuildContext context) { + // Paper start - Brigadier API - modern minecraft overloads that do not use redirects but are copies instead diff --git a/leaves-server/paper-patches/features/0011-Force-minecraft-command.patch b/leaves-server/paper-patches/features/0011-Force-minecraft-command.patch index 0d3852af..cfca5b50 100644 --- a/leaves-server/paper-patches/features/0011-Force-minecraft-command.patch +++ b/leaves-server/paper-patches/features/0011-Force-minecraft-command.patch @@ -4,6 +4,23 @@ Date: Fri, 2 Feb 2024 13:18:22 +0800 Subject: [PATCH] Force minecraft command +diff --git a/src/main/java/io/papermc/paper/command/brigadier/bukkit/BukkitBrigForwardingMap.java b/src/main/java/io/papermc/paper/command/brigadier/bukkit/BukkitBrigForwardingMap.java +index d08ca38b4f04f7834de4ab64e5f794e8e26ec746..744db73d6cb89ca0256835cb2e98d427fe0f629a 100644 +--- a/src/main/java/io/papermc/paper/command/brigadier/bukkit/BukkitBrigForwardingMap.java ++++ b/src/main/java/io/papermc/paper/command/brigadier/bukkit/BukkitBrigForwardingMap.java +@@ -96,6 +96,12 @@ public class BukkitBrigForwardingMap extends HashMap { + @Override + public Command put(String key, Command value) { + Command old = this.get(key); ++ if (org.leavesmc.leaves.LeavesConfig.mics.forceMinecraftCommand && ++ getDispatcher().getRoot().getChild(key) != null && ++ getDispatcher().getRoot().getChild("minecraft:" + key) != null ++ ) { ++ return old; ++ } + this.getDispatcher().getRoot().removeCommand(key); // Override previous command + if (value instanceof VanillaCommandWrapper wrapper && wrapper.getName().equals(key)) { + // Don't break when some plugin tries to remove and add back a plugin command registered with modern API... diff --git a/src/main/java/org/bukkit/craftbukkit/command/CraftCommandMap.java b/src/main/java/org/bukkit/craftbukkit/command/CraftCommandMap.java index 90ed57a7fbcd0625b64084347460e9864216f610..e3598f7a0d183255ba17bc0f08cee284a0898cef 100644 --- a/src/main/java/org/bukkit/craftbukkit/command/CraftCommandMap.java diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/LeavesConfig.java b/leaves-server/src/main/java/org/leavesmc/leaves/LeavesConfig.java index febef2d9..d4e1765c 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/LeavesConfig.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/LeavesConfig.java @@ -1198,7 +1198,7 @@ public final class LeavesConfig { @GlobalConfig("bstats-privacy-mode") public boolean bstatsPrivacyMode = false; - @GlobalConfig("force-minecraft-command") + @GlobalConfig(value = "force-minecraft-command", lock = true) public boolean forceMinecraftCommand = false; @GlobalConfig("leaves-packet-event") @@ -1299,5 +1299,8 @@ public final class LeavesConfig { @GlobalConfig("vanilla-end-void-rings") public boolean vanillaEndVoidRings = false; + + @GlobalConfig("stacked-container-destroyed-drop") + public boolean stackedContainerDestroyedDrop = true; } } diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/bot/BotCreateState.java b/leaves-server/src/main/java/org/leavesmc/leaves/bot/BotCreateState.java index 2fb51266..b1374a47 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/bot/BotCreateState.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/bot/BotCreateState.java @@ -6,7 +6,6 @@ import org.bukkit.Location; import org.bukkit.command.CommandSender; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.leavesmc.leaves.LeavesConfig; import org.leavesmc.leaves.entity.bot.Bot; import org.leavesmc.leaves.entity.bot.BotCreator; import org.leavesmc.leaves.entity.bot.CraftBot; diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/bot/BotList.java b/leaves-server/src/main/java/org/leavesmc/leaves/bot/BotList.java index a372a18c..7a1c604e 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/bot/BotList.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/bot/BotList.java @@ -6,6 +6,7 @@ import com.mojang.authlib.properties.Property; import com.mojang.logging.LogUtils; import io.papermc.paper.adventure.PaperAdventure; import io.papermc.paper.profile.MutablePropertyMap; +import io.papermc.paper.util.MCUtil; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.Style; import net.minecraft.nbt.CompoundTag; @@ -71,6 +72,19 @@ public class BotList { INSTANCE = this; } + public void saveAllResumeBots(final int interval) { + MCUtil.ensureMain("Save Bots", () -> { + final long now = MinecraftServer.currentTick; + for (ServerBot bot : bots) { + if (interval == -1 || now - bot.lastSave >= interval) { + this.resumeDataStorage.save(bot); + bot.lastSave = MinecraftServer.currentTick; + } + } + return null; + }); + } + public void saveAllResumeBots() { if (!LeavesConfig.modify.fakeplayer.enable || !LeavesConfig.modify.fakeplayer.canResident) { return; @@ -111,6 +125,9 @@ public class BotList { } public ServerBot loadNewBot(String fullName, BotDataStorage storage) { + if (botsByName.containsKey(fullName)) { + return null; + } try { UUID uuid = BotUtil.getBotUUID(fullName); diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/LoadCommand.java b/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/LoadCommand.java index 0dece054..e1804ebf 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/LoadCommand.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/command/bot/subcommands/LoadCommand.java @@ -49,6 +49,10 @@ public class LoadCommand extends BotSubcommand { if (!botList.getManualSavedBotList().contains(botName)) { throw CommandSyntaxException.BUILT_IN_EXCEPTIONS.dispatcherUnknownArgument().create(); } + if (botList.getBotByName(botName) != null) { + sender.sendMessage(text("Bot with name " + botName + " already exists!", NamedTextColor.RED)); + return false; + } ServerBot bot = botList.loadNewManualSavedBot(botName); if (bot == null) { diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/protocol/jade/JadeProtocol.java b/leaves-server/src/main/java/org/leavesmc/leaves/protocol/jade/JadeProtocol.java index 3d833302..58f1af9b 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/protocol/jade/JadeProtocol.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/protocol/jade/JadeProtocol.java @@ -41,11 +41,11 @@ import org.leavesmc.leaves.protocol.jade.payload.ReceiveDataPayload; import org.leavesmc.leaves.protocol.jade.payload.RequestBlockPayload; import org.leavesmc.leaves.protocol.jade.payload.RequestEntityPayload; import org.leavesmc.leaves.protocol.jade.payload.ServerHandshakePayload; +import org.leavesmc.leaves.protocol.jade.provider.ItemStorageExtensionProvider; +import org.leavesmc.leaves.protocol.jade.provider.ItemStorageProvider; import org.leavesmc.leaves.protocol.jade.provider.JadeProvider; import org.leavesmc.leaves.protocol.jade.provider.ServerDataProvider; import org.leavesmc.leaves.protocol.jade.provider.ServerExtensionProvider; -import org.leavesmc.leaves.protocol.jade.provider.ItemStorageExtensionProvider; -import org.leavesmc.leaves.protocol.jade.provider.ItemStorageProvider; import org.leavesmc.leaves.protocol.jade.provider.block.*; import org.leavesmc.leaves.protocol.jade.provider.entity.AnimalOwnerProvider; import org.leavesmc.leaves.protocol.jade.provider.entity.MobBreedingProvider; diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/protocol/servux/ServuxHudDataProtocol.java b/leaves-server/src/main/java/org/leavesmc/leaves/protocol/servux/ServuxHudDataProtocol.java index e5b11ade..ea1ecaa9 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/protocol/servux/ServuxHudDataProtocol.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/protocol/servux/ServuxHudDataProtocol.java @@ -2,6 +2,7 @@ package org.leavesmc.leaves.protocol.servux; import com.mojang.serialization.DataResult; import io.netty.buffer.Unpooled; +import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; @@ -177,7 +178,7 @@ public class ServuxHudDataProtocol implements LeavesProtocol { public static void refreshLoggers(ServerPlayer player, @Nonnull CompoundTag nbt) { if (!player.getBukkitEntity().hasPermission("servux.provider.hud_data.logger")) { - player.sendSystemMessage(Component.translatable("servux.hud_data.error.insufficient_for_loggers", "any")); + player.sendSystemMessage(Component.literal("Insufficient Permissions for Data Logger: 'any'.").withStyle(ChatFormatting.RED)); return; }