From 163a9902ccb6b2113c52dd84c98b59618ebadada Mon Sep 17 00:00:00 2001 From: Helvetica Volubi Date: Thu, 2 Apr 2026 18:38:19 +0800 Subject: [PATCH] fix: fix mob despawn when player is away from all the player --- gradle.properties | 2 +- ...-to-disable-some-check-for-operators.patch | 6 +-- .../0040-Global-Entities-Counter.patch | 49 +++++++++++++++++++ 3 files changed, 53 insertions(+), 4 deletions(-) diff --git a/gradle.properties b/gradle.properties index 5c6e558..6f80cab 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,7 +5,7 @@ apiVersion=1.21.11 release=2 # 0 for skip release, 1 for pre-release, 2 for release -luminolRef=e5ff8dff2fcfb6a8900bd87ed40ae9d4102c0c75 +luminolRef=185a0de504efb71744801ba5c71942a3d566f6fe org.gradle.configuration-cache=true org.gradle.caching=true diff --git a/lophine-server/minecraft-patches/features/0001-Add-config-to-disable-some-check-for-operators.patch b/lophine-server/minecraft-patches/features/0001-Add-config-to-disable-some-check-for-operators.patch index 5986172..3b28401 100644 --- a/lophine-server/minecraft-patches/features/0001-Add-config-to-disable-some-check-for-operators.patch +++ b/lophine-server/minecraft-patches/features/0001-Add-config-to-disable-some-check-for-operators.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Add config to disable some check for operators diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index bd344bbebc867f89061694edc0feeab9d679c90c..6d0bb9868e2c2ef516de7630442808c04ba47b39 100644 +index 90e044ab3476d91819dddf14054d4626358da363..5c5dfcefd9ce6c9d7f69fb6d03216805b9e63822 100644 --- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java @@ -392,7 +392,7 @@ public class ServerGamePacketListenerImpl @@ -30,8 +30,8 @@ index bd344bbebc867f89061694edc0feeab9d679c90c..6d0bb9868e2c2ef516de7630442808c0 d5 = d2 - rootVehicle.getZ(); d7 = d3 * d3 + d4 * d4 + d5 * d5; boolean flag1 = false; -- if (!me.earthme.luminol.config.modules.misc.DisableMovedWronglyThreshold.enabled && d7 > org.spigotmc.SpigotConfig.movedWronglyThreshold) { // Spigot -+ if (!me.earthme.luminol.config.modules.misc.DisableMovedWronglyThreshold.enabled && d7 > org.spigotmc.SpigotConfig.movedWronglyThreshold && !(fun.bm.lophine.config.modules.misc.DisableCheckConfig.disableOpMoveCheck && MinecraftServer.getServer().getPlayerList().isOp(this.player.nameAndId()))) { // Spigot // Lophine - disable move check for operator +- if (!me.earthme.luminol.config.modules.misc.DisableWarningConfig.disableMovedWronglyThresholdWarning && d7 > org.spigotmc.SpigotConfig.movedWronglyThreshold) { // Spigot ++ if (!me.earthme.luminol.config.modules.misc.DisableWarningConfig.disableMovedWronglyThresholdWarning && d7 > org.spigotmc.SpigotConfig.movedWronglyThreshold && !(fun.bm.lophine.config.modules.misc.DisableCheckConfig.disableOpMoveCheck && MinecraftServer.getServer().getPlayerList().isOp(this.player.nameAndId()))) { // Spigot // Lophine - disable move check for operator flag1 = true; // Paper - diff on change, this should be moved wrongly LOGGER.warn("{} (vehicle of {}) moved wrongly! {}", rootVehicle.getPlainTextName(), this.player.getPlainTextName(), Math.sqrt(d7)); } diff --git a/lophine-server/minecraft-patches/features/0040-Global-Entities-Counter.patch b/lophine-server/minecraft-patches/features/0040-Global-Entities-Counter.patch index c3e761a..7911643 100644 --- a/lophine-server/minecraft-patches/features/0040-Global-Entities-Counter.patch +++ b/lophine-server/minecraft-patches/features/0040-Global-Entities-Counter.patch @@ -112,6 +112,55 @@ index d8a2f8a1fbf0189e86ccbce70a84641a143cdb91..76930a603a5bf07e62e8ef3a41bbb521 final io.papermc.paper.threadedregions.RegionizedWorldData regionizedWorldData = this.getCurrentWorldData(); // Folia - regionised ticking final ca.spottedleaf.leafprofiler.RegionizedProfiler.Handle profiler = io.papermc.paper.threadedregions.TickRegionScheduler.getProfiler(); // Folia - profiler ProfilerFiller profilerFiller = Profiler.get(); +diff --git a/net/minecraft/world/entity/Mob.java b/net/minecraft/world/entity/Mob.java +index c6985d2a9d1093943d754d77089bd4c3d5baf3ee..a8807f80f1b11d7f5dae3b96a0e215e3e105fdd0 100644 +--- a/net/minecraft/world/entity/Mob.java ++++ b/net/minecraft/world/entity/Mob.java +@@ -806,6 +806,44 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab + } + } + } else { ++ // Lophine start - fix some bug if player is cross scheduler >> to remove monster if the region don't have any valid player ++ if (fun.bm.lophine.config.modules.experiment.GlobalEntitiesCounter.enabled) { ++ List playerList = this.level().getServer().getPlayerList().getPlayers(); ++ if (!playerList.isEmpty()) { ++ double d = -1.0; ++ Vec3 vec3 = null; ++ for (net.minecraft.server.level.ServerPlayer player1 : playerList) { ++ if (player1.level() != this.level()) continue; ++ double d1 = player1.distanceToSqr(this.position()); ++ if (d == -1.0 || d1 < d) { ++ d = d1; ++ vec3 = player1.position(); ++ } ++ } ++ if (vec3 != null) { ++ // copy from PaperMC ++ // Paper start - Configurable despawn distances ++ final io.papermc.paper.configuration.WorldConfiguration.Entities.Spawning.DespawnRangePair despawnRangePair = this.level().paperConfig().entities.spawning.despawnRanges.get(this.getType().getCategory()); ++ final io.papermc.paper.configuration.type.DespawnRange.Shape shape = this.level().paperConfig().entities.spawning.despawnRangeShape; ++ final double dy = Math.abs(vec3.y - this.getY()); ++ final double dySqr = Mth.square(dy); ++ final double dxSqr = Mth.square(vec3.x - this.getX()); ++ final double dzSqr = Mth.square(vec3.z - this.getZ()); ++ final double distanceSquared = dxSqr + dzSqr + dySqr; ++ // Despawn if hard/soft limit is exceeded ++ if (despawnRangePair.hard().shouldDespawn(shape, dxSqr, dySqr, dzSqr, dy) && this.removeWhenFarAway(distanceSquared)) { ++ this.discard(EntityRemoveEvent.Cause.DESPAWN); // CraftBukkit - add Bukkit remove cause ++ } ++ ++ if (despawnRangePair.soft().shouldDespawn(shape, dxSqr, dySqr, dzSqr, dy)) { ++ if (this.noActionTime > 600 && this.random.nextInt(800) == 0 && this.removeWhenFarAway(distanceSquared)) { ++ this.discard(EntityRemoveEvent.Cause.DESPAWN); // CraftBukkit - add Bukkit remove cause ++ } ++ } ++ } ++ } ++ } ++ // Lophine end + this.noActionTime = 0; + } + } diff --git a/net/minecraft/world/level/NaturalSpawner.java b/net/minecraft/world/level/NaturalSpawner.java index 91f0fbd75bc93355dc872390d91af83c76dc1dce..e7223540a7cef20b661bdb857ffba962d0f5d348 100644 --- a/net/minecraft/world/level/NaturalSpawner.java