diff --git a/1todos/server/minecraft-patches/features/0041-Add-null-check-in-RegionizedWorldData-conections.patch b/1todos/server/minecraft-patches/features/0041-Add-null-check-in-RegionizedWorldData-conections.patch deleted file mode 100644 index f3df18f..0000000 --- a/1todos/server/minecraft-patches/features/0041-Add-null-check-in-RegionizedWorldData-conections.patch +++ /dev/null @@ -1,51 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Helvetica Volubi -Date: Wed, 17 Dec 2025 00:20:57 +0800 -Subject: [PATCH] Add null check in RegionizedWorldData >> conections - -some of our function patches will crash because of get null in conn.getPlayer(), then when we process player.chunkPosition() will get NPE, so we need to fix it. - -diff --git a/io/papermc/paper/threadedregions/RegionizedWorldData.java b/io/papermc/paper/threadedregions/RegionizedWorldData.java -index c5caad99caed20e2bb4475fcf057417ee27d737c..c2e50a03a41958d9b44753adc9a9bf4ea1fb24a4 100644 ---- a/io/papermc/paper/threadedregions/RegionizedWorldData.java -+++ b/io/papermc/paper/threadedregions/RegionizedWorldData.java -@@ -251,14 +251,17 @@ public final class RegionizedWorldData { - regionToData.get(CoordinateUtils.getChunkKey(pos.x >> chunkToRegionShift, pos.z >> chunkToRegionShift)).itemEntityMovementTrackerMap.put(key, tracker); - } - // Luminol end -+ Set cons = new java.util.HashSet<>(from.connections.size()); // Lophine - save all connections we have processed in connection process - // connections - for (final Connection conn : from.connections) { - final ServerPlayer player = conn.getPlayer(); -+ if (player == null) continue; // Lophine - skip null player connections - final ChunkPos pos = player.chunkPosition(); - // Note: It is impossible for an entity in the world to _not_ be in an entity chunk, which means - // the chunk holder must _exist_, and so the region section exists. - regionToData.get(CoordinateUtils.getChunkKey(pos.x >> chunkToRegionShift, pos.z >> chunkToRegionShift)) - .connections.add(conn); -+ cons.add(conn); // Lophine - save all connections we have processed in connection process - } - // entities - for (final ServerPlayer player : from.localPlayers) { -@@ -269,6 +272,13 @@ public final class RegionizedWorldData { - into.localPlayers.add(player); - player.getBukkitEntity().updateRegion(into); - into.nearbyPlayers.addPlayer(player); -+ // Lophine start - we need to process the connection if player's connection is not processed, if connection.player is null, next tick will clean up it -+ final Connection conn = player.connection.connection; -+ if (!cons.contains(conn)) { -+ regionToData.get(CoordinateUtils.getChunkKey(pos.x >> chunkToRegionShift, pos.z >> chunkToRegionShift)) -+ .connections.add(conn); -+ } -+ // Lophine end - } - for (final Entity entity : from.allEntities) { - final ChunkPos pos = entity.chunkPosition(); -@@ -636,6 +646,7 @@ public final class RegionizedWorldData { - private static void cleanUpConnection(final Connection conn) { - // note: ALL connections HERE have a player - final ServerPlayer player = conn.getPlayer(); -+ if (player == null) return; // Lophine - skip null player connections - // now that the connection is removed, we can allow this region to die - player.level().moonrise$getChunkTaskScheduler().chunkHolderManager.removeTicketAtLevel( - ServerGamePacketListenerImpl.DISCONNECT_TICKET, player.connection.disconnectPos, diff --git a/1todos/server/minecraft-patches/features/0042-Add-removed-check-before-all-checks-start-in-addEffe.patch b/1todos/server/minecraft-patches/features/0042-Add-removed-check-before-all-checks-start-in-addEffe.patch deleted file mode 100644 index adb7ad8..0000000 --- a/1todos/server/minecraft-patches/features/0042-Add-removed-check-before-all-checks-start-in-addEffe.patch +++ /dev/null @@ -1,18 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Helvetica Volubi -Date: Tue, 13 Jan 2026 21:04:59 +0800 -Subject: [PATCH] Add removed check before all checks start in addEffect - - -diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java -index e4ae4354e81f34f0db410333fc9b8e17383a5f41..fc8833655102ca98bb331782a624af79cbef414f 100644 ---- a/net/minecraft/world/entity/LivingEntity.java -+++ b/net/minecraft/world/entity/LivingEntity.java -@@ -1186,6 +1186,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin - public boolean addEffect(MobEffectInstance effectInstance, @Nullable Entity entity, EntityPotionEffectEvent.Cause cause, boolean fireEvent) { - // Paper end - Don't fire sync event during generation - // org.spigotmc.AsyncCatcher.catchOp("effect add"); // Spigot // Paper - move to API -+ if (this.isRemoved()) return false; // Lophine - shouldn't be possible to add effects to removed entity - if (!this.hasNullCallback()) ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this, "Cannot add effects to entities asynchronously"); // Folia - region threading - if (this.isTickingEffects) { - this.effectsToProcess.add(new ProcessableEffect(effectInstance, cause)); diff --git a/gradle.properties b/gradle.properties index e8364ee..58bbe6e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,7 +5,7 @@ channel=BETA clipVersion=3.0.16 weightVersion=2.0.12 # 0 for skip release, 1 for pre-release, 2 for release -release=0 +release=1 luminolRef=3796903eed83888033744ca0f8268e97eb43cf91 diff --git a/1todos/api/paper-patches/features/0003-Leaves-Replay-Mod-API.patch b/lophine-api/paper-patches/features/0004-Leaves-Replay-Mod-API.patch similarity index 82% rename from 1todos/api/paper-patches/features/0003-Leaves-Replay-Mod-API.patch rename to lophine-api/paper-patches/features/0004-Leaves-Replay-Mod-API.patch index d64690b..d9a84bd 100644 --- a/1todos/api/paper-patches/features/0003-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 850f65d764030b09d469e33a69409204503d9ca1..78b947352aa32ae0c59101459f420bf8e3497707 100644 +index 592a3c59bf5edbc65c7c0472e2382593b7b22086..838ad878528267b57b69d2938aee0eb6326948eb 100644 --- a/src/main/java/org/bukkit/Bukkit.java +++ b/src/main/java/org/bukkit/Bukkit.java -@@ -3050,4 +3050,10 @@ public final class Bukkit { +@@ -3059,4 +3059,10 @@ public final class Bukkit { return server.getBotManager(); } // Leaves end - Bot API @@ -23,10 +23,10 @@ index 850f65d764030b09d469e33a69409204503d9ca1..78b947352aa32ae0c59101459f420bf8 + // Leaves end - Photographer API } diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java -index cb8c4e09511f99558eb5af26c08c5cb1f936780d..b770b6f990d46f5325554f5d73c6a2a6ed361158 100644 +index 978e015e91408503b4ec84ec5b3c5193255ba7db..d054926f6082bba7d0b59e610e5d725ff5f9ffa4 100644 --- a/src/main/java/org/bukkit/Server.java +++ b/src/main/java/org/bukkit/Server.java -@@ -2800,4 +2800,8 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi +@@ -2822,4 +2822,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/1todos/api/src/main/java/org/leavesmc/leaves/entity/photographer/Photographer.java b/lophine-api/src/main/java/org/leavesmc/leaves/entity/photographer/Photographer.java similarity index 100% rename from 1todos/api/src/main/java/org/leavesmc/leaves/entity/photographer/Photographer.java rename to lophine-api/src/main/java/org/leavesmc/leaves/entity/photographer/Photographer.java diff --git a/1todos/api/src/main/java/org/leavesmc/leaves/entity/photographer/PhotographerManager.java b/lophine-api/src/main/java/org/leavesmc/leaves/entity/photographer/PhotographerManager.java similarity index 100% rename from 1todos/api/src/main/java/org/leavesmc/leaves/entity/photographer/PhotographerManager.java rename to lophine-api/src/main/java/org/leavesmc/leaves/entity/photographer/PhotographerManager.java diff --git a/1todos/api/src/main/java/org/leavesmc/leaves/replay/BukkitRecorderOption.java b/lophine-api/src/main/java/org/leavesmc/leaves/replay/BukkitRecorderOption.java similarity index 100% rename from 1todos/api/src/main/java/org/leavesmc/leaves/replay/BukkitRecorderOption.java rename to lophine-api/src/main/java/org/leavesmc/leaves/replay/BukkitRecorderOption.java diff --git a/lophine-server/luminol-patches/features/0004-Leaves-Fakeplayer.patch b/lophine-server/luminol-patches/features/0004-Leaves-Fakeplayer.patch index 9c4cb48..94db291 100644 --- a/lophine-server/luminol-patches/features/0004-Leaves-Fakeplayer.patch +++ b/lophine-server/luminol-patches/features/0004-Leaves-Fakeplayer.patch @@ -36,3 +36,23 @@ index 0a20c6f03625391201e5ced167707e54ed27daa1..2872b22e44cba48442c526f0a53e1fc6 this.createConnection(player, transmitter); } +diff --git a/src/main/java/org/leavesmc/leaves/plugin/ServerFeatureManager.java b/src/main/java/org/leavesmc/leaves/plugin/ServerFeatureManager.java +index 8f0548908a9e43ce29c4476f2707f6898e540aec..8b7c66785a06eb4782de0b0a9b542221d6258220 100644 +--- a/src/main/java/org/leavesmc/leaves/plugin/ServerFeatureManager.java ++++ b/src/main/java/org/leavesmc/leaves/plugin/ServerFeatureManager.java +@@ -11,14 +11,7 @@ public class ServerFeatureManager implements FeatureManager { + private final Set availableFeatures = new HashSet<>(); + + private ServerFeatureManager() { +- if (false) { // Luminol not provide this +- availableFeatures.addAll(Set.of( +- FAKEPLAYER, +- PHOTOGRAPHER, +- BYTEBUF, +- UPDATE_SUPPRESSION_EVENT +- )); +- } ++ availableFeatures.add(FAKEPLAYER); // Lophine - fakeplayer support + if (Boolean.getBoolean("leavesclip.enable.mixin")) { + availableFeatures.add(MIXIN); + } diff --git a/lophine-server/luminol-patches/features/0005-Leaves-Fakeplayer.patch b/lophine-server/luminol-patches/features/0005-Leaves-Fakeplayer.patch deleted file mode 100644 index 016b46a..0000000 --- a/lophine-server/luminol-patches/features/0005-Leaves-Fakeplayer.patch +++ /dev/null @@ -1,26 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Helvetica Volubi -Date: Sun, 17 May 2026 03:43:54 +0800 -Subject: [PATCH] Leaves: Fakeplayer - - -diff --git a/src/main/java/org/leavesmc/leaves/plugin/ServerFeatureManager.java b/src/main/java/org/leavesmc/leaves/plugin/ServerFeatureManager.java -index 8f0548908a9e43ce29c4476f2707f6898e540aec..009f05ac58b9d1cf809e997e30158eb5d667e9f0 100644 ---- a/src/main/java/org/leavesmc/leaves/plugin/ServerFeatureManager.java -+++ b/src/main/java/org/leavesmc/leaves/plugin/ServerFeatureManager.java -@@ -11,14 +11,7 @@ public class ServerFeatureManager implements FeatureManager { - private final Set availableFeatures = new HashSet<>(); - - private ServerFeatureManager() { -- if (false) { // Luminol not provide this -- availableFeatures.addAll(Set.of( -- FAKEPLAYER, -- PHOTOGRAPHER, -- BYTEBUF, -- UPDATE_SUPPRESSION_EVENT -- )); -- } -+ availableFeatures.add(FAKEPLAYER); - if (Boolean.getBoolean("leavesclip.enable.mixin")) { - availableFeatures.add(MIXIN); - } diff --git a/lophine-server/luminol-patches/features/0005-Leaves-Replay-Mod-API.patch b/lophine-server/luminol-patches/features/0005-Leaves-Replay-Mod-API.patch new file mode 100644 index 0000000..fac9293 --- /dev/null +++ b/lophine-server/luminol-patches/features/0005-Leaves-Replay-Mod-API.patch @@ -0,0 +1,18 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Helvetica Volubi +Date: Sun, 17 May 2026 05:33:21 +0800 +Subject: [PATCH] Leaves: Replay Mod API + + +diff --git a/src/main/java/org/leavesmc/leaves/plugin/ServerFeatureManager.java b/src/main/java/org/leavesmc/leaves/plugin/ServerFeatureManager.java +index 8b7c66785a06eb4782de0b0a9b542221d6258220..1f3fe7f786bb8f7c59e3a0235dcc572f3171ee6b 100644 +--- a/src/main/java/org/leavesmc/leaves/plugin/ServerFeatureManager.java ++++ b/src/main/java/org/leavesmc/leaves/plugin/ServerFeatureManager.java +@@ -12,6 +12,7 @@ public class ServerFeatureManager implements FeatureManager { + + private ServerFeatureManager() { + availableFeatures.add(FAKEPLAYER); // Lophine - fakeplayer support ++ availableFeatures.add(PHOTOGRAPHER); // Lophine - Replay Mod API support + if (Boolean.getBoolean("leavesclip.enable.mixin")) { + availableFeatures.add(MIXIN); + } diff --git a/lophine-server/minecraft-patches/features/0006-Add-config-to-enable-cross-region-damage-trace.patch b/lophine-server/minecraft-patches/features/0006-Add-config-to-enable-cross-region-damage-trace.patch index db19648..4603f3e 100644 --- a/lophine-server/minecraft-patches/features/0006-Add-config-to-enable-cross-region-damage-trace.patch +++ b/lophine-server/minecraft-patches/features/0006-Add-config-to-enable-cross-region-damage-trace.patch @@ -48,7 +48,7 @@ index 6cedc129f31289eaf4e3580219fc1988c0f3c5a1..5f1fad59a26e3fe29f9000a92be5d6c4 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 17483ffff6cb2a9e86db7079e7c3a9a800654c62..fde9fad11e130cf93205d23da09ad369b35db160 100644 +index 17483ffff6cb2a9e86db7079e7c3a9a800654c62..29919b8f3c05c8ffaf66f86e441778eeefb293b1 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 @@ -65,7 +65,7 @@ index 17483ffff6cb2a9e86db7079e7c3a9a800654c62..fde9fad11e130cf93205d23da09ad369 } }); // Paper end this.postDeathDropItems(deathEvent); // Paper -@@ -1971,6 +1978,18 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -1971,6 +1978,19 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin return deathEvent; // Paper } @@ -73,6 +73,7 @@ index 17483ffff6cb2a9e86db7079e7c3a9a800654c62..fde9fad11e130cf93205d23da09ad369 + private void damageTransferToAsync(LivingEntity entity, DamageSource damageSource) { + entity.getBukkitEntity().taskScheduler.schedule((LivingEntity nmsEntity) -> { + try { ++ if (nmsEntity.isRemoved()) return; + nmsEntity.awardKillScore(this, damageSource); + } catch (Throwable ex) { + LOGGER.error(ex.getMessage(), ex); @@ -84,7 +85,7 @@ index 17483ffff6cb2a9e86db7079e7c3a9a800654c62..fde9fad11e130cf93205d23da09ad369 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 +2648,18 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -2629,6 +2649,18 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin } } diff --git a/lophine-server/minecraft-patches/features/0016-Compatibility-fix-for-Raid-Revert-and-Cross-Region-D.patch b/lophine-server/minecraft-patches/features/0016-Compatibility-fix-for-Raid-Revert-and-Cross-Region-D.patch index 1912674..12d7877 100644 --- a/lophine-server/minecraft-patches/features/0016-Compatibility-fix-for-Raid-Revert-and-Cross-Region-D.patch +++ b/lophine-server/minecraft-patches/features/0016-Compatibility-fix-for-Raid-Revert-and-Cross-Region-D.patch @@ -6,10 +6,10 @@ 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 fde9fad11e130cf93205d23da09ad369b35db160..44956582516ac508681d7ca3e4e04e4270859bd8 100644 +index 29919b8f3c05c8ffaf66f86e441778eeefb293b1..1e820f34636f415ef78cdfbed06c6952a3cf1c0b 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java -@@ -1234,6 +1234,29 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -1234,6 +1234,30 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin } } @@ -28,11 +28,12 @@ index fde9fad11e130cf93205d23da09ad369b35db160..44956582516ac508681d7ca3e4e04e42 + if (entity != null) + entity.getBukkitEntity().taskScheduler.schedule((Entity nmsEntity) -> { + try { ++ if (nmsEntity.isRemoved()) return; + addEffect(effectInstance, nmsEntity, cause, fireEvent); + } catch (Throwable ex) { + LOGGER.error(ex.getMessage(), ex); + } -+ }, null, 1L ); ++ }, null, 1L); + } + // Lophine End - raid revert adapt Cross Region Damage trace + diff --git a/lophine-server/minecraft-patches/features/0029-Leaves-Fakeplayer.patch b/lophine-server/minecraft-patches/features/0029-Leaves-Fakeplayer.patch index 04350ca..2fc4379 100644 --- a/lophine-server/minecraft-patches/features/0029-Leaves-Fakeplayer.patch +++ b/lophine-server/minecraft-patches/features/0029-Leaves-Fakeplayer.patch @@ -544,10 +544,10 @@ index b69698f47ccb0f1ac3eeea05a02ab9d798319b44..b073a91fd67d092713c53db6f3df75c6 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 44956582516ac508681d7ca3e4e04e4270859bd8..30f287141689b65ce61fdb22214847d0af1ff44e 100644 +index 1e820f34636f415ef78cdfbed06c6952a3cf1c0b..8a8de7f4d62532709805ebde531dc71ad78fa5c9 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java -@@ -3345,7 +3345,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -3347,7 +3347,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); @@ -556,7 +556,7 @@ index 44956582516ac508681d7ca3e4e04e4270859bd8..30f287141689b65ce61fdb22214847d0 this.setSpeed(this.getRiddenSpeed(controller)); this.travel(riddenInput); } else { -@@ -4268,7 +4268,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -4270,7 +4270,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)); @@ -565,7 +565,7 @@ index 44956582516ac508681d7ca3e4e04e4270859bd8..30f287141689b65ce61fdb22214847d0 this.useItemRemaining = 0; // Paper end - lag compensate eating this.completeUsingItem(); -@@ -4457,6 +4457,23 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -4459,6 +4459,23 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin this.stopUsingItem(); } diff --git a/1todos/server/minecraft-patches/features/0031-Leaves-Replay-Mod-API.patch b/lophine-server/minecraft-patches/features/0030-Leaves-Replay-Mod-API.patch similarity index 55% rename from 1todos/server/minecraft-patches/features/0031-Leaves-Replay-Mod-API.patch rename to lophine-server/minecraft-patches/features/0030-Leaves-Replay-Mod-API.patch index a142aff..6073e36 100644 --- a/1todos/server/minecraft-patches/features/0031-Leaves-Replay-Mod-API.patch +++ b/lophine-server/minecraft-patches/features/0030-Leaves-Replay-Mod-API.patch @@ -10,10 +10,10 @@ 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 f046aca874eb3376696baaad3719a6987afbfe22..268b2c6b981c8164fb829eb8a33beb213fe60bcf 100644 +index 28776f3363810259f8c3bfdfd9f8c0455975be2a..0f562d7403aebf6c0907f2a33f758f4351ef282e 100644 --- a/net/minecraft/commands/CommandSourceStack.java +++ b/net/minecraft/commands/CommandSourceStack.java -@@ -562,7 +562,7 @@ public class CommandSourceStack implements ExecutionCommandSource getOnlinePlayerNames() { @@ -23,80 +23,80 @@ index f046aca874eb3376696baaad3719a6987afbfe22..268b2c6b981c8164fb829eb8a33beb21 @Override diff --git a/net/minecraft/commands/arguments/selector/EntitySelector.java b/net/minecraft/commands/arguments/selector/EntitySelector.java -index af71e0e1eb1c93745f3e4954ecc8fbd2ad4808a3..f3829564681faff3ae8971ed90b947b4a082a636 100644 +index 7e3912b8b29e40eb3347f1451b0fd3ebee2af4f1..0834e402e6af7028e08851378e15390ec6314380 100644 --- a/net/minecraft/commands/arguments/selector/EntitySelector.java +++ b/net/minecraft/commands/arguments/selector/EntitySelector.java -@@ -126,11 +126,12 @@ public class EntitySelector { - return this.findPlayers(source); +@@ -142,11 +142,12 @@ public class EntitySelector { + return this.findPlayers(sender); } else if (this.playerName != null) { - ServerPlayer playerByName = source.getServer().getPlayerList().getPlayerByName(this.playerName); -+ playerByName = playerByName instanceof org.leavesmc.leaves.replay.ServerPhotographer ? null : playerByName; // Leaves - skip photographer - return playerByName == null ? List.of() : List.of(playerByName); + 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) { - for (ServerLevel serverLevel : source.getServer().getAllLevels()) { - Entity entity = serverLevel.getEntity(this.entityUUID); + for (ServerLevel level : sender.getServer().getAllLevels()) { + Entity entity = level.getEntity(this.entityUUID); - if (entity != null) { + if (entity != null && !(entity instanceof org.leavesmc.leaves.replay.ServerPhotographer)) { - if (entity.getType().isEnabled(source.enabledFeatures())) { + if (entity.getType().isEnabled(sender.enabledFeatures())) { return List.of(entity); } -@@ -144,7 +145,7 @@ public class EntitySelector { - AABB absoluteAabb = this.getAbsoluteAabb(vec3); +@@ -160,7 +161,7 @@ public class EntitySelector { + AABB absoluteAabb = this.getAbsoluteAabb(pos); if (this.currentEntity) { - Predicate predicate = this.getPredicate(vec3, absoluteAabb, null); -- return source.getEntity() != null && predicate.test(source.getEntity()) ? List.of(source.getEntity()) : List.of(); -+ return source.getEntity() != null && !(source.getEntity() instanceof org.leavesmc.leaves.replay.ServerPhotographer) && predicate.test(source.getEntity()) ? List.of(source.getEntity()) : List.of(); // Leaves - skip photographer + 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(vec3, absoluteAabb, source.enabledFeatures()); - List list = new ObjectArrayList<>(); -@@ -155,6 +156,7 @@ public class EntitySelector { - this.addEntities(list, serverLevel1, absoluteAabb, predicate); + 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); } } -+ list.removeIf(entity -> entity instanceof org.leavesmc.leaves.replay.ServerPhotographer); // Leaves - skip photographer ++ result.removeIf(entity -> entity instanceof org.leavesmc.leaves.replay.ServerPhotographer); // Leaves - skip photographer - return this.sortAndLimit(vec3, list); + return this.sortAndLimit(pos, result); } -@@ -190,9 +192,11 @@ public class EntitySelector { - this.checkPermissions(source); +@@ -206,9 +208,11 @@ public class EntitySelector { + this.checkPermissions(sender); if (this.playerName != null) { - ServerPlayer playerByName = source.getServer().getPlayerList().getPlayerByName(this.playerName); -+ playerByName = playerByName instanceof org.leavesmc.leaves.replay.ServerPhotographer ? null : playerByName; // Leaves - skip photographer - return playerByName == null ? List.of() : List.of(playerByName); + 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) { - ServerPlayer playerByName = source.getServer().getPlayerList().getPlayer(this.entityUUID); -+ playerByName = playerByName instanceof org.leavesmc.leaves.replay.ServerPhotographer ? null : playerByName; // Leaves - skip photographer - return playerByName == null ? List.of() : List.of(playerByName); + 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 vec3 = this.position.apply(source.getPosition()); -@@ -204,11 +208,11 @@ public class EntitySelector { - int resultLimit = this.getResultLimit(); - List players; + Vec3 pos = this.position.apply(sender.getPosition()); +@@ -220,11 +224,11 @@ public class EntitySelector { + int limit = this.getResultLimit(); + List result; if (this.isWorldLimited()) { -- players = source.getLevel().getPlayers(predicate, resultLimit); -+ players = source.getLevel().getPlayers((player -> !(player instanceof org.leavesmc.leaves.replay.ServerPhotographer) && predicate.test(player)), resultLimit); // Leaves - skip photographer +- 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 { - players = new ObjectArrayList<>(); + result = new ObjectArrayList<>(); -- for (ServerPlayer serverPlayer1 : source.getServer().getPlayerList().getPlayers()) { -+ for (ServerPlayer serverPlayer1 : source.getServer().getPlayerList().realPlayers) { // Leaves - only real players - if (predicate.test(serverPlayer1)) { - players.add(serverPlayer1); - if (players.size() >= resultLimit) { +- 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 385c71d70ed9e5a3ae25fbecaefd6773c467d31d..24f83a6875219aaf4b29e2461afcd0478a391014 100644 +index 86393793dd1b90f033c93c70933e1e4a7546eb15..48f7d57f6d3ef4250e6b3cf42055d29d94d3f6e3 100644 --- a/net/minecraft/server/MinecraftServer.java +++ b/net/minecraft/server/MinecraftServer.java -@@ -1896,7 +1896,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop players = new java.util.ArrayList<>(this.playerList.getPlayers()); // Folia - region threading -+ List players = new java.util.ArrayList<>(this.playerList.realPlayers); // Folia - region threading ++ List players = new java.util.ArrayList<>(this.playerList.realPlayers); // Folia - region threading // Leaves - only real player int maxPlayers = this.getMaxPlayers(); if (this.hidesOnlinePlayers()) { return new ServerStatus.Players(maxPlayers, players.size(), List.of()); -@@ -2111,7 +2111,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop { // Folia - region threading +- 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 = player.setGameMode(gameMode, org.bukkit.event.player.PlayerGameModeChangeEvent.Cause.DEFAULT_GAMEMODE, null); // Folia - region threading -@@ -2500,7 +2500,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop> startTrackingPackets = this.getStartTrackingPackets(objective); +@@ -245,7 +245,7 @@ public class ServerScoreboard extends Scoreboard { + public void startTrackingObjective(final Objective objective) { + List> packets = this.getStartTrackingPackets(objective); -- for (ServerPlayer serverPlayer : this.server.getPlayerList().getPlayers()) { -+ for (ServerPlayer serverPlayer : this.server.getPlayerList().realPlayers) { // Leaves - only real players - if (serverPlayer.getBukkitEntity().getScoreboard().getHandle() != this) continue; // CraftBukkit - Only players on this board - for (Packet packet : startTrackingPackets) { - serverPlayer.connection.send(packet); -@@ -275,7 +275,7 @@ public class ServerScoreboard extends Scoreboard { - public void stopTrackingObjective(Objective objective) { - List> stopTrackingPackets = this.getStopTrackingPackets(objective); +- for (ServerPlayer player : this.server.getPlayerList().getPlayers()) { ++ for (ServerPlayer player : this.server.getPlayerList().realPlayers) { // Leaves - only real players + if (player.getBukkitEntity().getScoreboard().getHandle() != this) continue; // CraftBukkit - Only players on this board + for (Packet packet : packets) { + player.connection.send(packet); +@@ -271,7 +271,7 @@ public class ServerScoreboard extends Scoreboard { + public void stopTrackingObjective(final Objective objective) { + List> packets = this.getStopTrackingPackets(objective); -- for (ServerPlayer serverPlayer : this.server.getPlayerList().getPlayers()) { -+ for (ServerPlayer serverPlayer : this.server.getPlayerList().realPlayers) { // Leaves - only real players - if (serverPlayer.getBukkitEntity().getScoreboard().getHandle() != this) continue; // CraftBukkit - Only players on this board - for (Packet packet : stopTrackingPackets) { - serverPlayer.connection.send(packet); +- for (ServerPlayer player : this.server.getPlayerList().getPlayers()) { ++ for (ServerPlayer player : this.server.getPlayerList().realPlayers) { // Leaves - only real players + if (player.getBukkitEntity().getScoreboard().getHandle() != this) continue; // CraftBukkit - Only players on this board + for (Packet packet : packets) { + player.connection.send(packet); diff --git a/net/minecraft/server/commands/ListPlayersCommand.java b/net/minecraft/server/commands/ListPlayersCommand.java -index e7c778a7f292fd0749cbd5e6586ad1b93ac7f29e..024b56405bb58801b17a6adad7fec7a461d12a5c 100644 +index b850c908a594f839ce124c6bd01762d31cc3aa1e..b2240fd3f5ace03168fd679932675a72c09e81d7 100644 --- a/net/minecraft/server/commands/ListPlayersCommand.java +++ b/net/minecraft/server/commands/ListPlayersCommand.java @@ -33,7 +33,7 @@ public class ListPlayersCommand { - private static int format(CommandSourceStack source, Function nameExtractor) { + private static int format(final CommandSourceStack source, final Function formatter) { PlayerList playerList = source.getServer().getPlayerList(); // CraftBukkit start - List playersTemp = playerList.getPlayers(); @@ -181,28 +181,29 @@ index e7c778a7f292fd0749cbd5e6586ad1b93ac7f29e..024b56405bb58801b17a6adad7fec7a4 org.bukkit.entity.Player sender = (org.bukkit.entity.Player) source.getBukkitSender(); playersTemp = playersTemp.stream().filter((ep) -> sender.canSee(ep.getBukkitEntity())).collect(java.util.stream.Collectors.toList()); diff --git a/net/minecraft/server/commands/OpCommand.java b/net/minecraft/server/commands/OpCommand.java -index 590891d70a71ab30ceae3a3cf1923745e7c20b26..0ede1e5c73a0071e854de70f81ae1fc6a1d6dc59 100644 +index 20cbc0e65fea3fc2d0033259c2f35e158ea81926..6bcd09b8d39333bd5f2c0d7c0a9a91bb52f9314d 100644 --- a/net/minecraft/server/commands/OpCommand.java +++ b/net/minecraft/server/commands/OpCommand.java -@@ -25,7 +25,7 @@ public class OpCommand { - (commandContext, suggestionsBuilder) -> { - PlayerList playerList = commandContext.getSource().getServer().getPlayerList(); +@@ -25,7 +25,8 @@ public class OpCommand { + (c, p) -> { + PlayerList list = c.getSource().getServer().getPlayerList(); return SharedSuggestionProvider.suggest( -- playerList.getPlayers() -+ playerList.realPlayers // Leaves - only real player - .stream() - .filter(serverPlayer -> !playerList.isOp(serverPlayer.nameAndId())) - .map(serverPlayer -> serverPlayer.getGameProfile().name()), +- list.getPlayers().stream().filter(player -> !list.isOp(player.nameAndId())).map(pl -> pl.getGameProfile().name()), p ++ list.realPlayers // Leaves - only real player ++ .stream().filter(player -> !list.isOp(player.nameAndId())).map(pl -> pl.getGameProfile().name()), p + ); + } + ) diff --git a/net/minecraft/server/commands/ParticleCommand.java b/net/minecraft/server/commands/ParticleCommand.java -index b5cb0fd45c1e33f40ff38e86772c9e6cc06c10a0..e9ac6ee47fd9c3d73e55a3467bb1c53f931609d0 100644 +index a14f82a1587e175030d4cd806726456831008dea..563d897a70f402d556cabd3e02131aaf22ff8d1e 100644 --- a/net/minecraft/server/commands/ParticleCommand.java +++ b/net/minecraft/server/commands/ParticleCommand.java @@ -36,7 +36,7 @@ public class ParticleCommand { 0.0F, 0, false, -- commandContext.getSource().getServer().getPlayerList().getPlayers() -+ commandContext.getSource().getServer().getPlayerList().realPlayers // Leaves - only real player +- c.getSource().getServer().getPlayerList().getPlayers() ++ c.getSource().getServer().getPlayerList().realPlayers // Leaves - only real player ) ) .then( @@ -210,136 +211,122 @@ index b5cb0fd45c1e33f40ff38e86772c9e6cc06c10a0..e9ac6ee47fd9c3d73e55a3467bb1c53f 0.0F, 0, false, -- context1.getSource().getServer().getPlayerList().getPlayers() -+ context1.getSource().getServer().getPlayerList().realPlayers // Leaves - only real player +- c.getSource().getServer().getPlayerList().getPlayers() ++ c.getSource().getServer().getPlayerList().realPlayers // Leaves - only real player ) ) .then( @@ -68,7 +68,7 @@ public class ParticleCommand { - FloatArgumentType.getFloat(context1, "speed"), - IntegerArgumentType.getInteger(context1, "count"), + FloatArgumentType.getFloat(c, "speed"), + IntegerArgumentType.getInteger(c, "count"), false, -- context1.getSource().getServer().getPlayerList().getPlayers() -+ context1.getSource().getServer().getPlayerList().realPlayers // Leaves - only real player +- c.getSource().getServer().getPlayerList().getPlayers() ++ c.getSource().getServer().getPlayerList().realPlayers // Leaves - only real player ) ) .then( @@ -82,7 +82,7 @@ public class ParticleCommand { - FloatArgumentType.getFloat(context1, "speed"), - IntegerArgumentType.getInteger(context1, "count"), + FloatArgumentType.getFloat(c, "speed"), + IntegerArgumentType.getInteger(c, "count"), true, -- context1.getSource().getServer().getPlayerList().getPlayers() -+ context1.getSource().getServer().getPlayerList().realPlayers // Leaves - only real player +- c.getSource().getServer().getPlayerList().getPlayers() ++ c.getSource().getServer().getPlayerList().realPlayers // Leaves - only real player ) ) .then( @@ -112,7 +112,7 @@ public class ParticleCommand { - FloatArgumentType.getFloat(context1, "speed"), - IntegerArgumentType.getInteger(context1, "count"), + FloatArgumentType.getFloat(c, "speed"), + IntegerArgumentType.getInteger(c, "count"), false, -- context1.getSource().getServer().getPlayerList().getPlayers() -+ context1.getSource().getServer().getPlayerList().realPlayers // Leaves - only real player +- c.getSource().getServer().getPlayerList().getPlayers() ++ c.getSource().getServer().getPlayerList().realPlayers // Leaves - only real player ) ) .then( diff --git a/net/minecraft/server/commands/TeamMsgCommand.java b/net/minecraft/server/commands/TeamMsgCommand.java -index 0ae4d68dfe42004839a0c5ad457de592f6b4af8b..1d1e396e4b29f33669872fb39e3a7f1d474a49f7 100644 +index d04fd8ab5f8e3c1697af5448c320838a822dbf1f..f46abe413e9b30f219fa1f7fc485de4c8859be90 100644 --- a/net/minecraft/server/commands/TeamMsgCommand.java +++ b/net/minecraft/server/commands/TeamMsgCommand.java @@ -40,7 +40,7 @@ public class TeamMsgCommand { } else { - List list = commandSourceStack.getServer() + List receivers = source.getServer() .getPlayerList() - .getPlayers() + .realPlayers // Leaves - only real players .stream() - .filter(player -> player == entityOrException || player.getTeam() == team) + .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 305273583b3d2ad233c6cd67883baad15fe572eb..ce2939eac9c66e0c6eaac1570c4da19d908662ad 100644 +index 907d1304503a80c6d0fd064bf1aaf4e081e9f85b..e0c1ee55888261bca42bbadec8812da2a36dded8 100644 --- a/net/minecraft/server/commands/WhitelistCommand.java +++ b/net/minecraft/server/commands/WhitelistCommand.java @@ -44,7 +44,7 @@ public class WhitelistCommand { - (commandContext, suggestionsBuilder) -> { - PlayerList playerList = commandContext.getSource().getServer().getPlayerList(); + (c, p) -> { + PlayerList list = c.getSource().getServer().getPlayerList(); return SharedSuggestionProvider.suggest( -- playerList.getPlayers() -+ playerList.realPlayers // Leaves - only real player +- list.getPlayers() ++ list.realPlayers // Leaves - only real player .stream() .map(Player::nameAndId) - .filter(nameAndId -> !playerList.getWhiteList().isWhiteListed(nameAndId)) + .filter(nameAndId -> !list.getWhiteList().isWhiteListed(nameAndId)) diff --git a/net/minecraft/server/gui/PlayerListComponent.java b/net/minecraft/server/gui/PlayerListComponent.java -index 5a8cd3e6b448a4472092690cf589bca10b142126..158593b1a6384db635a1f224919b24c174944b10 100644 +index 37c9f983ae89c497f44a1b7967d741abf909e0a0..d7fb2505f2a86ca0d81f144624ef2e1a4b4bddbb 100644 --- a/net/minecraft/server/gui/PlayerListComponent.java +++ b/net/minecraft/server/gui/PlayerListComponent.java @@ -17,8 +17,8 @@ public class PlayerListComponent extends JList { if (this.tickCount++ % 20 == 0) { - Vector list = new Vector<>(); + Vector players = new Vector<>(); - for (int i = 0; i < this.server.getPlayerList().getPlayers().size(); i++) { -- list.add(this.server.getPlayerList().getPlayers().get(i).getGameProfile().name()); -+ for (int i = 0; i < this.server.getPlayerList().realPlayers.size(); i++) { -+ list.add(this.server.getPlayerList().realPlayers.get(i).getGameProfile().name()); +- players.add(this.server.getPlayerList().getPlayers().get(i).getGameProfile().name()); ++ for (int i = 0; i < this.server.getPlayerList().realPlayers.size(); i++) { // Leaves - only real players ++ players.add(this.server.getPlayerList().realPlayers.get(i).getGameProfile().name()); // Leaves - only real players } - this.setListData(list); + this.setListData(players); diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java -index 88efbe2bcb5621432b67366116150a3dab52e510..9345bdb2770e7c27488c547012020337fc651edc 100644 +index e05705884a285143b8a3ebad00cb489efe47d532..c51b0075cd650085cd991bc89396f605cb520442 100644 --- a/net/minecraft/server/level/ServerLevel.java +++ b/net/minecraft/server/level/ServerLevel.java -@@ -3000,7 +3000,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe - if (entity instanceof ServerPlayer serverPlayer) { - ServerLevel.this.players.add(serverPlayer); +@@ -3100,7 +3100,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet + if (entity instanceof ServerPlayer player) { + ServerLevel.this.players.add(player); // Leaves start - skip -- if (!(serverPlayer instanceof org.leavesmc.leaves.bot.ServerBot)) { -+ if (!(serverPlayer instanceof org.leavesmc.leaves.bot.ServerBot) && !(serverPlayer instanceof org.leavesmc.leaves.replay.ServerPhotographer)) { // and photographer - ServerLevel.this.realPlayers.add(serverPlayer); +- if (!(player instanceof org.leavesmc.leaves.bot.ServerBot)) { ++ if (!(player instanceof org.leavesmc.leaves.bot.ServerBot) && !(player instanceof org.leavesmc.leaves.replay.ServerPhotographer)) { // and photographer + ServerLevel.this.realPlayers.add(player); } // Leaves end - skip -@@ -3086,7 +3086,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe - if (entity instanceof ServerPlayer serverPlayer) { - ServerLevel.this.players.remove(serverPlayer); +@@ -3186,7 +3186,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet + if (entity instanceof ServerPlayer player) { + ServerLevel.this.players.remove(player); // Leaves start - skip -- if (!(serverPlayer instanceof org.leavesmc.leaves.bot.ServerBot)) { -+ if (!(serverPlayer instanceof org.leavesmc.leaves.bot.ServerBot) && !(serverPlayer instanceof org.leavesmc.leaves.replay.ServerPhotographer)) { // and photographer - ServerLevel.this.realPlayers.remove(serverPlayer); +- if (!(player instanceof org.leavesmc.leaves.bot.ServerBot)) { ++ if (!(player instanceof org.leavesmc.leaves.bot.ServerBot) && !(player instanceof org.leavesmc.leaves.replay.ServerPhotographer)) { // and photographer + ServerLevel.this.realPlayers.remove(player); } // Leaves end - skip -diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java -index 8c1e6837b0328c66fdda322c3c7ceba31c4f017f..ca751564d9189e873d4a53be9a2c68b2a04a8624 100644 ---- a/net/minecraft/server/level/ServerPlayer.java -+++ b/net/minecraft/server/level/ServerPlayer.java -@@ -202,7 +202,7 @@ import org.jspecify.annotations.Nullable; - import org.slf4j.Logger; - - public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patches.chunk_system.player.ChunkSystemServerPlayer { // Paper - rewrite chunk system -- private static final Logger LOGGER = LogUtils.getLogger(); -+ protected static final Logger LOGGER = LogUtils.getLogger(); - public static final long LAST_SAVE_ABSENT = Long.MIN_VALUE; public long lastSave = LAST_SAVE_ABSENT; // Paper // Folia - threaded regions - changed to nanoTime - private static final int NEUTRAL_MOB_DEATH_NOTIFICATION_RADII_XZ = 32; - private static final int NEUTRAL_MOB_DEATH_NOTIFICATION_RADII_Y = 10; -@@ -669,7 +669,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc - // Paper start - Expand PlayerGameModeChangeEvent - this.loadGameTypes(input); - } -- private void loadGameTypes(ValueInput input) { -+ public void loadGameTypes(ValueInput input) { // Lophine - private -> 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 36cd1a0307ff1a734eb5f4f3cc013781692e7ad8..0c3e6c1f70289c63bfe424a49374602f25ff5c0b 100644 +index 4edc952087c3255ca488b140402621bbf6495770..a39480a7cd19074daf93accb1f9e7c41e33e775c 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java -@@ -130,6 +130,7 @@ public abstract class PlayerList { +@@ -132,6 +132,7 @@ public abstract class PlayerList { private int simulationDistance; private boolean allowCommandsForAllPlayers; private int sendAllPlayerInfoIn; -+ public final List realPlayers = new java.util.concurrent.CopyOnWriteArrayList(); // Leaves - replay api ++ public final List realPlayers = new java.util.concurrent.CopyOnWriteArrayList<>(); // Leaves - replay api // CraftBukkit start private org.bukkit.craftbukkit.CraftServer cserver; -@@ -218,6 +219,123 @@ public abstract class PlayerList { +@@ -193,6 +194,7 @@ public abstract class PlayerList { + + private boolean countConnection(Connection conn, int limit) { + synchronized (this.connectionsStateLock) { ++ if (conn instanceof org.leavesmc.leaves.bot.ServerBotPacketListenerImpl.BotConnection) return true; + int count = this.usersCountedAgainstLimit.size(); + if (count >= limit) { + return false; +@@ -223,6 +225,124 @@ public abstract class PlayerList { abstract public void loadAndSaveFiles(); // Paper - fix converting txt to json file; moved from DedicatedPlayerList constructor @@ -352,18 +339,17 @@ index 36cd1a0307ff1a734eb5f4f3cc013781692e7ad8..0c3e6c1f70289c63bfe424a49374602f + + player.setServerLevel(worldserver1); + player.spawnIn(worldserver1); -+ player.gameMode.setLevel((ServerLevel) player.level()); ++ player.gameMode.setLevel(player.level()); + + LevelData worlddata = worldserver1.getLevelData(); + -+ //player.loadGameTypes(null); // simply fix for https://github.com/MC-XiaoHei/ISeeYou/issues/70 + 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(), worldserver1.getWorld().getSendViewDistance(), worldserver1.getWorld().getSimulationDistance(), flag1, !flag, flag2, player.createCommonSpawnInfo(worldserver1), this.server.enforceSecureProfile())); // Paper - replace old player chunk management ++ 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.getBukkitEntity().sendSupportedChannels(); // CraftBukkit + playerconnection.send(new ClientboundChangeDifficultyPacket(worlddata.getDifficulty(), worlddata.isDifficultyLocked())); + playerconnection.send(new ClientboundPlayerAbilitiesPacket(player.getAbilities())); @@ -389,7 +375,6 @@ index 36cd1a0307ff1a734eb5f4f3cc013781692e7ad8..0c3e6c1f70289c63bfe424a49374602f + this.playersByUUID.put(player.getUUID(), player); + + player.suppressTrackerForLogin = true; -+ worldserver1.getCurrentWorldData().connections.add(player.connection.connection); + worldserver1.addNewPlayer(player); + this.server.getCustomBossEvents().onPlayerConnect(player); + org.bukkit.craftbukkit.entity.CraftPlayer bukkitPlayer = player.getBukkitEntity(); @@ -402,7 +387,7 @@ index 36cd1a0307ff1a734eb5f4f3cc013781692e7ad8..0c3e6c1f70289c63bfe424a49374602f + // org.leavesmc.leaves.protocol.core.LeavesProtocolManager.handlePlayerJoin(player); // Leaves - protocol + + // Leaves start - bot support -+ if (fun.bm.lophine.config.modules.function.FakeplayerConfig.enable) { ++ if (FakeplayerConfig.enable) { + 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); @@ -415,19 +400,20 @@ index 36cd1a0307ff1a734eb5f4f3cc013781692e7ad8..0c3e6c1f70289c63bfe424a49374602f + // Leaves end - bot support + + final List onlinePlayers = Lists.newArrayListWithExpectedSize(this.players.size() - 1); -+ final List playerList = List.copyOf(this.players); // Lophine - copy to avoid ConcurrentModificationException -+ for (ServerPlayer serverPlayer : playerList) { -+ if (serverPlayer == player || !bukkitPlayer.canSee(serverPlayer.getBukkitEntity())) { ++ for (int i = 0; i < this.players.size(); ++i) { ++ ServerPlayer entityplayer1 = this.players.get(i); ++ ++ if (entityplayer1 == player || !bukkitPlayer.canSee(entityplayer1.getBukkitEntity())) { + continue; + } + + // Leaves start - skip photographer -+ if (serverPlayer instanceof org.leavesmc.leaves.replay.ServerPhotographer) { ++ if (entityplayer1 instanceof org.leavesmc.leaves.replay.ServerPhotographer) { + continue; + } + // Leaves end - skip photographer + -+ onlinePlayers.add(serverPlayer); ++ onlinePlayers.add(entityplayer1); + } + if (!onlinePlayers.isEmpty()) { + player.connection.send(ClientboundPlayerInfoUpdatePacket.createPlayerInitializing(onlinePlayers, player)); @@ -435,7 +421,7 @@ index 36cd1a0307ff1a734eb5f4f3cc013781692e7ad8..0c3e6c1f70289c63bfe424a49374602f + + player.sentListPacket = true; + player.suppressTrackerForLogin = false; -+ player.level().getChunkSource().chunkMap.addEntity(player); ++ ((ServerLevel)player.level()).getChunkSource().chunkMap.addEntity(player); + + this.sendLevelInfo(player, worldserver1); + @@ -445,7 +431,9 @@ index 36cd1a0307ff1a734eb5f4f3cc013781692e7ad8..0c3e6c1f70289c63bfe424a49374602f + } + + worldserver1 = player.level(); -+ for (MobEffectInstance mobeffect : player.getActiveEffects()) { ++ java.util.Iterator iterator = player.getActiveEffects().iterator(); ++ while (iterator.hasNext()) { ++ MobEffectInstance mobeffect = iterator.next(); + playerconnection.send(new ClientboundUpdateMobEffectPacket(player.getId(), mobeffect, false)); + } + @@ -460,10 +448,10 @@ index 36cd1a0307ff1a734eb5f4f3cc013781692e7ad8..0c3e6c1f70289c63bfe424a49374602f + } + // Leaves end - replay mod api + - public void placeNewPlayer(Connection connection, ServerPlayer player, CommonListenerCookie cookie) { + public void placeNewPlayer(final Connection connection, final ServerPlayer player, final CommonListenerCookie cookie) { player.isRealPlayer = true; // Paper player.loginTime = System.currentTimeMillis(); // Paper - Replace OfflinePlayer#getLastPlayed -@@ -292,6 +410,7 @@ public abstract class PlayerList { +@@ -296,6 +416,7 @@ public abstract class PlayerList { // player.connection.send(ClientboundPlayerInfoUpdatePacket.createPlayerInitializing(this.players)); // CraftBukkit - replaced with loop below this.players.add(player); @@ -471,15 +459,15 @@ index 36cd1a0307ff1a734eb5f4f3cc013781692e7ad8..0c3e6c1f70289c63bfe424a49374602f 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 -@@ -507,6 +626,7 @@ public abstract class PlayerList { +@@ -515,6 +636,7 @@ public abstract class PlayerList { } - protected void save(ServerPlayer player) { + protected void save(final ServerPlayer player) { + if (player instanceof org.leavesmc.leaves.replay.ServerPhotographer) return; // Leaves - skip photographer if (!player.getBukkitEntity().isPersistent()) return; // CraftBukkit player.lastSave = System.nanoTime(); // Folia - region threading - changed to nanoTime tracking this.playerIo.save(player); -@@ -521,6 +641,44 @@ public abstract class PlayerList { +@@ -529,6 +651,47 @@ public abstract class PlayerList { } } @@ -503,12 +491,15 @@ index 36cd1a0307ff1a734eb5f4f3cc013781692e7ad8..0c3e6c1f70289c63bfe424a49374602f + } + } + -+ worldserver.getCurrentWorldData().connections.remove(entityplayer.connection.connection); + worldserver.removePlayerImmediately(entityplayer, Entity.RemovalReason.UNLOADED_WITH_PLAYER); + entityplayer.retireScheduler(); + entityplayer.getAdvancements().stopListening(); + this.players.remove(entityplayer); -+ this.playersByName.remove(entityplayer.getScoreboardName().toLowerCase(java.util.Locale.ROOT)); ++ // 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); ++ if (this.playersByName.get(nameKey) == entityplayer) { ++ this.playersByName.remove(nameKey); ++ } + this.server.getCustomBossEvents().onPlayerDisconnect(entityplayer); + UUID uuid = entityplayer.getUUID(); + ServerPlayer entityplayer1 = this.playersByUUID.get(uuid); @@ -519,12 +510,12 @@ index 36cd1a0307ff1a734eb5f4f3cc013781692e7ad8..0c3e6c1f70289c63bfe424a49374602f + + this.cserver.getScoreboardManager().removePlayer(entityplayer.getBukkitEntity()); + } -+ // Leaves stop - replay mod api ++ // Leaves end - replay mod api + - public net.kyori.adventure.text.@Nullable Component remove(ServerPlayer player) { // CraftBukkit - return string // Paper - return Component + 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()))); -@@ -595,6 +753,7 @@ public abstract class PlayerList { +@@ -602,6 +765,7 @@ public abstract class PlayerList { player.getBukkitEntity().packetProcessor.close(); // Folia - region threading player.getAdvancements().stopListening(); this.players.remove(player); @@ -532,31 +523,33 @@ index 36cd1a0307ff1a734eb5f4f3cc013781692e7ad8..0c3e6c1f70289c63bfe424a49374602f this.playersByName.remove(player.getScoreboardName().toLowerCase(java.util.Locale.ROOT)); // Spigot this.server.getCustomBossEvents().onPlayerDisconnect(player); UUID uuid = player.getUUID(); -@@ -910,15 +1069,15 @@ public abstract class PlayerList { +@@ -912,15 +1076,15 @@ public abstract class PlayerList { } public String[] getPlayerNamesArray() { - List players = new java.util.ArrayList<>(this.players); // Folia - region threading -- String[] strings = new String[this.players.size() + this.server.getBotList().bots.size()]; // Leaves - fakeplayer support -+ List players = new java.util.ArrayList<>(this.realPlayers); // Folia - region threading -+ String[] strings = new String[players.size() + this.server.getBotList().bots.size()]; // Leaves - fakeplayer support, and skip photographer +- String[] names = new String[players.size() + this.server.getBotList().bots.size()]; // Leaves - fakeplayer support ++ List players = new java.util.ArrayList<>(this.realPlayers); // Folia - region threading // Lophine - fakeplayer support ++ String[] names = new String[this.realPlayers.size() + this.server.getBotList().bots.size()]; // Leaves - fakeplayer support - for (int i = 0; i < players.size(); i++) { // Folia - region threading - strings[i] = players.get(i).getGameProfile().name(); // Folia - region threading +- for (int i = 0; i < players.size(); i++) { // Folia - region threading +- names[i] = players.get(i).getGameProfile().name(); // Folia - region threading ++ for (int i = 0; i < this.realPlayers.size(); i++) { // Folia - region threading // Leaves - only real players ++ names[i] = this.realPlayers.get(i).getGameProfile().name(); // Folia - region threading // Leaves - only real players } // Leaves start - fakeplayer support -- for (int i = this.players.size(); i < strings.length; ++i) { -- strings[i] = this.server.getBotList().bots.get(i - this.players.size()).getGameProfile().name(); -+ for (int i = players.size(); i < strings.length; ++i) { // Leaves - only real players -+ strings[i] = this.server.getBotList().bots.get(i - players.size()).getGameProfile().name(); // Leaves - only real players +- for (int i = this.players.size(); i < names.length; ++i) { +- names[i] = this.server.getBotList().bots.get(i - this.players.size()).gameProfile.name(); ++ for (int i = this.realPlayers.size(); i < names.length; ++i) { // Leaves - only real players ++ names[i] = this.server.getBotList().bots.get(i - this.realPlayers.size()).gameProfile.name(); // Leaves - only real players } // Leaves end - fakeplayer support diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java -index c0ebd700caa950948c58846eaf164afc14f87f09..e4ae4354e81f34f0db410333fc9b8e17383a5f41 100644 +index 8a8de7f4d62532709805ebde531dc71ad78fa5c9..167855ad90d0c168a6d49f078ee3409ab84d4bf3 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java -@@ -262,7 +262,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -261,7 +261,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin public int useItemRemaining; protected int fallFlyTicks; private long lastKineticHitFeedbackTime = -2147483648L; diff --git a/1todos/server/minecraft-patches/features/0043-Leaves-Creative-fly-no-clip.patch b/lophine-server/minecraft-patches/features/0031-Leaves-Creative-fly-no-clip.patch similarity index 66% rename from 1todos/server/minecraft-patches/features/0043-Leaves-Creative-fly-no-clip.patch rename to lophine-server/minecraft-patches/features/0031-Leaves-Creative-fly-no-clip.patch index abb40f7..adcdab1 100644 --- a/1todos/server/minecraft-patches/features/0043-Leaves-Creative-fly-no-clip.patch +++ b/lophine-server/minecraft-patches/features/0031-Leaves-Creative-fly-no-clip.patch @@ -8,7 +8,7 @@ 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 f2ec0bd8cca3c08d558790537e17a8a2f95f1953..29d904b02a2c7b3d25261ca26c7c0479b00999ef 100644 +index e302c6198d71782b524391329aa5c89d2b3e0ccf..2312803297321f66c9057bc54ce56dd17ecb6f1f 100644 --- a/net/minecraft/world/entity/ExperienceOrb.java +++ b/net/minecraft/world/entity/ExperienceOrb.java @@ -199,7 +199,7 @@ public class ExperienceOrb extends Entity { @@ -21,10 +21,10 @@ index f2ec0bd8cca3c08d558790537e17a8a2f95f1953..29d904b02a2c7b3d25261ca26c7c0479 } else { this.followingPlayer = null; diff --git a/net/minecraft/world/entity/player/Player.java b/net/minecraft/world/entity/player/Player.java -index 29ca31b05ec5636243b13fee8b3399d5e21808b4..8966953ee80a1527c9c4cc4d0a7a3bdb2197a2da 100644 +index 38689fa466a20c64f9916ee32a57a9fdb58d9403..7d514537ee38f9b9366692bc969ff503d883aa16 100644 --- a/net/minecraft/world/entity/player/Player.java +++ b/net/minecraft/world/entity/player/Player.java -@@ -285,8 +285,8 @@ public abstract class Player extends Avatar implements ContainerUser { +@@ -279,8 +279,8 @@ public abstract class Player extends Avatar implements ContainerUser { if (this.cullTask != null) this.cullTask.requestCullSignal(); // Luminol - Ray tracing entity tracker // Luminol end @@ -35,25 +35,25 @@ index 29ca31b05ec5636243b13fee8b3399d5e21808b4..8966953ee80a1527c9c4cc4d0a7a3bdb this.setOnGround(false); } -@@ -415,7 +415,7 @@ public abstract class Player extends Avatar implements ContainerUser { +@@ -406,7 +406,7 @@ public abstract class Player extends Avatar implements ContainerUser { if (this.canPlayerFitWithinBlocksAndEntitiesWhen(Pose.SWIMMING)) { Pose desiredPose = this.getDesiredPose(); - Pose pose; + Pose actualPose; - if (this.isSpectator() || this.isPassenger() || this.canPlayerFitWithinBlocksAndEntitiesWhen(desiredPose)) { + if (this.isCreativeFlyOrSpectator() || this.isPassenger() || this.canPlayerFitWithinBlocksAndEntitiesWhen(desiredPose)) { // Leaves - creative no clip - pose = desiredPose; + actualPose = desiredPose; } else if (this.canPlayerFitWithinBlocksAndEntitiesWhen(Pose.CROUCHING)) { - pose = Pose.CROUCHING; -@@ -544,7 +544,7 @@ public abstract class Player extends Avatar implements ContainerUser { + actualPose = Pose.CROUCHING; +@@ -535,7 +535,7 @@ public abstract class Player extends Avatar implements ContainerUser { this.updateSwingTime(); this.yHeadRot = this.getYRot(); this.setSpeed((float)this.getAttributeValue(Attributes.MOVEMENT_SPEED)); - if (this.getHealth() > 0.0F && !this.isSpectator()) { + if (this.getHealth() > 0.0F && !this.isCreativeFlyOrSpectator()) { // Leaves - creative no clip - AABB aabb; + AABB pickupArea; if (this.isPassenger() && !this.getVehicle().isRemoved()) { - aabb = this.getBoundingBox().minmax(this.getVehicle().getBoundingBox()).inflate(1.0, 0.0, 1.0); -@@ -1877,9 +1877,29 @@ public abstract class Player extends Avatar implements ContainerUser { + pickupArea = this.getBoundingBox().minmax(this.getVehicle().getBoundingBox()).inflate(1.0, 0.0, 1.0); +@@ -1846,6 +1846,26 @@ public abstract class Player extends Avatar implements ContainerUser { return this.gameMode() == GameType.SPECTATOR; } @@ -62,7 +62,7 @@ index 29ca31b05ec5636243b13fee8b3399d5e21808b4..8966953ee80a1527c9c4cc4d0a7a3bdb + return isSpectator() || (fun.bm.lophine.config.modules.function.CreativeFlyNoClipConfig.enabled && isCreative() && getAbilities().flying); + } + -+ public boolean canSpectatingPlace(net.minecraft.world.level.LevelReader world, BlockState state, BlockPos pos, net.minecraft.world.phys.shapes.CollisionContext context) { ++ public boolean canSpectatingPlace(final net.minecraft.world.level.LevelReader world, final BlockState state, final BlockPos pos, final net.minecraft.world.phys.shapes.CollisionContext context) { + if (this.isCreativeFlyOrSpectator()) { + net.minecraft.world.phys.shapes.VoxelShape voxelShape = state.getCollisionShape(world, pos, context); + return voxelShape.isEmpty() || world.isUnobstructed(this, voxelShape.move(pos.getX(), pos.getY(), pos.getZ())); @@ -72,52 +72,48 @@ index 29ca31b05ec5636243b13fee8b3399d5e21808b4..8966953ee80a1527c9c4cc4d0a7a3bdb + } + + @Override -+ public boolean isCollidable(boolean ignoreClimbing) { ++ public boolean isCollidable(final boolean ignoreClimbing) { + return !isCreativeFlyOrSpectator() && super.isCollidable(ignoreClimbing); + } + // Leaves end - creative no clip + @Override - public boolean canBeHitByProjectile() { -- return !this.isSpectator() && super.canBeHitByProjectile(); -+ return !this.isCreativeFlyOrSpectator() && super.canBeHitByProjectile(); // Leaves - creative no clip - } - - @Override + 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 4bb36d2965785fadf628a9bfac4fa2aa305aaf65..44786e4f77285f1fbd4643f560105e410035afeb 100644 +index 2e2a8af12f249ec5bd0935fd13f5acbd0a777b5f..06160c24f1ffbe1445284bc81598cabb3ad20477 100644 --- a/net/minecraft/world/item/BlockItem.java +++ b/net/minecraft/world/item/BlockItem.java -@@ -170,8 +170,9 @@ public class BlockItem extends Item { - protected boolean canPlace(BlockPlaceContext context, BlockState state) { +@@ -158,8 +158,9 @@ public class BlockItem extends Item { Player player = context.getPlayer(); // CraftBukkit start -+ CollisionContext collisionContext = player == null ? CollisionContext.empty() : CollisionContext.placementContext(player); Level world = context.getLevel(); // Paper - Cancel hit for vanished players -- boolean canBuild = (!this.mustSurvive() || state.canSurvive(world, context.getClickedPos())) && world.checkEntityCollision(state, player, CollisionContext.placementContext(player), context.getClickedPos(), true); // Paper - Cancel hit for vanished players -+ boolean canBuild = (!this.mustSurvive() || state.canSurvive(world, context.getClickedPos())) && ((fun.bm.lophine.config.modules.function.CreativeFlyNoClipConfig.enabled && context.getPlayer() != null) ? context.getPlayer().canSpectatingPlace(world, state, context.getClickedPos(), collisionContext) : world.checkEntityCollision(state, player, collisionContext, context.getClickedPos(), true)); // Paper - Cancel hit for vanished players // Leaves - creative no clip ++ CollisionContext collisionContext = player == null ? CollisionContext.empty() : CollisionContext.placementContext(player); // Leaves - creative no clip + boolean canBuild = (!this.mustSurvive() || stateForPlacement.canSurvive(world, context.getClickedPos())) +- && world.checkEntityCollision(stateForPlacement, player, CollisionContext.placementContext(player), context.getClickedPos(), true); // Paper - Cancel hit for vanished players ++ && ((fun.bm.lophine.config.modules.function.CreativeFlyNoClipConfig.enabled && context.getPlayer() != null) ? context.getPlayer().canSpectatingPlace(world, stateForPlacement, context.getClickedPos(), collisionContext) : world.checkEntityCollision(stateForPlacement, player, collisionContext, context.getClickedPos(), true)); // Paper - Cancel hit for vanished players // Leaves - creative no clip org.bukkit.entity.Player bukkitPlayer = (context.getPlayer() instanceof ServerPlayer) ? (org.bukkit.entity.Player) context.getPlayer().getBukkitEntity() : null; 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 be685383b8e7c8111e976fc560f16d43d6545a34..6a2219b45eae0ff6fc48de9a6e6cabf2ec60cb07 100644 +index cb0a4a9865df69e5504a86de6c144bc4450bd19a..a40a98bb48bb14c49670ba55d2a2e8d7e9d0d178 100644 --- a/net/minecraft/world/item/StandingAndWallBlockItem.java +++ b/net/minecraft/world/item/StandingAndWallBlockItem.java @@ -44,7 +44,7 @@ public class StandingAndWallBlockItem extends BlockItem { - // return blockState != null && level.isUnobstructed(blockState, clickedPos, CollisionContext.empty()) ? blockState : null; + // return stateForPlacement != null && level.isUnobstructed(stateForPlacement, pos, CollisionContext.empty()) ? stateForPlacement : null; // CraftBukkit start - if (blockState != null) { -- boolean defaultReturn = level.isUnobstructed(blockState, clickedPos, CollisionContext.empty()); -+ boolean defaultReturn = (fun.bm.lophine.config.modules.function.CreativeFlyNoClipConfig.enabled && context.getPlayer() != null) ? context.getPlayer().canSpectatingPlace(level, blockState, clickedPos, CollisionContext.empty()) : level.isUnobstructed(blockState, clickedPos, CollisionContext.empty()); // Leaves - creative no clip + if (stateForPlacement != null) { +- boolean defaultReturn = level.isUnobstructed(stateForPlacement, pos, CollisionContext.empty()); ++ boolean defaultReturn = (fun.bm.lophine.config.modules.function.CreativeFlyNoClipConfig.enabled && context.getPlayer() != null) ? context.getPlayer().canSpectatingPlace(level, stateForPlacement, pos, CollisionContext.empty()) : level.isUnobstructed(stateForPlacement, pos, CollisionContext.empty()); // Leaves - creative no clip org.bukkit.entity.Player player = (context.getPlayer() instanceof net.minecraft.server.level.ServerPlayer serverPlayer) ? serverPlayer.getBukkitEntity() : null; - org.bukkit.event.block.BlockCanBuildEvent event = new org.bukkit.event.block.BlockCanBuildEvent(org.bukkit.craftbukkit.block.CraftBlock.at(context.getLevel(), clickedPos), player, org.bukkit.craftbukkit.block.data.CraftBlockData.fromData(blockState), defaultReturn, org.bukkit.craftbukkit.CraftEquipmentSlot.getHand(context.getHand())); // Paper - Expose hand in BlockCanBuildEvent + 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 17110035f4b0f144c29b8ff8bf7d0d39efc8103a..1b7f0bfa66e632678164ac64e03855e75bab1305 100644 +index 6205f52ecad24f80d21b924945c5ff06c6704aca..d84159df4d2a0379ffbb6bdb0807b4a02dbec71e 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 - List entities = level.getEntities(null, progressDeltaAabb); + List entities = level.getEntities(null, aabb); if (!entities.isEmpty()) { for (Entity entity : entities) { - if (entity.getPistonPushReaction() != PushReaction.IGNORE) { @@ -126,23 +122,23 @@ index 17110035f4b0f144c29b8ff8bf7d0d39efc8103a..1b7f0bfa66e632678164ac64e03855e7 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 1d60054146f970ec24054d2c76a27e2d8620ec67..a5469971734a3f4f08d676426821fbf059c526dc 100644 +index 2ecb10fe97d15954e44c61247eabc8818eb16f34..22663ad55f669081b43644ad2cf1bd4aac48b745 100644 --- a/net/minecraft/world/level/block/piston/PistonMovingBlockEntity.java +++ b/net/minecraft/world/level/block/piston/PistonMovingBlockEntity.java -@@ -161,7 +161,7 @@ public class PistonMovingBlockEntity extends BlockEntity { - d3 = movementDirection.getStepZ(); +@@ -168,7 +168,7 @@ public class PistonMovingBlockEntity extends BlockEntity { + dz = movement.getStepZ(); } -- entity.setDeltaMovement(d1, d2, d3); -+ if (!(entity instanceof net.minecraft.world.entity.player.Player player) || !player.isCreativeFlyOrSpectator()) entity.setDeltaMovement(d1, d2, d3); // Leaves - creative no clip +- entity.setDeltaMovement(dx, dy, dz); ++ if (!(entity instanceof net.minecraft.world.entity.player.Player player) || !player.isCreativeFlyOrSpectator()) entity.setDeltaMovement(dx, dy, dz); // Leaves - creative no clip // Paper - EAR items stuck in slime pushed by a piston entity.activatedTick = Math.max(entity.activatedTick, io.papermc.paper.threadedregions.RegionizedServer.getCurrentTick() + 10); // Folia - region threading entity.activatedImmunityTick = Math.max(entity.activatedImmunityTick, io.papermc.paper.threadedregions.RegionizedServer.getCurrentTick() + 10); // Folia - region threading -@@ -197,6 +197,7 @@ public class PistonMovingBlockEntity extends BlockEntity { +@@ -204,6 +204,7 @@ public class PistonMovingBlockEntity extends BlockEntity { } - private static void moveEntityByPiston(Direction noClipDirection, Entity entity, double progress, Direction direction) { + private static void moveEntityByPiston(final Direction pistonDirection, final Entity entity, final double delta, final Direction movement) { + if (entity instanceof net.minecraft.world.entity.player.Player player && player.isCreativeFlyOrSpectator()) return; // Leaves - creative no clip - NOCLIP.set(noClipDirection); - Vec3 vec3 = entity.position(); - entity.move(MoverType.PISTON, new Vec3(progress * direction.getStepX(), progress * direction.getStepY(), progress * direction.getStepZ())); + NOCLIP.set(pistonDirection); + Vec3 previousPos = entity.position(); + entity.move(MoverType.PISTON, new Vec3(delta * movement.getStepX(), delta * movement.getStepY(), delta * movement.getStepZ())); diff --git a/1todos/server/minecraft-patches/features/0029-Leaves-Wool-Hopper-Counter.patch b/lophine-server/minecraft-patches/features/0032-Leaves-Wool-Hopper-Counter.patch similarity index 72% rename from 1todos/server/minecraft-patches/features/0029-Leaves-Wool-Hopper-Counter.patch rename to lophine-server/minecraft-patches/features/0032-Leaves-Wool-Hopper-Counter.patch index d1cba13..c1696b2 100644 --- a/1todos/server/minecraft-patches/features/0029-Leaves-Wool-Hopper-Counter.patch +++ b/lophine-server/minecraft-patches/features/0032-Leaves-Wool-Hopper-Counter.patch @@ -10,20 +10,20 @@ 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 6cdb59762b5b223a220d420ff99fa9eadc64f3e0..fe93f0d6b2b7e8503da068179f5d7667634c7ff3 100644 +index d036018ee64995ee754296014888ee70c0ea5ab3..aa782c6441cdce3eb39aefb28d40f3b1970d4e62 100644 --- a/net/minecraft/world/level/block/entity/HopperBlockEntity.java +++ b/net/minecraft/world/level/block/entity/HopperBlockEntity.java -@@ -229,8 +229,30 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen - flag |= validator.getAsBoolean(); // Paper - note: this is not a validator, it's what adds/sucks in items +@@ -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 } + // 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, blockEntity.getBlockPos().relative(state.getValue(HopperBlock.FACING))); ++ 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++) { -+ flag |= suckInItems(level, blockEntity); -+ if (!flag) { ++ changed |= suckInItems(level, entity); ++ if (!changed) { + break; + } else { + woolHopperCounter(level, pos, state, HopperBlockEntity.getContainerAt(level, pos)); @@ -33,32 +33,32 @@ index 6cdb59762b5b223a220d420ff99fa9eadc64f3e0..fe93f0d6b2b7e8503da068179f5d7667 + } + // Leaves end - Wool hopper counter + - if (flag) { - blockEntity.setCooldown(level.spigotConfig.hopperTransfer); // Spigot + 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))) { -+ blockEntity.setCooldown(0); ++ 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 -@@ -462,6 +484,13 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen +@@ -491,6 +513,13 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen // Paper end - Perf: Optimize Hoppers - private static boolean ejectItems(Level level, BlockPos pos, HopperBlockEntity blockEntity) { + private static boolean ejectItems(final Level level, final BlockPos blockPos, final HopperBlockEntity self) { + // Leaves start - hopper counter + if (org.leavesmc.leaves.util.HopperCounter.isEnabled()) { -+ if (woolHopperCounter(level, pos, level.getBlockState(pos), HopperBlockEntity.getContainerAt(level, pos))) { ++ if (woolHopperCounter(level, blockPos, level.getBlockState(blockPos), HopperBlockEntity.getContainerAt(level, blockPos))) { + return true; + } + } + // Leaves end - hopper counter - Container attachedContainer = me.earthme.luminol.config.modules.optimizations.LeavesSleepingBlockEntityConfig.enabled ? blockEntity.getInsertInventory(level) : getAttachedContainer(level, pos, blockEntity); // Leaves - Lithium Sleeping Block Entity - if (attachedContainer == null) { + Container container = me.earthme.luminol.config.modules.optimizations.LeavesSleepingBlockEntityConfig.enabled ? self.getInsertInventory(level) : getAttachedContainer(level, blockPos, self); // Leaves - Lithium Sleeping Block Entity + if (container == null) { return false; -@@ -537,6 +566,26 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen +@@ -512,6 +541,26 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen } } @@ -82,14 +82,14 @@ index 6cdb59762b5b223a220d420ff99fa9eadc64f3e0..fe93f0d6b2b7e8503da068179f5d7667 + } + // Leaves end - hopper counter + - private static int[] getSlots(Container container, Direction direction) { + private static int[] getSlots(final Container container, final Direction direction) { if (container instanceof WorldlyContainer worldlyContainer) { return worldlyContainer.getSlotsForFace(direction); -@@ -681,6 +730,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen +@@ -606,6 +655,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen } - public static boolean addItem(Container container, ItemEntity item) { -+ if (fun.bm.lophine.config.modules.function.WoolHopperCounterConfig.unlimitedSpeed && org.leavesmc.leaves.util.HopperCounter.isEnabled() && item.isRemoved()) return false; // Leaves - Wool hopper counter - boolean flag = false; + public static boolean addItem(final Container container, final ItemEntity entity) { ++ if (fun.bm.lophine.config.modules.function.WoolHopperCounterConfig.unlimitedSpeed && org.leavesmc.leaves.util.HopperCounter.isEnabled() && entity.isRemoved()) return false; // Leaves - Wool hopper counter + boolean changed = false; // CraftBukkit start if (org.bukkit.event.inventory.InventoryPickupItemEvent.getHandlerList().getRegisteredListeners().length > 0) { // Paper - optimize hoppers diff --git a/1todos/server/paper-patches/features/0007-Leaves-Replay-Mod-API.patch b/lophine-server/paper-patches/features/0007-Leaves-Replay-Mod-API.patch similarity index 90% rename from 1todos/server/paper-patches/features/0007-Leaves-Replay-Mod-API.patch rename to lophine-server/paper-patches/features/0007-Leaves-Replay-Mod-API.patch index ee146c1..f0b2c37 100644 --- a/1todos/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 e1f456b31ffda9370b63e51f343847d6f9f62263..8a0f85241cc1530aacccc8b6ea24b9de } // 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 973f064fc5e089dc892d4b4077a807517fd199b5..06766a9058595aeee25e8fd3e3d01aeec2a55116 100644 +index 054d9f4a09035771a329d6d561249d206b5dbee3..8fc75ef37f273433fb11cc1e0beee87484c3e18f 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -306,6 +306,7 @@ public final class CraftServer implements Server { +@@ -304,6 +304,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,7 +32,7 @@ index 973f064fc5e089dc892d4b4077a807517fd199b5..06766a9058595aeee25e8fd3e3d01aee // 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 -@@ -400,7 +401,7 @@ public final class CraftServer implements Server { +@@ -398,7 +399,7 @@ public final class CraftServer implements Server { public CraftServer(DedicatedServer console, PlayerList playerList) { this.console = console; this.playerList = (DedicatedPlayerList) playerList; @@ -41,7 +41,7 @@ index 973f064fc5e089dc892d4b4077a807517fd199b5..06766a9058595aeee25e8fd3e3d01aee @Override public CraftPlayer apply(ServerPlayer player) { return player.getBukkitEntity(); -@@ -3114,4 +3115,11 @@ public final class CraftServer implements Server { +@@ -3128,4 +3129,11 @@ public final class CraftServer implements Server { } } // Folia end - region TPS API @@ -54,7 +54,7 @@ index 973f064fc5e089dc892d4b4077a807517fd199b5..06766a9058595aeee25e8fd3e3d01aee + // 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 6867064de52d810f1fd3869463ae27868ed0fb07..69a0de762cfde089e8aaa6e6be79a8c8298d7778 100644 +index 42c2c6a05645e5aef26e9d3a91ad93563a297ca3..759d54f1f012461fc322d452bb26f7fd6e601039 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 { @@ -66,10 +66,10 @@ index 6867064de52d810f1fd3869463ae27868ed0fb07..69a0de762cfde089e8aaa6e6be79a8c8 // 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 6e745c7ddf417ec2fdcf102edd6a592047b5f73e..2f59107642d43719159872d5df37107d8a1a5b97 100644 +index 47926ff2fba43bb83e2d9747420a526cce8ebe65..e72cd3c9919978a0ed91614d51d018bfb2cdb900 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -2085,7 +2085,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player, PluginMessa +@@ -2086,7 +2086,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player, PluginMessa @Override public boolean canSee(Player player) { @@ -79,10 +79,10 @@ index 6e745c7ddf417ec2fdcf102edd6a592047b5f73e..2f59107642d43719159872d5df37107d @Override diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java -index 6f608ad5d1151925ad0f38596dfe15290d20d753..9c1a48dd4a8957200d8c05cf7e142c621132bb74 100644 +index fa3e2bf2b31ca5173d71082e93eb7eaa4faa2816..bd3c4eb10489f13562b31f4b809e80b19717bc25 100644 --- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java +++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java -@@ -344,7 +344,7 @@ public final class CraftMagicNumbers implements UnsafeValues { +@@ -347,7 +347,7 @@ public final class CraftMagicNumbers implements UnsafeValues { Bukkit.getLogger().log(Level.SEVERE, "Error saving advancement " + key, ex); } diff --git a/1todos/server/src/lophine/command/counter/CounterCommand.java b/lophine-server/src/main/java/fun/bm/lophine/command/counter/CounterCommand.java similarity index 100% rename from 1todos/server/src/lophine/command/counter/CounterCommand.java rename to lophine-server/src/main/java/fun/bm/lophine/command/counter/CounterCommand.java diff --git a/1todos/server/src/lophine/command/counter/CounterSubCommand.java b/lophine-server/src/main/java/fun/bm/lophine/command/counter/CounterSubCommand.java similarity index 100% rename from 1todos/server/src/lophine/command/counter/CounterSubCommand.java rename to lophine-server/src/main/java/fun/bm/lophine/command/counter/CounterSubCommand.java diff --git a/1todos/server/src/lophine/command/counter/sub/DisplayCommand.java b/lophine-server/src/main/java/fun/bm/lophine/command/counter/sub/DisplayCommand.java similarity index 100% rename from 1todos/server/src/lophine/command/counter/sub/DisplayCommand.java rename to lophine-server/src/main/java/fun/bm/lophine/command/counter/sub/DisplayCommand.java diff --git a/1todos/server/src/lophine/command/counter/sub/ResetCommand.java b/lophine-server/src/main/java/fun/bm/lophine/command/counter/sub/ResetCommand.java similarity index 100% rename from 1todos/server/src/lophine/command/counter/sub/ResetCommand.java rename to lophine-server/src/main/java/fun/bm/lophine/command/counter/sub/ResetCommand.java diff --git a/1todos/server/src/lophine/command/counter/sub/ToggleCommand.java b/lophine-server/src/main/java/fun/bm/lophine/command/counter/sub/ToggleCommand.java similarity index 100% rename from 1todos/server/src/lophine/command/counter/sub/ToggleCommand.java rename to lophine-server/src/main/java/fun/bm/lophine/command/counter/sub/ToggleCommand.java diff --git a/1todos/server/config-files/function/CreativeFlyNoClipConfig.java b/lophine-server/src/main/java/fun/bm/lophine/config/modules/function/CreativeFlyNoClipConfig.java similarity index 100% rename from 1todos/server/config-files/function/CreativeFlyNoClipConfig.java rename to lophine-server/src/main/java/fun/bm/lophine/config/modules/function/CreativeFlyNoClipConfig.java diff --git a/1todos/server/config-files/function/ReplayAPIConfig.java b/lophine-server/src/main/java/fun/bm/lophine/config/modules/function/ReplayAPIConfig.java similarity index 100% rename from 1todos/server/config-files/function/ReplayAPIConfig.java rename to lophine-server/src/main/java/fun/bm/lophine/config/modules/function/ReplayAPIConfig.java diff --git a/1todos/server/config-files/function/WoolHopperCounterConfig.java b/lophine-server/src/main/java/fun/bm/lophine/config/modules/function/WoolHopperCounterConfig.java similarity index 100% rename from 1todos/server/config-files/function/WoolHopperCounterConfig.java rename to lophine-server/src/main/java/fun/bm/lophine/config/modules/function/WoolHopperCounterConfig.java diff --git a/1todos/server/src/lophine/utils/RandomProfilePool.java b/lophine-server/src/main/java/fun/bm/lophine/utils/RandomProfilePool.java similarity index 100% rename from 1todos/server/src/lophine/utils/RandomProfilePool.java rename to lophine-server/src/main/java/fun/bm/lophine/utils/RandomProfilePool.java diff --git a/1todos/server/src/leaves/entity/photographer/CraftPhotographer.java b/lophine-server/src/main/java/org/leavesmc/leaves/entity/photographer/CraftPhotographer.java similarity index 100% rename from 1todos/server/src/leaves/entity/photographer/CraftPhotographer.java rename to lophine-server/src/main/java/org/leavesmc/leaves/entity/photographer/CraftPhotographer.java diff --git a/1todos/server/src/leaves/entity/photographer/CraftPhotographerManager.java b/lophine-server/src/main/java/org/leavesmc/leaves/entity/photographer/CraftPhotographerManager.java similarity index 100% rename from 1todos/server/src/leaves/entity/photographer/CraftPhotographerManager.java rename to lophine-server/src/main/java/org/leavesmc/leaves/entity/photographer/CraftPhotographerManager.java diff --git a/1todos/server/src/leaves/replay/DigestOutputStream.java b/lophine-server/src/main/java/org/leavesmc/leaves/replay/DigestOutputStream.java similarity index 100% rename from 1todos/server/src/leaves/replay/DigestOutputStream.java rename to lophine-server/src/main/java/org/leavesmc/leaves/replay/DigestOutputStream.java diff --git a/1todos/server/src/leaves/replay/RecordMetaData.java b/lophine-server/src/main/java/org/leavesmc/leaves/replay/RecordMetaData.java similarity index 100% rename from 1todos/server/src/leaves/replay/RecordMetaData.java rename to lophine-server/src/main/java/org/leavesmc/leaves/replay/RecordMetaData.java diff --git a/1todos/server/src/leaves/replay/Recorder.java b/lophine-server/src/main/java/org/leavesmc/leaves/replay/Recorder.java similarity index 95% rename from 1todos/server/src/leaves/replay/Recorder.java rename to lophine-server/src/main/java/org/leavesmc/leaves/replay/Recorder.java index 66c2806..96e8cea 100644 --- a/1todos/server/src/leaves/replay/Recorder.java +++ b/lophine-server/src/main/java/org/leavesmc/leaves/replay/Recorder.java @@ -212,7 +212,15 @@ public class Recorder extends Connection { } if (recorderOption.forceDayTime != -1 && packet instanceof ClientboundSetTimePacket packet1) { - packet = new ClientboundSetTimePacket(packet1.dayTime(), recorderOption.forceDayTime, false); + // Leaves - Paper 26.1: SetTimePacket is now (gameTime, Map, ClockNetworkState>). + // Replace each world clock with a frozen state at forceDayTime. + packet = new ClientboundSetTimePacket( + packet1.gameTime(), + net.minecraft.util.Util.mapValues( + packet1.clockUpdates(), + state -> new net.minecraft.world.clock.ClockNetworkState(recorderOption.forceDayTime, 0.0F, 0.0F) + ) + ); } if (recorderOption.forceWeather != null && packet instanceof ClientboundGameEventPacket packet1) { diff --git a/1todos/server/src/leaves/replay/RecorderOption.java b/lophine-server/src/main/java/org/leavesmc/leaves/replay/RecorderOption.java similarity index 100% rename from 1todos/server/src/leaves/replay/RecorderOption.java rename to lophine-server/src/main/java/org/leavesmc/leaves/replay/RecorderOption.java diff --git a/1todos/server/src/leaves/replay/ReplayFile.java b/lophine-server/src/main/java/org/leavesmc/leaves/replay/ReplayFile.java similarity index 100% rename from 1todos/server/src/leaves/replay/ReplayFile.java rename to lophine-server/src/main/java/org/leavesmc/leaves/replay/ReplayFile.java diff --git a/1todos/server/src/leaves/replay/ReplayMarker.java b/lophine-server/src/main/java/org/leavesmc/leaves/replay/ReplayMarker.java similarity index 100% rename from 1todos/server/src/leaves/replay/ReplayMarker.java rename to lophine-server/src/main/java/org/leavesmc/leaves/replay/ReplayMarker.java diff --git a/1todos/server/src/leaves/replay/ServerPhotographer.java b/lophine-server/src/main/java/org/leavesmc/leaves/replay/ServerPhotographer.java similarity index 98% rename from 1todos/server/src/leaves/replay/ServerPhotographer.java rename to lophine-server/src/main/java/org/leavesmc/leaves/replay/ServerPhotographer.java index 38f6cb7..968ecae 100644 --- a/1todos/server/src/leaves/replay/ServerPhotographer.java +++ b/lophine-server/src/main/java/org/leavesmc/leaves/replay/ServerPhotographer.java @@ -19,6 +19,7 @@ package org.leavesmc.leaves.replay; import ca.spottedleaf.moonrise.common.util.TickThread; import com.mojang.authlib.GameProfile; +import com.mojang.logging.LogUtils; import fun.bm.lophine.utils.RandomProfilePool; import io.papermc.paper.threadedregions.RegionizedServer; import net.minecraft.server.MinecraftServer; @@ -35,6 +36,7 @@ import org.jetbrains.annotations.NotNull; import org.leavesmc.leaves.bot.BotStatsCounter; import org.leavesmc.leaves.entity.photographer.CraftPhotographer; import org.leavesmc.leaves.entity.photographer.Photographer; +import org.slf4j.Logger; import java.io.File; import java.io.IOException; @@ -45,6 +47,8 @@ import java.util.concurrent.CopyOnWriteArrayList; public class ServerPhotographer extends ServerPlayer { + private static final Logger LOGGER = LogUtils.getClassLogger(); + private static final List photographers = new CopyOnWriteArrayList<>(); public PhotographerCreateState createState; diff --git a/1todos/server/src/leaves/replay/ServerPhotographerGameMode.java b/lophine-server/src/main/java/org/leavesmc/leaves/replay/ServerPhotographerGameMode.java similarity index 100% rename from 1todos/server/src/leaves/replay/ServerPhotographerGameMode.java rename to lophine-server/src/main/java/org/leavesmc/leaves/replay/ServerPhotographerGameMode.java diff --git a/1todos/server/src/leaves/util/HopperCounter.java b/lophine-server/src/main/java/org/leavesmc/leaves/util/HopperCounter.java similarity index 97% rename from 1todos/server/src/leaves/util/HopperCounter.java rename to lophine-server/src/main/java/org/leavesmc/leaves/util/HopperCounter.java index 8d10f1f..6914c82 100644 --- a/1todos/server/src/leaves/util/HopperCounter.java +++ b/lophine-server/src/main/java/org/leavesmc/leaves/util/HopperCounter.java @@ -29,6 +29,7 @@ import net.kyori.adventure.text.format.TextDecoration; import net.minecraft.core.Holder; import net.minecraft.core.Registry; import net.minecraft.core.RegistryAccess; +import net.minecraft.core.component.DataComponents; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; import net.minecraft.resources.Identifier; @@ -289,8 +290,12 @@ public class HopperCounter { if (DEFAULTS.containsKey(item)) { return TextColor.color(appropriateColor(DEFAULTS.get(item).defaultMapColor().col)); } - if (item instanceof DyeItem dye) { - return TextColor.color(appropriateColor(dye.getDyeColor().getMapColor().col)); + if (item instanceof DyeItem) { + // Leaves - Paper 26.1: DyeItem#getDyeColor() removed, color now lives in DataComponents.DYE + DyeColor dyeColor = item.components().get(DataComponents.DYE); + if (dyeColor != null) { + return TextColor.color(appropriateColor(dyeColor.getMapColor().col)); + } } Block block = null; diff --git a/1todos/server/src/leaves/util/UUIDSerializer.java b/lophine-server/src/main/java/org/leavesmc/leaves/util/UUIDSerializer.java similarity index 100% rename from 1todos/server/src/leaves/util/UUIDSerializer.java rename to lophine-server/src/main/java/org/leavesmc/leaves/util/UUIDSerializer.java diff --git a/1todos/server/src/leaves/util/WoolUtils.java b/lophine-server/src/main/java/org/leavesmc/leaves/util/WoolUtils.java similarity index 100% rename from 1todos/server/src/leaves/util/WoolUtils.java rename to lophine-server/src/main/java/org/leavesmc/leaves/util/WoolUtils.java