From 46e7abe59cfefa010549ce1742d179138ee894e6 Mon Sep 17 00:00:00 2001 From: Helvetica Volubi Date: Wed, 18 Feb 2026 00:25:23 +0800 Subject: [PATCH] Update Luminol --- gradle.properties | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- lophine-server/build.gradle.kts.patch | 6 +- .../features/0001-Rebrand-to-Lophine.patch | 6 +- .../features/0002-Transformed-Configs.patch | 24 ++- .../features/0004-Leaves-Fakeplayer.patch | 39 ++++ ...to-disable-some-check-for-operators.patch} | 2 +- ...-config-to-enable-raytracing-tracker.patch | 4 +- ...dd-config-to-enable-save-all-command.patch | 6 +- ...onfig-to-enable-waypoint-command-bar.patch | 177 ---------------- ...-Fix-datapack-command-save-function.patch} | 4 +- ...h => 0009-Leaves-Base-Protocol-Core.patch} | 0 ...-Configurable-trading-with-the-void.patch} | 2 +- ... => 0011-Leaves-Item-overstack-util.patch} | 0 ...ves-Old-Explosion-Damage-Calculator.patch} | 0 ...ch => 0013-Leaves-Old-raid-behavior.patch} | 0 ... 0014-Leaves-Redstone-Shears-Wrench.patch} | 0 ...atch => 0015-Leaves-Servux-Protocol.patch} | 2 +- ...avesHooks.patch => 0016-LeavesHooks.patch} | 2 +- ...-for-Raid-Revert-and-Cross-Region-D.patch} | 2 +- ...rpur-Barrels-and-enderchests-6-rows.patch} | 0 ...-support.patch => 0019-I18n-support.patch} | 2 +- ...ch => 0020-Old-zombie-reinforcement.patch} | 2 +- ...tch => 0021-Spawn-invulnerable-time.patch} | 2 +- ...yer.patch => 0022-Leaves-Fakeplayer.patch} | 50 +---- ... 0023-Modify-merge-ItemEntity-logic.patch} | 0 ... => 0024-Leaves-Syncmatica-Protocol.patch} | 0 ....patch => 0025-Leaves-BBOR-Protocol.patch} | 0 ....patch => 0026-Leaves-Jade-Protocol.patch} | 2 +- ...h => 0027-Leaves-Xaero-Map-Protocol.patch} | 0 ...=> 0028-Leaves-Support-REI-protocol.patch} | 0 ... => 0029-Leaves-Wool-Hopper-Counter.patch} | 0 ...lternative-block-placement-Protocol.patch} | 0 ...patch => 0031-Leaves-Replay-Mod-API.patch} | 18 +- ...aves-Catch-update-suppression-crash.patch} | 14 +- ... 0033-Leaves-CCE-update-suppression.patch} | 0 ...aves-Redstone-ignore-upwards-update.patch} | 0 ...patch => 0035-Instant-Block-Updater.patch} | 2 +- ...rt-TrapDoorBlock-changes-form-Paper.patch} | 0 ...ss-of-item-drops-due-to-update-supp.patch} | 0 ...8-Leaves-Old-Block-remove-behaviour.patch} | 0 ...et-placed-block-on-exception-Do-not.patch} | 0 ...tch => 0040-Global-Entities-Counter.patch} | 2 +- ...k-in-RegionizedWorldData-conections.patch} | 0 ...-before-all-checks-start-in-addEffe.patch} | 2 +- .../WayPointOptimizedTableConfig.java | 17 -- .../config/modules/removed/RemovedConfig.java | 1 + .../concurrent/AbstractConcurrentTable.java | 38 ---- .../utils/concurrent/ConcurrentTable.java | 150 ------------- .../concurrent/OptimizedConcurrentTable.java | 197 ------------------ .../lophine/utils/concurrent/TableEntry.java | 29 --- .../bot/agent/configs/LocatorBarConfig.java | 3 +- 52 files changed, 113 insertions(+), 698 deletions(-) create mode 100644 lophine-server/luminol-patches/features/0004-Leaves-Fakeplayer.patch rename lophine-server/minecraft-patches/features/{0001-Add-configs-to-disable-some-check-for-operators.patch => 0001-Add-config-to-disable-some-check-for-operators.patch} (98%) delete mode 100644 lophine-server/minecraft-patches/features/0008-Add-config-to-enable-waypoint-command-bar.patch rename lophine-server/minecraft-patches/features/{0009-Fix-datapack-command-save-function.patch => 0008-Fix-datapack-command-save-function.patch} (97%) rename lophine-server/minecraft-patches/features/{0010-Leaves-Base-Protocol-Core.patch => 0009-Leaves-Base-Protocol-Core.patch} (100%) rename lophine-server/minecraft-patches/features/{0011-Leaves-Configurable-trading-with-the-void.patch => 0010-Leaves-Configurable-trading-with-the-void.patch} (97%) rename lophine-server/minecraft-patches/features/{0012-Leaves-Item-overstack-util.patch => 0011-Leaves-Item-overstack-util.patch} (100%) rename lophine-server/minecraft-patches/features/{0013-Leaves-Old-Explosion-Damage-Calculator.patch => 0012-Leaves-Old-Explosion-Damage-Calculator.patch} (100%) rename lophine-server/minecraft-patches/features/{0014-Leaves-Old-raid-behavior.patch => 0013-Leaves-Old-raid-behavior.patch} (100%) rename lophine-server/minecraft-patches/features/{0015-Leaves-Redstone-Shears-Wrench.patch => 0014-Leaves-Redstone-Shears-Wrench.patch} (100%) rename lophine-server/minecraft-patches/features/{0016-Leaves-Servux-Protocol.patch => 0015-Leaves-Servux-Protocol.patch} (94%) rename lophine-server/minecraft-patches/features/{0017-LeavesHooks.patch => 0016-LeavesHooks.patch} (89%) rename lophine-server/minecraft-patches/features/{0018-Compatibility-fix-for-Raid-Revert-and-Cross-Region-D.patch => 0017-Compatibility-fix-for-Raid-Revert-and-Cross-Region-D.patch} (97%) rename lophine-server/minecraft-patches/features/{0019-Purpur-Barrels-and-enderchests-6-rows.patch => 0018-Purpur-Barrels-and-enderchests-6-rows.patch} (100%) rename lophine-server/minecraft-patches/features/{0020-I18n-support.patch => 0019-I18n-support.patch} (96%) rename lophine-server/minecraft-patches/features/{0021-Old-zombie-reinforcement.patch => 0020-Old-zombie-reinforcement.patch} (92%) rename lophine-server/minecraft-patches/features/{0022-Spawn-invulnerable-time.patch => 0021-Spawn-invulnerable-time.patch} (95%) rename lophine-server/minecraft-patches/features/{0023-Leaves-Fakeplayer.patch => 0022-Leaves-Fakeplayer.patch} (94%) rename lophine-server/minecraft-patches/features/{0024-Modify-merge-ItemEntity-logic.patch => 0023-Modify-merge-ItemEntity-logic.patch} (100%) rename lophine-server/minecraft-patches/features/{0025-Leaves-Syncmatica-Protocol.patch => 0024-Leaves-Syncmatica-Protocol.patch} (100%) rename lophine-server/minecraft-patches/features/{0026-Leaves-BBOR-Protocol.patch => 0025-Leaves-BBOR-Protocol.patch} (100%) rename lophine-server/minecraft-patches/features/{0027-Leaves-Jade-Protocol.patch => 0026-Leaves-Jade-Protocol.patch} (98%) rename lophine-server/minecraft-patches/features/{0028-Leaves-Xaero-Map-Protocol.patch => 0027-Leaves-Xaero-Map-Protocol.patch} (100%) rename lophine-server/minecraft-patches/features/{0029-Leaves-Support-REI-protocol.patch => 0028-Leaves-Support-REI-protocol.patch} (100%) rename lophine-server/minecraft-patches/features/{0030-Leaves-Wool-Hopper-Counter.patch => 0029-Leaves-Wool-Hopper-Counter.patch} (100%) rename lophine-server/minecraft-patches/features/{0031-Leaves-Alternative-block-placement-Protocol.patch => 0030-Leaves-Alternative-block-placement-Protocol.patch} (100%) rename lophine-server/minecraft-patches/features/{0032-Leaves-Replay-Mod-API.patch => 0031-Leaves-Replay-Mod-API.patch} (98%) rename lophine-server/minecraft-patches/features/{0033-Leaves-Catch-update-suppression-crash.patch => 0032-Leaves-Catch-update-suppression-crash.patch} (96%) rename lophine-server/minecraft-patches/features/{0034-Leaves-CCE-update-suppression.patch => 0033-Leaves-CCE-update-suppression.patch} (100%) rename lophine-server/minecraft-patches/features/{0035-Leaves-Redstone-ignore-upwards-update.patch => 0034-Leaves-Redstone-ignore-upwards-update.patch} (100%) rename lophine-server/minecraft-patches/features/{0036-Instant-Block-Updater.patch => 0035-Instant-Block-Updater.patch} (97%) rename lophine-server/minecraft-patches/features/{0037-Revert-TrapDoorBlock-changes-form-Paper.patch => 0036-Revert-TrapDoorBlock-changes-form-Paper.patch} (100%) rename lophine-server/minecraft-patches/features/{0038-Leaves-Prevent-loss-of-item-drops-due-to-update-supp.patch => 0037-Leaves-Prevent-loss-of-item-drops-due-to-update-supp.patch} (100%) rename lophine-server/minecraft-patches/features/{0039-Leaves-Old-Block-remove-behaviour.patch => 0038-Leaves-Old-Block-remove-behaviour.patch} (100%) rename lophine-server/minecraft-patches/features/{0040-Leaves-Do-not-reset-placed-block-on-exception-Do-not.patch => 0039-Leaves-Do-not-reset-placed-block-on-exception-Do-not.patch} (100%) rename lophine-server/minecraft-patches/features/{0041-Global-Entities-Counter.patch => 0040-Global-Entities-Counter.patch} (98%) rename lophine-server/minecraft-patches/features/{0042-Add-null-check-in-RegionizedWorldData-conections.patch => 0041-Add-null-check-in-RegionizedWorldData-conections.patch} (100%) rename lophine-server/minecraft-patches/features/{0043-Add-removed-check-before-all-checks-start-in-addEffe.patch => 0042-Add-removed-check-before-all-checks-start-in-addEffe.patch} (93%) delete mode 100644 lophine-server/src/main/java/fun/bm/lophine/config/modules/optimizations/WayPointOptimizedTableConfig.java delete mode 100644 lophine-server/src/main/java/fun/bm/lophine/utils/concurrent/AbstractConcurrentTable.java delete mode 100644 lophine-server/src/main/java/fun/bm/lophine/utils/concurrent/ConcurrentTable.java delete mode 100644 lophine-server/src/main/java/fun/bm/lophine/utils/concurrent/OptimizedConcurrentTable.java delete mode 100644 lophine-server/src/main/java/fun/bm/lophine/utils/concurrent/TableEntry.java diff --git a/gradle.properties b/gradle.properties index 46e8505..611c307 100644 --- a/gradle.properties +++ b/gradle.properties @@ -7,7 +7,7 @@ apiVersion=1.21.11 release=2 # 0 for skip release, 1 for pre-release, 2 for release -luminolRef=1d7b3b1fa16a2561227863de57529a0a4c9efcbc +luminolRef=ecb27d3cc237e3dd827b80c3158c0d20c2fadfd4 org.gradle.configuration-cache=true org.gradle.caching=true diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index bad7c24..37f78a6 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.2.0-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/lophine-server/build.gradle.kts.patch b/lophine-server/build.gradle.kts.patch index bc13049..0bc624f 100644 --- a/lophine-server/build.gradle.kts.patch +++ b/lophine-server/build.gradle.kts.patch @@ -49,9 +49,9 @@ - implementation(project(":luminol-api")) // Luminol + implementation(project(":lophine-api")) // Lophine // Luminol start - Dependenices insert + implementation("io.netty:netty-all:4.2.9.Final") // used for io_uring implementation("com.electronwill.night-config:toml:3.8.3") // Night config - implementation("com.github.luben:zstd-jni:1.5.4-1") -@@ -272,14 +_,14 @@ +@@ -273,14 +_,14 @@ val gitBranch = git.exec(providers, "rev-parse", "--abbrev-ref", "HEAD").get().trim() attributes( "Main-Class" to "org.bukkit.craftbukkit.Main", @@ -70,7 +70,7 @@ "Build-Number" to (build ?: ""), "Build-Time" to buildTime.toString(), "Git-Branch" to gitBranch, -@@ -431,7 +_,7 @@ +@@ -432,7 +_,7 @@ } fill { diff --git a/lophine-server/luminol-patches/features/0001-Rebrand-to-Lophine.patch b/lophine-server/luminol-patches/features/0001-Rebrand-to-Lophine.patch index ba0bd66..7fb7790 100644 --- a/lophine-server/luminol-patches/features/0001-Rebrand-to-Lophine.patch +++ b/lophine-server/luminol-patches/features/0001-Rebrand-to-Lophine.patch @@ -17,15 +17,15 @@ index 0bebc2cc87fb9c1c526e4de4f3bc157552307a72..cb1657939b86c039fcfe6403d3f202c2 } diff --git a/src/main/java/me/earthme/luminol/config/modules/misc/ServerModNameConfig.java b/src/main/java/me/earthme/luminol/config/modules/misc/ServerModNameConfig.java -index df5d926fb4401dd93d658fe14ae4d9d58cff68f9..b6d84fea596cfa78032151ab2f206b6b3d5dd197 100644 +index e4022494b050b68d54bac3cde87bdfc9e908859c..a4188ef831825764c0756b826651e2e7a9f99c5b 100644 --- a/src/main/java/me/earthme/luminol/config/modules/misc/ServerModNameConfig.java +++ b/src/main/java/me/earthme/luminol/config/modules/misc/ServerModNameConfig.java @@ -8,7 +8,7 @@ import me.earthme.luminol.enums.EnumConfigCategory; @ConfigClassInfo(category = EnumConfigCategory.MISC, name = "server_mod_name") public class ServerModNameConfig implements IConfigModule { - @ConfigInfo(name = "name") + @ConfigInfo(name = "name", comments = "Decides the server mod name shown in your F3 debug screen.") - public static String serverModName = "Luminol"; + public static String serverModName = "Lophine"; - @ConfigInfo(name = "vanilla_spoof") + @ConfigInfo(name = "vanilla_spoof", comments = "Ignore any plugin's modification and server mod name set in this config block, only force sending brand name of vanilla") public static boolean fakeVanilla = false; diff --git a/lophine-server/luminol-patches/features/0002-Transformed-Configs.patch b/lophine-server/luminol-patches/features/0002-Transformed-Configs.patch index 5216c53..3cca050 100644 --- a/lophine-server/luminol-patches/features/0002-Transformed-Configs.patch +++ b/lophine-server/luminol-patches/features/0002-Transformed-Configs.patch @@ -5,24 +5,34 @@ Subject: [PATCH] Transformed Configs diff --git a/src/main/java/me/earthme/luminol/config/modules/experiment/CommandConfig.java b/src/main/java/me/earthme/luminol/config/modules/experiment/CommandConfig.java -index 4051384e82dba0416838c3c9889a6e368367b601..a5535b479cdcca870d0c8be6ed6fbcb32f266ac2 100644 +index ad2ba680bedb2336de24146676e70a1f64fd9c5a..f81581782bf684bbcf4719e9b268efa3c6385325 100644 --- a/src/main/java/me/earthme/luminol/config/modules/experiment/CommandConfig.java +++ b/src/main/java/me/earthme/luminol/config/modules/experiment/CommandConfig.java -@@ -11,6 +11,7 @@ public class CommandConfig implements IConfigModule { - @TransformedConfig(name = "enable", directory = {"experiment", "force_the_data_command_to_be_enabled"}) +@@ -13,6 +13,7 @@ public class CommandConfig implements IConfigModule { @ConfigInfo(name = "enable_data_command") + @HotReloadUnsupported public static boolean data = false; + @TransformedConfig(name = "command_block_enabled", directory = {"experiment", "command"}, originInstance = "lophine") @TransformedConfig(name = "enabled", directory = {"experiment", "force_enable_command_block_command_execution"}) @ConfigInfo(name = "enable_command_block", comments = """ Force to enable command blocks. +@@ -20,6 +21,9 @@ public class CommandConfig implements IConfigModule { + DO NOT ENABLE UNLESS YOU KNOW WHAT YOU ARE DOING!!! + """) + public static boolean commandBlock = false; ++ @TransformedConfig(name = "enable-waypoint", directory = {"experiment", "waypoint bar"}) ++ @TransformedConfig(name = "enable-waypoint", directory = {"experiment", "waypoint_bar"}) ++ @TransformedConfig(name = "waypoint_command_enabled", directory = {"experiment", "command"}) + @ConfigInfo(name = "enable_waypoints_and_waypoint_command", comments = """ + Enable waypoint and waypoint command. + WARN: Still under testing diff --git a/src/main/java/me/earthme/luminol/config/modules/misc/PaperPacketLimiterConfig.java b/src/main/java/me/earthme/luminol/config/modules/misc/PaperPacketLimiterConfig.java -index 5c09f6e9265c51b52a1352bf65cdf24ffb7eb4f0..ac399e529ea1fed96cd6407142609aec50051786 100644 +index ce190737de22438d5de86b0ee0e8158954fdca18..0a175e87f3cb5b23480abefd70ee2e84e876b0d4 100644 --- a/src/main/java/me/earthme/luminol/config/modules/misc/PaperPacketLimiterConfig.java +++ b/src/main/java/me/earthme/luminol/config/modules/misc/PaperPacketLimiterConfig.java -@@ -8,6 +8,7 @@ import me.earthme.luminol.enums.EnumConfigCategory; - - @ConfigClassInfo(category = EnumConfigCategory.MISC, name = "force_disable_packet_limiter_of_paper") +@@ -11,6 +11,7 @@ import me.earthme.luminol.enums.EnumConfigCategory; + "has negative impacts on security" + ) public class PaperPacketLimiterConfig implements IConfigModule { + @TransformedConfig(name = "unlimit-packet", directory = {"misc", "network"}, originInstance = "lophine") @TransformedConfig(name = "force_disable", directory = {"optimizations", "force_disable_packet_limiter_of_paper"}) diff --git a/lophine-server/luminol-patches/features/0004-Leaves-Fakeplayer.patch b/lophine-server/luminol-patches/features/0004-Leaves-Fakeplayer.patch new file mode 100644 index 0000000..45a2788 --- /dev/null +++ b/lophine-server/luminol-patches/features/0004-Leaves-Fakeplayer.patch @@ -0,0 +1,39 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Helvetica Volubi +Date: Wed, 18 Feb 2026 00:15:08 +0800 +Subject: [PATCH] Leaves: Fakeplayer + +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/src/main/java/me/earthme/luminol/utils/FoliaServerWaypointManager.java b/src/main/java/me/earthme/luminol/utils/FoliaServerWaypointManager.java +index 14cf379decfd46c4719bc192a1467bbbd6835417..20970844de2e64ca213384e53003e80020165770 100644 +--- a/src/main/java/me/earthme/luminol/utils/FoliaServerWaypointManager.java ++++ b/src/main/java/me/earthme/luminol/utils/FoliaServerWaypointManager.java +@@ -38,6 +38,12 @@ public class FoliaServerWaypointManager implements WaypointManager<@NotNull Wayp + return; + } + ++ // Leaves start - fakeplayer ++ if (waypoint instanceof org.leavesmc.leaves.bot.ServerBot bot && !bot.getConfigValue(org.leavesmc.leaves.bot.agent.Configs.ENABLE_LOCATOR_BAR)) { ++ return; ++ } ++ // Leaves end - fakeplayer ++ + this.waypoints.add(waypoint); + + for (ServerPlayer toCreateFor : this.trackingPlayers) { +@@ -91,6 +97,12 @@ public class FoliaServerWaypointManager implements WaypointManager<@NotNull Wayp + public void addPlayer(ServerPlayer player) { + this.trackingPlayers.add(player); + ++ // Leaves start - fakeplayer ++ if (player instanceof org.leavesmc.leaves.bot.ServerBot) { ++ return; ++ } ++ // Leaves end - fakeplayer ++ + for (WaypointTransmitter waypointTransmitter : this.waypoints) { + this.createConnection(player, waypointTransmitter); + } diff --git a/lophine-server/minecraft-patches/features/0001-Add-configs-to-disable-some-check-for-operators.patch b/lophine-server/minecraft-patches/features/0001-Add-config-to-disable-some-check-for-operators.patch similarity index 98% rename from lophine-server/minecraft-patches/features/0001-Add-configs-to-disable-some-check-for-operators.patch rename to lophine-server/minecraft-patches/features/0001-Add-config-to-disable-some-check-for-operators.patch index ceb4e29..5986172 100644 --- a/lophine-server/minecraft-patches/features/0001-Add-configs-to-disable-some-check-for-operators.patch +++ b/lophine-server/minecraft-patches/features/0001-Add-config-to-disable-some-check-for-operators.patch @@ -1,7 +1,7 @@ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Helvetica Volubi Date: Sun, 3 Aug 2025 14:26:37 +0800 -Subject: [PATCH] Add configs to disable some check for operators +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 diff --git a/lophine-server/minecraft-patches/features/0003-Add-config-to-enable-raytracing-tracker.patch b/lophine-server/minecraft-patches/features/0003-Add-config-to-enable-raytracing-tracker.patch index 816a47e..716f4fb 100644 --- a/lophine-server/minecraft-patches/features/0003-Add-config-to-enable-raytracing-tracker.patch +++ b/lophine-server/minecraft-patches/features/0003-Add-config-to-enable-raytracing-tracker.patch @@ -18,7 +18,7 @@ index bca2c5410aa543d2bb421e53893e9163508b3568..fdccb06c918d387e46c29ede7337159d 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 e62a8d23736de03f18c615c7622414aac3dc8aef..8043b5f24e09e2c96afe14b5ab6978c0b85d744c 100644 +index b27e00437e5779c051e8ea2f350e4a264f2c5e7c..32299faedd89a848ca00288672ce85cad707dca0 100644 --- a/net/minecraft/world/entity/Entity.java +++ b/net/minecraft/world/entity/Entity.java @@ -152,7 +152,7 @@ import org.jetbrains.annotations.Contract; @@ -30,7 +30,7 @@ index e62a8d23736de03f18c615c7622414aac3dc8aef..8043b5f24e09e2c96afe14b5ab6978c0 // CraftBukkit start private static final int CURRENT_LEVEL = 2; static boolean isLevelAtLeast(ValueInput input, int level) { -@@ -6443,4 +6443,46 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name +@@ -6426,4 +6426,46 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name // Paper end - Expose entity id counter public boolean shouldTickHot() { return this.tickCount > 20 * 10 && this.isAlive(); } // KioCG diff --git a/lophine-server/minecraft-patches/features/0005-Add-config-to-enable-save-all-command.patch b/lophine-server/minecraft-patches/features/0005-Add-config-to-enable-save-all-command.patch index 65ec9d4..fd9487f 100644 --- a/lophine-server/minecraft-patches/features/0005-Add-config-to-enable-save-all-command.patch +++ b/lophine-server/minecraft-patches/features/0005-Add-config-to-enable-save-all-command.patch @@ -31,7 +31,7 @@ index 02c004bc7f9a0203523ce4b27cd766d6bdc478c0..3d86e21198f2888422330b6f7c27712f private final Reference2ReferenceOpenHashMap, Object> regionizedData = new Reference2ReferenceOpenHashMap<>(); diff --git a/net/minecraft/commands/Commands.java b/net/minecraft/commands/Commands.java -index b95d144dd479d339cc4b0f92cc4c3bade9af4927..097e5b6a14fd148c93ca3894295a4a6b1e9aa870 100644 +index 6cb0d4daf0f275b95d5ca09275e40ab32258eb39..48628174299f8f18170198df1834d6174bd1fafa 100644 --- a/net/minecraft/commands/Commands.java +++ b/net/minecraft/commands/Commands.java @@ -294,7 +294,11 @@ public class Commands { @@ -48,10 +48,10 @@ index b95d144dd479d339cc4b0f92cc4c3bade9af4927..097e5b6a14fd148c93ca3894295a4a6b SaveOnCommand.register(this.dispatcher); SetPlayerIdleTimeoutCommand.register(this.dispatcher); diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java -index 0d572803c663738a525922c02dd4c65ac61e4cce..76098a4f44f8d82bebf832fa5e240adf25fbe80a 100644 +index 4be383909addfebc0ca3b007d4ef2ec30ed445f7..fa60388376e9dafc5e1b71b6e78550bb6cd4009b 100644 --- a/net/minecraft/server/MinecraftServer.java +++ b/net/minecraft/server/MinecraftServer.java -@@ -1661,6 +1661,11 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop -Date: Mon, 7 Jul 2025 18:19:00 +0800 -Subject: [PATCH] Add config to enable waypoint command & bar - -use concurrent method to fix it (now, they are thread safe) - -diff --git a/net/minecraft/commands/Commands.java b/net/minecraft/commands/Commands.java -index 65f200381f486146ce8d893378f0591a82f6076b..8362b6a92b27e908024077e564b98d4b681cb2b0 100644 ---- a/net/minecraft/commands/Commands.java -+++ b/net/minecraft/commands/Commands.java -@@ -270,7 +270,11 @@ public class Commands { - TimeCommand.register(this.dispatcher); - TitleCommand.register(this.dispatcher, context); - //TriggerCommand.register(this.dispatcher); // Folia - region threading - TODO later -- //WaypointCommand.register(this.dispatcher, context); // Folia - region threading - TODO later -+ // Lophine start - unsafe waypoint bar -+ if (fun.bm.lophine.config.modules.experiment.CommandConfig.waypoint) { -+ WaypointCommand.register(this.dispatcher, context); // Folia - region threading - TODO later -+ } -+ // Lophine end - unsafe waypoint bar - WeatherCommand.register(this.dispatcher); - WorldBorderCommand.register(this.dispatcher); - if (JvmProfiler.INSTANCE.isAvailable()) { -diff --git a/net/minecraft/server/waypoints/ServerWaypointManager.java b/net/minecraft/server/waypoints/ServerWaypointManager.java -index 1cbc46e480cc7d109c6128f109a1a9e38bf1a193..bd1d4a832eec4c89a7f8bdd5d066b6074f206d81 100644 ---- a/net/minecraft/server/waypoints/ServerWaypointManager.java -+++ b/net/minecraft/server/waypoints/ServerWaypointManager.java -@@ -16,22 +16,31 @@ import net.minecraft.world.waypoints.WaypointManager; - import net.minecraft.world.waypoints.WaypointTransmitter; - - public class ServerWaypointManager implements WaypointManager { -- private final Set waypoints = new HashSet<>(); -- private final Set players = new HashSet<>(); -- private final Table connections = HashBasedTable.create(); -+ private final Set waypoints = new java.util.concurrent.CopyOnWriteArraySet<>(); // Lophine - concurrent -+ private final Set players = new java.util.concurrent.CopyOnWriteArraySet<>(); // Lophine - concurrent -+ private final fun.bm.lophine.utils.concurrent.AbstractConcurrentTable connections = fun.bm.lophine.config.modules.optimizations.WayPointOptimizedTableConfig.optimizedTable ? new fun.bm.lophine.utils.concurrent.OptimizedConcurrentTable<>() : new fun.bm.lophine.utils.concurrent.ConcurrentTable<>(); // Lophine - concurrent - - @Override - public void trackWaypoint(WaypointTransmitter waypoint) { -- // Folia - region threading -+ // Lophine start - unsafe waypoint bar -+ if (!fun.bm.lophine.config.modules.experiment.CommandConfig.waypoint) return; -+ this.waypoints.add(waypoint); -+ -+ for (ServerPlayer serverPlayer : this.players) { -+ this.createConnection(serverPlayer, waypoint); -+ } -+ // Lophine end - unsafe waypoint bar - } - - @Override - public void updateWaypoint(WaypointTransmitter waypoint) { - if (this.waypoints.contains(waypoint)) { -- Map map = Tables.transpose(this.connections).row(waypoint); -- SetView set = Sets.difference(this.players, map.keySet()); -+ java.util.List> map = this.connections.getXZ(waypoint); // Lophine - concurrent -+ Set players1 = new HashSet<>(); // Lophine - concurrent -+ if (!map.isEmpty()) map.forEach((entry) -> players1.add(entry.getKey())); // Lophine - concurrent -+ SetView set = Sets.difference(this.players, players1); // Lophine - concurrent - -- for (Entry entry : ImmutableSet.copyOf(map.entrySet())) { -+ for (Entry entry : map) { // Lophine - concurrent - this.updateConnection(entry.getKey(), waypoint, entry.getValue()); - } - -@@ -43,26 +52,65 @@ public class ServerWaypointManager implements WaypointManager connection.disconnect()); -- Tables.transpose(this.connections).row(waypoint).clear(); -+ this.connections.getXZ(waypoint).forEach((entry) -> { -+ entry.getValue().disconnect(); -+ this.connections.remove(entry.getKey(), waypoint, entry.getValue()); -+ }); // Lophine - concurrent - this.waypoints.remove(waypoint); - } - - public void addPlayer(ServerPlayer player) { - // Folia - region threading -+ // Lophine start - unsafe waypoint bar -+ if (!fun.bm.lophine.config.modules.experiment.CommandConfig.waypoint) return; -+ this.players.add(player); -+ -+ for (WaypointTransmitter waypointTransmitter : this.waypoints) { -+ this.createConnection(player, waypointTransmitter); -+ } -+ -+ if (player.isTransmittingWaypoint()) { -+ this.trackWaypoint((WaypointTransmitter)player); -+ } -+ // Lophine end - unsafe waypoint bar - } - - public void updatePlayer(ServerPlayer player) { - // Folia - region threading -+ // Lophine start - unsafe waypoint bar -+ if (!fun.bm.lophine.config.modules.experiment.CommandConfig.waypoint) return; -+ java.util.List> map = this.connections.getYZ(player); // Lophine - concurrent -+ Set waypoints1 = new HashSet<>();// Lophine - concurrent -+ if (!map.isEmpty()) map.forEach((entry) -> waypoints1.add(entry.getKey()));// Lophine - concurrent -+ SetView set = Sets.difference(this.waypoints, waypoints1); // Lophine - concurrent -+ -+ for (Entry entry : map) { // Lophine - concurrent -+ this.updateConnection(player, entry.getKey(), entry.getValue()); -+ } -+ -+ for (WaypointTransmitter waypointTransmitter : set) { -+ this.createConnection(player, waypointTransmitter); -+ } -+ // Lophine end - unsafe waypoint bar - } - - public void removePlayer(ServerPlayer player) { - // Folia - region threading -+ // Lophine start - unsafe waypoint bar -+ if (!fun.bm.lophine.config.modules.experiment.CommandConfig.waypoint) return; -+ this.connections.getYZ(player).forEach((entry) -> { -+ entry.getValue().disconnect(); -+ this.connections.remove(player, entry.getKey(), entry.getValue()); -+ }); // Lophine - concurrent -+ this.untrackWaypoint((WaypointTransmitter)player); -+ this.players.remove(player); -+ // Lophine end - unsafe waypoint bar - } - - public void breakAllConnections() { -- this.connections.values().forEach(WaypointTransmitter.Connection::disconnect); -- this.connections.clear(); -+ java.util.List map = this.connections.getAllZ(); // Lophine - concurrent -+ if (!map.isEmpty()) map.forEach(WaypointTransmitter.Connection::disconnect); // Lophine - concurrent -+ this.connections.clearAll(); // Lophine - concurrent - } - - public void remakeConnections(WaypointTransmitter waypoint) { -@@ -83,13 +131,19 @@ public class ServerWaypointManager implements WaypointManager { -- this.connections.put(player, waypoint, connection); -+ this.connections.putOrUpdate(player, waypoint, connection); - connection.connect(); - }, () -> { -- WaypointTransmitter.Connection connection = this.connections.remove(player, waypoint); -- if (connection != null) { -- connection.disconnect(); -- } -+ // Lophine start - concurrent -+ java.util.List c = this.connections.getZ(player, waypoint); -+ if (c.isEmpty()) return; // Lophine - concurrent -+ c.forEach((connection) -> { -+ this.connections.remove(player, waypoint, connection); -+ if (connection != null) { -+ connection.disconnect(); -+ } -+ }); -+ // Lophine end - concurrent - }); - } - } -@@ -103,10 +157,12 @@ public class ServerWaypointManager implements WaypointManager { - connection1.connect(); -- this.connections.put(player, waypoint, connection1); -+ this.connections.putOrUpdate(player, waypoint, connection1); - }, () -> { - connection.disconnect(); -- this.connections.remove(player, waypoint); -+ java.util.List c = this.connections.getZ(player, waypoint); // Lophine - concurrent -+ if (c.isEmpty()) return; // Lophine - concurrent -+ c.forEach((connection1) -> this.connections.remove(player, waypoint, connection1)); // Lophine - concurrent - }); - } - } diff --git a/lophine-server/minecraft-patches/features/0009-Fix-datapack-command-save-function.patch b/lophine-server/minecraft-patches/features/0008-Fix-datapack-command-save-function.patch similarity index 97% rename from lophine-server/minecraft-patches/features/0009-Fix-datapack-command-save-function.patch rename to lophine-server/minecraft-patches/features/0008-Fix-datapack-command-save-function.patch index e9a2be1..2b3edf8 100644 --- a/lophine-server/minecraft-patches/features/0009-Fix-datapack-command-save-function.patch +++ b/lophine-server/minecraft-patches/features/0008-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 644c49730fc08a7c680f8114136db00ee8f81378..2359c5b49e4457cc36239289f203df16767a4341 100644 +index d7d22806c010636d8c1471f0fd1d64ef54e92c97..8d96d2130cf3383427047fee97fa49155164e337 100644 --- a/net/minecraft/server/MinecraftServer.java +++ b/net/minecraft/server/MinecraftServer.java -@@ -2436,6 +2436,16 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 0) { // Folia - region threading - this is complicated to implement, and even if done correctly is messy @@ -66,7 +66,7 @@ index 2359c5b49e4457cc36239289f203df16767a4341..68c3b0496738ed4fcb02204c5c882fd7 this.emptyTicks++; } else { this.emptyTicks = 0; -@@ -1806,6 +1813,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 0) { this.playerList.saveAll(playerSaveInterval); @@ -74,7 +74,7 @@ index 2359c5b49e4457cc36239289f203df16767a4341..68c3b0496738ed4fcb02204c5c882fd7 } for (final ServerLevel level : (region == null ? this.getAllLevels() : Arrays.asList(region.world))) { // Folia - region threading if (level.paperConfig().chunks.autoSaveInterval.value() > 0) { -@@ -2026,6 +2034,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop= resultLimit) { diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java -index 68c3b0496738ed4fcb02204c5c882fd722397648..72824013c313b7ada8dc86d9f2ff55a296fb6ac8 100644 +index dfcf8eb7dc422a55d94d6eb9eb1451c7c14a1d56..9130f1fbf15500f2149418b73ae2a374bba22eee 100644 --- a/net/minecraft/server/MinecraftServer.java +++ b/net/minecraft/server/MinecraftServer.java -@@ -1901,7 +1901,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop { // Folia - region threading // Paper start - Expand PlayerGameModeChangeEvent org.bukkit.event.player.PlayerGameModeChangeEvent event = player.setGameMode(gameMode, org.bukkit.event.player.PlayerGameModeChangeEvent.Cause.DEFAULT_GAMEMODE, null); // Folia - region threading -@@ -2499,7 +2499,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop { - public abstract void putOrUpdate(X x, Y y, Z z); - - public abstract void put(X x, Y y, Z z); - - public abstract void remove(X x, Y y, Z z); - - public abstract List getZ(X x, Y y); - - public abstract List getY(X x, Z z); - - public abstract List getX(Y y, Z z); - - public abstract List> getXY(Z z); - - public abstract List> getYZ(X x); - - public abstract List> getXZ(Y y); - - public abstract List getAllX(); - - public abstract List getAllY(); - - public abstract List getAllZ(); - - public abstract void clearXY(Z z); - - public abstract void clearYZ(X x); - - public abstract void clearXZ(Y y); - - public abstract void clearAll(); -} diff --git a/lophine-server/src/main/java/fun/bm/lophine/utils/concurrent/ConcurrentTable.java b/lophine-server/src/main/java/fun/bm/lophine/utils/concurrent/ConcurrentTable.java deleted file mode 100644 index 9965f35..0000000 --- a/lophine-server/src/main/java/fun/bm/lophine/utils/concurrent/ConcurrentTable.java +++ /dev/null @@ -1,150 +0,0 @@ -package fun.bm.lophine.utils.concurrent; - -import java.util.AbstractMap; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentLinkedDeque; -import java.util.function.Predicate; - -public class ConcurrentTable extends AbstractConcurrentTable { - protected final ConcurrentLinkedDeque> data = new ConcurrentLinkedDeque<>(); - - @Override - public void putOrUpdate(X x, Y y, Z z) { - for (TableEntry entry : data) { - if (entry.getX().equals(x) && entry.getY().equals(y)) { - entry.setZ(z); - return; - } - } - this.put(x, y, z); - } - - @Override - public void put(X x, Y y, Z z) { - data.add(new TableEntry<>(x, y, z)); - } - - @Override - public void remove(X x, Y y, Z z) { - data.removeIf(entry -> entry.getX().equals(x) && entry.getY().equals(y) && entry.getZ().equals(z)); - } - - @Override - public List getZ(X x, Y y) { - return filterAndCollect( - entry -> entry.getX().equals(x) && entry.getY().equals(y), - TableEntry::getZ - ); - } - - @Override - public List getY(X x, Z z) { - return filterAndCollect( - entry -> entry.getX().equals(x) && entry.getZ().equals(z), - TableEntry::getY - ); - } - - @Override - public List getX(Y y, Z z) { - return filterAndCollect( - entry -> entry.getY().equals(y) && entry.getZ().equals(z), - TableEntry::getX - ); - } - - @Override - public List> getXY(Z z) { - return filterAndMap( - entry -> entry.getZ().equals(z), - TableEntry::getX, - TableEntry::getY - ); - } - - @Override - public List> getYZ(X x) { - return filterAndMap( - entry -> entry.getX().equals(x), - TableEntry::getY, - TableEntry::getZ - ); - } - - @Override - public List> getXZ(Y y) { - return filterAndMap( - entry -> entry.getY().equals(y), - TableEntry::getX, - TableEntry::getZ - ); - } - - @Override - public List getAllX() { - return collectAll(TableEntry::getX); - } - - @Override - public List getAllY() { - return collectAll(TableEntry::getY); - } - - @Override - public List getAllZ() { - return collectAll(TableEntry::getZ); - } - - @Override - public void clearXY(Z z) { - data.removeIf(entry -> entry.getZ().equals(z)); - } - - @Override - public void clearYZ(X x) { - data.removeIf(entry -> entry.getX().equals(x)); - } - - @Override - public void clearXZ(Y y) { - data.removeIf(entry -> entry.getY().equals(y)); - } - - @Override - public void clearAll() { - data.clear(); - } - - private List filterAndCollect(Predicate> filter, - java.util.function.Function, T> mapper) { - List result = new ArrayList<>(); - for (TableEntry entry : data) { - if (filter.test(entry)) { - result.add(mapper.apply(entry)); - } - } - return result; - } - - private List> filterAndMap(Predicate> filter, - java.util.function.Function, K> keyMapper, - java.util.function.Function, V> valueMapper) { - List> list = new ArrayList<>(); - for (TableEntry entry : data) { - if (filter.test(entry)) { - list.add(new AbstractMap.SimpleEntry<>(keyMapper.apply(entry), valueMapper.apply(entry))); - } - } - return list; - } - - private List collectAll(java.util.function.Function, T> mapper) { - List result = new ArrayList<>(); - for (TableEntry entry : data) { - result.add(mapper.apply(entry)); - } - return result; - } -} diff --git a/lophine-server/src/main/java/fun/bm/lophine/utils/concurrent/OptimizedConcurrentTable.java b/lophine-server/src/main/java/fun/bm/lophine/utils/concurrent/OptimizedConcurrentTable.java deleted file mode 100644 index 6744131..0000000 --- a/lophine-server/src/main/java/fun/bm/lophine/utils/concurrent/OptimizedConcurrentTable.java +++ /dev/null @@ -1,197 +0,0 @@ -package fun.bm.lophine.utils.concurrent; - -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; -import java.util.function.BiFunction; -import java.util.function.Predicate; - -public class OptimizedConcurrentTable extends ConcurrentTable { - private final ConcurrentHashMap>> xyIndex = new ConcurrentHashMap<>(); - private final ConcurrentHashMap>> yzIndex = new ConcurrentHashMap<>(); - private final ConcurrentHashMap>> zxIndex = new ConcurrentHashMap<>(); - - @Override - public void putOrUpdate(X x, Y y, Z z) { - boolean updated = false; - - for (TableEntry entry : data) { - if (entry.getX().equals(x) && entry.getY().equals(y)) { - removeFromIndex(xyIndex, entry.getX(), entry.getY(), entry.getZ()); - removeFromIndex(yzIndex, entry.getY(), entry.getZ(), entry.getX()); - removeFromIndex(zxIndex, entry.getZ(), entry.getX(), entry.getY()); - - entry.setZ(z); - - putData(x, y, z); - - updated = true; - break; - } - } - - if (!updated) { - this.put(x, y, z); - } - } - - private void putData(X x, Y y, Z z) { - xyIndex.computeIfAbsent(x, k -> new ConcurrentHashMap<>()) - .computeIfAbsent(y, k -> ConcurrentHashMap.newKeySet()).add(z); - yzIndex.computeIfAbsent(y, k -> new ConcurrentHashMap<>()) - .computeIfAbsent(z, k -> ConcurrentHashMap.newKeySet()).add(x); - zxIndex.computeIfAbsent(z, k -> new ConcurrentHashMap<>()) - .computeIfAbsent(x, k -> ConcurrentHashMap.newKeySet()).add(y); - } - - - @Override - public void put(X x, Y y, Z z) { - super.put(x, y, z); - putData(x, y, z); - } - - @Override - public void remove(X x, Y y, Z z) { - super.remove(x, y, z); - removeFromIndex(xyIndex, x, y, z); - removeFromIndex(yzIndex, y, z, x); - removeFromIndex(zxIndex, z, x, y); - } - - private void removeFromIndex(ConcurrentHashMap>> index, - K key1, V key2, T value) { - index.computeIfPresent(key1, (k, map) -> { - map.computeIfPresent(key2, (k2, set) -> { - set.remove(value); - return set.isEmpty() ? null : set; - }); - return map.isEmpty() ? null : map; - }); - } - - public void removeAll(Predicate> predicate) { - data.removeIf(entry -> { - boolean shouldRemove = predicate.test(entry); - if (shouldRemove) { - removeFromIndex(xyIndex, entry.getX(), entry.getY(), entry.getZ()); - removeFromIndex(yzIndex, entry.getY(), entry.getZ(), entry.getX()); - removeFromIndex(zxIndex, entry.getZ(), entry.getX(), entry.getY()); - } - return shouldRemove; - }); - } - - public boolean putIfAbsent(X x, Y y, Z z) { - if (data.stream().anyMatch(entry -> - Objects.equals(entry.getX(), x) && - Objects.equals(entry.getY(), y) && - Objects.equals(entry.getZ(), z))) { - return false; - } - put(x, y, z); - return true; - } - - @Override - public List getZ(X x, Y y) { - Set result = xyIndex.getOrDefault(x, new ConcurrentHashMap<>()).get(y); - return result != null ? new ArrayList<>(result) : new ArrayList<>(); - } - - @Override - public List getY(X x, Z z) { - Set result = zxIndex.getOrDefault(z, new ConcurrentHashMap<>()).get(x); - return result != null ? new ArrayList<>(result) : new ArrayList<>(); - } - - public List getX(Y y, Z z) { - Set result = yzIndex.getOrDefault(y, new ConcurrentHashMap<>()).get(z); - return result != null ? new ArrayList<>(result) : new ArrayList<>(); - } - - @Override - public List> getXY(Z z) { - return buildDataFromIndex(zxIndex.get(z)); - } - - @Override - public List> getYZ(X x) { - return buildDataFromIndex(xyIndex.get(x)); - } - - @Override - public List> getXZ(Y y) { - return reverseDataFromIndex(yzIndex.get(y)); - } - - @Override - public List getAllX() { - Set resultSet = new HashSet<>(xyIndex.keySet()); - return new ArrayList<>(resultSet); - } - - @Override - public List getAllY() { - Set resultSet = new HashSet<>(yzIndex.keySet()); - return new ArrayList<>(resultSet); - } - - @Override - public List getAllZ() { - Set resultSet = new HashSet<>(zxIndex.keySet()); - return new ArrayList<>(resultSet); - } - - - @Override - public void clearXY(Z z) { - super.clearXY(z); - zxIndex.remove(z); - } - - @Override - public void clearYZ(X x) { - super.clearYZ(x); - xyIndex.remove(x); - } - - @Override - public void clearXZ(Y y) { - super.clearXZ(y); - yzIndex.remove(y); - } - - @Override - public void clearAll() { - super.clearAll(); - xyIndex.clear(); - yzIndex.clear(); - zxIndex.clear(); - } - - - private List buildEntriesFromIndex(ConcurrentHashMap> indexMap, - BiFunction entryCreator) { - List result = new ArrayList<>(); - if (indexMap != null) { - for (Map.Entry> entry : indexMap.entrySet()) { - K key = entry.getKey(); - Set valueSet = entry.getValue(); - if (valueSet != null && !valueSet.isEmpty()) { - for (V value : valueSet) { - result.add(entryCreator.apply(key, value)); - } - } - } - } - return result; - } - - private List> buildDataFromIndex(ConcurrentHashMap> indexMap) { - return buildEntriesFromIndex(indexMap, AbstractMap.SimpleEntry::new); - } - - private List> reverseDataFromIndex(ConcurrentHashMap> indexMap) { - return buildEntriesFromIndex(indexMap, (key, value) -> new AbstractMap.SimpleEntry<>(value, key)); - } -} diff --git a/lophine-server/src/main/java/fun/bm/lophine/utils/concurrent/TableEntry.java b/lophine-server/src/main/java/fun/bm/lophine/utils/concurrent/TableEntry.java deleted file mode 100644 index 3fd7200..0000000 --- a/lophine-server/src/main/java/fun/bm/lophine/utils/concurrent/TableEntry.java +++ /dev/null @@ -1,29 +0,0 @@ -package fun.bm.lophine.utils.concurrent; - -public class TableEntry { - private final X x; - private final Y y; - private Z z; - - public TableEntry(X x, Y y, Z z) { - this.x = x; - this.y = y; - this.z = z; - } - - public X getX() { - return x; - } - - public Y getY() { - return y; - } - - public Z getZ() { - return z; - } - - public void setZ(Z z) { - this.z = z; - } -} diff --git a/lophine-server/src/main/java/org/leavesmc/leaves/bot/agent/configs/LocatorBarConfig.java b/lophine-server/src/main/java/org/leavesmc/leaves/bot/agent/configs/LocatorBarConfig.java index 7b5963a..9bd9c79 100644 --- a/lophine-server/src/main/java/org/leavesmc/leaves/bot/agent/configs/LocatorBarConfig.java +++ b/lophine-server/src/main/java/org/leavesmc/leaves/bot/agent/configs/LocatorBarConfig.java @@ -21,6 +21,7 @@ import com.mojang.brigadier.arguments.BoolArgumentType; import fun.bm.lophine.LophineLogger; import fun.bm.lophine.config.modules.experiment.CommandConfig; import fun.bm.lophine.config.modules.function.FakeplayerConfig; +import me.earthme.luminol.utils.FoliaServerWaypointManager; import me.earthme.luminol.utils.NullPlugin; import net.minecraft.nbt.CompoundTag; import net.minecraft.server.waypoints.ServerWaypointManager; @@ -53,7 +54,7 @@ public class LocatorBarConfig extends AbstractBotConfig