From 9ecdfe1e64127b6ab4434e66548e896f1764cbfe Mon Sep 17 00:00:00 2001 From: Fortern <53903789+Fortern@users.noreply.github.com> Date: Wed, 1 Oct 2025 15:53:56 +0800 Subject: [PATCH 1/3] Do not check NaN values in entities (#742) (#749) --- ...-Do-not-check-NaN-values-in-entities.patch | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 leaves-server/minecraft-patches/features/0141-Do-not-check-NaN-values-in-entities.patch diff --git a/leaves-server/minecraft-patches/features/0141-Do-not-check-NaN-values-in-entities.patch b/leaves-server/minecraft-patches/features/0141-Do-not-check-NaN-values-in-entities.patch new file mode 100644 index 00000000..a3b517b3 --- /dev/null +++ b/leaves-server/minecraft-patches/features/0141-Do-not-check-NaN-values-in-entities.patch @@ -0,0 +1,43 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Fortern +Date: Mon, 29 Sep 2025 10:24:45 +0800 +Subject: [PATCH] Do not check NaN values in entities + + +diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java +index 4748bd188f8860ed2a8b2e6123e020c1da17af5f..5c17fb5211da426b41c1ebb298563f083bc09099 100644 +--- a/net/minecraft/world/entity/Entity.java ++++ b/net/minecraft/world/entity/Entity.java +@@ -2512,10 +2512,12 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess + } + } // CraftBukkit + +- this.setDeltaMovement(io.papermc.paper.util.MCUtil.sanitizeNanInf(this.deltaMovement, 0D)); // Paper - remove NaN values before usage in saving ++ // Leaves start - Do not check NaN values ++ // this.setDeltaMovement(io.papermc.paper.util.MCUtil.sanitizeNanInf(this.deltaMovement, 0D)); // Paper - remove NaN values before usage in saving // Leaves - Do not check NaN values + output.store("Motion", Vec3.CODEC, this.getDeltaMovement()); + // CraftBukkit start - Checking for NaN pitch/yaw and resetting to zero + // TODO: make sure this is the best way to address this. ++ /* + if (Float.isNaN(this.yRot)) { + this.yRot = 0; + } +@@ -2523,7 +2525,9 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess + if (Float.isNaN(this.xRot)) { + this.xRot = 0; + } ++ */ + // CraftBukkit end ++ // Leaves end - Do not check NaN values + output.store("Rotation", Vec2.CODEC, new Vec2(this.getYRot(), this.getXRot())); + output.putDouble("fall_distance", this.fallDistance); + output.putShort("Fire", (short)this.remainingFireTicks); +@@ -2646,7 +2650,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess + public void load(ValueInput input) { + try { + Vec3 vec3 = input.read("Pos", Vec3.CODEC).orElse(Vec3.ZERO); +- Vec3 vec31 = input.read("Motion", Vec3.CODEC).orElse(Vec3.ZERO); vec31 = io.papermc.paper.util.MCUtil.sanitizeNanInf(vec31, 0D); // Paper - avoid setting NaN values ++ Vec3 vec31 = input.read("Motion", Vec3.CODEC).orElse(Vec3.ZERO); // vec31 = io.papermc.paper.util.MCUtil.sanitizeNanInf(vec31, 0D); // Paper - avoid setting NaN values // Leaves - Do not check NaN values + Vec2 vec2 = input.read("Rotation", Vec2.CODEC).orElse(Vec2.ZERO); + this.setDeltaMovement(Math.abs(vec31.x) > 10.0 ? 0.0 : vec31.x, Math.abs(vec31.y) > 10.0 ? 0.0 : vec31.y, Math.abs(vec31.z) > 10.0 ? 0.0 : vec31.z); + this.hasImpulse = true; From 5974eea292d0586f476890b7d2f3917462ebd195 Mon Sep 17 00:00:00 2001 From: violetc <58360096+s-yh-china@users.noreply.github.com> Date: Wed, 1 Oct 2025 18:23:33 +0800 Subject: [PATCH 2/3] Update Paper --- gradle.properties | 2 +- .../minecraft-patches/features/0123-Fast-exp-orb-absorb.patch | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/gradle.properties b/gradle.properties index 20145e6e..f197da43 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,7 +1,7 @@ group=org.leavesmc.leaves version=1.21.8-R0.1-SNAPSHOT mcVersion=1.21.8 -paperRef=9aaaadffaa0caad086cf04709904b47eaac161d7 +paperRef=29c8822d90899c89d2689338e81a98f690bcba12 preVersion=false org.gradle.caching=true diff --git a/leaves-server/minecraft-patches/features/0123-Fast-exp-orb-absorb.patch b/leaves-server/minecraft-patches/features/0123-Fast-exp-orb-absorb.patch index 4959f922..cd49d317 100644 --- a/leaves-server/minecraft-patches/features/0123-Fast-exp-orb-absorb.patch +++ b/leaves-server/minecraft-patches/features/0123-Fast-exp-orb-absorb.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Fast exp orb absorb diff --git a/net/minecraft/world/entity/ExperienceOrb.java b/net/minecraft/world/entity/ExperienceOrb.java -index cfd9d63f55e73c1777055d13a802b29e151cc0d4..36e691f511c37b8af3f7fc58d9986fefdc3e1e5a 100644 +index 0aef8e15a75752e5c83af6245b1d8cdb53e7fc1b..49fc9777279034bcecfbab29745e4937ff121603 100644 --- a/net/minecraft/world/entity/ExperienceOrb.java +++ b/net/minecraft/world/entity/ExperienceOrb.java @@ -358,6 +358,20 @@ public class ExperienceOrb extends Entity { @@ -26,6 +26,6 @@ index cfd9d63f55e73c1777055d13a802b29e151cc0d4..36e691f511c37b8af3f7fc58d9986fef + return; + } + - entity.takeXpDelay = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerXpCooldownEvent(entity, 2, org.bukkit.event.player.PlayerExpCooldownChangeEvent.ChangeReason.PICKUP_ORB).getNewCooldown(); // CraftBukkit - entityhuman.takeXpDelay = 2; + entity.takeXpDelay = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerXpCooldownEvent(entity, 2, org.bukkit.event.player.PlayerExpCooldownChangeEvent.ChangeReason.PICKUP_ORB).getNewCooldown(); // CraftBukkit - entity.takeXpDelay = 2; entity.take(this, 1); int i = this.repairPlayerItems(serverPlayer, this.getValue()); From 5083948ac00722911838bcff08846df25195bcdd Mon Sep 17 00:00:00 2001 From: violetc <58360096+s-yh-china@users.noreply.github.com> Date: Wed, 1 Oct 2025 19:26:02 +0800 Subject: [PATCH 3/3] Update Update Paper --- .../minecraft-patches/features/0123-Fast-exp-orb-absorb.patch | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/leaves-server/minecraft-patches/features/0123-Fast-exp-orb-absorb.patch b/leaves-server/minecraft-patches/features/0123-Fast-exp-orb-absorb.patch index cd49d317..630d6b37 100644 --- a/leaves-server/minecraft-patches/features/0123-Fast-exp-orb-absorb.patch +++ b/leaves-server/minecraft-patches/features/0123-Fast-exp-orb-absorb.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Fast exp orb absorb diff --git a/net/minecraft/world/entity/ExperienceOrb.java b/net/minecraft/world/entity/ExperienceOrb.java -index 0aef8e15a75752e5c83af6245b1d8cdb53e7fc1b..49fc9777279034bcecfbab29745e4937ff121603 100644 +index 0aef8e15a75752e5c83af6245b1d8cdb53e7fc1b..f4f213cc1bf7f576a982faf0d8e85b02b36e7c56 100644 --- a/net/minecraft/world/entity/ExperienceOrb.java +++ b/net/minecraft/world/entity/ExperienceOrb.java @@ -358,6 +358,20 @@ public class ExperienceOrb extends Entity { @@ -18,7 +18,7 @@ index 0aef8e15a75752e5c83af6245b1d8cdb53e7fc1b..49fc9777279034bcecfbab29745e4937 + entity.take(this, 1); + int i = this.repairPlayerItems(serverPlayer, this.getValue()); + if (i > 0) { -+ entity.giveExperiencePoints(org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerExpChangeEvent(entity, this).getAmount()); // CraftBukkit - this.value -> event.getAmount() // Paper - supply experience orb object ++ entity.giveExperiencePoints(org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerExpChangeEvent(entity, this, i).getAmount()); // CraftBukkit - this.value -> event.getAmount() // Paper - supply experience orb object + } + this.count--; + }