From 2d3911568cb081d7a954ace8b8c1fdc0b68bdba2 Mon Sep 17 00:00:00 2001 From: Dreeam <61569423+Dreeam-qwq@users.noreply.github.com> Date: Tue, 14 Jul 2026 06:04:44 +0800 Subject: [PATCH] Apply Replace entity tracker by fluid map --- ...0283-Replace-entity-fluid-height-map.patch | 19 ----- ...-Replace-entity-tracker-by-fluid-map.patch | 55 +++++++++++++ ...dHeightMap.java => TrackerByFluidMap.java} | 77 +++++++++++-------- 3 files changed, 99 insertions(+), 52 deletions(-) delete mode 100644 leaf-archived-patches/work/server/minecraft-patches/features/0283-Replace-entity-fluid-height-map.patch create mode 100644 leaf-server/minecraft-patches/features/0313-Replace-entity-tracker-by-fluid-map.patch rename leaf-server/src/main/java/org/dreeam/leaf/util/map/{FluidHeightMap.java => TrackerByFluidMap.java} (56%) diff --git a/leaf-archived-patches/work/server/minecraft-patches/features/0283-Replace-entity-fluid-height-map.patch b/leaf-archived-patches/work/server/minecraft-patches/features/0283-Replace-entity-fluid-height-map.patch deleted file mode 100644 index 6cce34912e..0000000000 --- a/leaf-archived-patches/work/server/minecraft-patches/features/0283-Replace-entity-fluid-height-map.patch +++ /dev/null @@ -1,19 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: hayanesuru -Date: Sun, 10 Aug 2025 16:14:07 +0900 -Subject: [PATCH] Replace entity fluid height map - - -diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java -index f0bfd55be864e767c2460e1aa7e7a6b15736dd59..6077a2e0ef872ef3ac99a1ff405ab2d3d0b17e47 100644 ---- a/net/minecraft/world/entity/Entity.java -+++ b/net/minecraft/world/entity/Entity.java -@@ -290,7 +290,7 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name - public int tickCount; - private int remainingFireTicks; - public boolean wasTouchingWater; -- protected Object2DoubleMap> fluidHeight = new Object2DoubleArrayMap<>(2); -+ protected Object2DoubleMap> fluidHeight = new org.dreeam.leaf.util.map.FluidHeightMap(); // Leaf - Replace fluid height map - protected boolean wasEyeInWater; - // Leaf start - Optimize isEyeInFluid - // Remove original field since plugin should not direct access to it, and able to diff --git a/leaf-server/minecraft-patches/features/0313-Replace-entity-tracker-by-fluid-map.patch b/leaf-server/minecraft-patches/features/0313-Replace-entity-tracker-by-fluid-map.patch new file mode 100644 index 0000000000..5362f672b5 --- /dev/null +++ b/leaf-server/minecraft-patches/features/0313-Replace-entity-tracker-by-fluid-map.patch @@ -0,0 +1,55 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: hayanesuru +Date: Sun, 10 Aug 2025 16:14:07 +0900 +Subject: [PATCH] Replace entity tracker by fluid map + + +diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java +index 32522db0ef77c07cb3a67bc8dab13db6a36bb8e2..6fbcad1727a8bfb4bc1eb9545f6ee7d9fa2926b5 100644 +--- a/net/minecraft/world/entity/Entity.java ++++ b/net/minecraft/world/entity/Entity.java +@@ -305,7 +305,7 @@ public abstract class Entity + protected final RandomSource random; // Paper - Share random for entities to make them more random // Purpur - Add toggle for RNG manipulation + public int tickCount; + private int remainingFireTicks; +- private final EntityFluidInteraction fluidInteraction = new EntityFluidInteraction(Set.of(FluidTags.WATER, FluidTags.LAVA)); ++ private final EntityFluidInteraction fluidInteraction = new EntityFluidInteraction(); // Leaf - Replace entity tracker by fluid map + protected boolean wasTouchingWater; + protected boolean wasEyeInWater; + public int invulnerableTime; +diff --git a/net/minecraft/world/entity/EntityFluidInteraction.java b/net/minecraft/world/entity/EntityFluidInteraction.java +index 817ec969b758f9902e9dc19d3be2d801740d207b..a54e7ec83f7e2d7a5f227c8fa3195ff1fcf2f912 100644 +--- a/net/minecraft/world/entity/EntityFluidInteraction.java ++++ b/net/minecraft/world/entity/EntityFluidInteraction.java +@@ -21,7 +21,7 @@ import net.minecraft.world.phys.Vec3; + import org.jspecify.annotations.Nullable; + + public class EntityFluidInteraction { +- private final Map, EntityFluidInteraction.Tracker> trackerByFluid = new Reference2ObjectArrayMap<>(); ++ private final Map, EntityFluidInteraction.Tracker> trackerByFluid = new org.dreeam.leaf.util.map.TrackerByFluidMap(); // Leaf - Replace entity tracker by fluid map + + public EntityFluidInteraction(final Set> fluids) { + for (TagKey fluid : fluids) { +@@ -29,8 +29,12 @@ public class EntityFluidInteraction { + } + } + ++ public EntityFluidInteraction() { ++ ((org.dreeam.leaf.util.map.TrackerByFluidMap) this.trackerByFluid).init(); ++ } ++ + public void update(final Entity entity, final boolean ignoreCurrent) { +- this.trackerByFluid.values().forEach(EntityFluidInteraction.Tracker::reset); ++ ((org.dreeam.leaf.util.map.TrackerByFluidMap) this.trackerByFluid).reset(); // Leaf - Replace entity tracker by fluid map + AABB box = entity.getFluidInteractionBox(); + if (box != null) { + int x0 = Mth.floor(box.minX); +@@ -155,7 +159,7 @@ public class EntityFluidInteraction { + return tracker != null && tracker.eyesInside; + } + +- private static class Tracker { ++ public static class Tracker { // Leaf - Replace entity tracker by fluid map - private -> public + private double height; + private boolean eyesInside; + private Vec3 accumulatedCurrent = Vec3.ZERO; diff --git a/leaf-server/src/main/java/org/dreeam/leaf/util/map/FluidHeightMap.java b/leaf-server/src/main/java/org/dreeam/leaf/util/map/TrackerByFluidMap.java similarity index 56% rename from leaf-server/src/main/java/org/dreeam/leaf/util/map/FluidHeightMap.java rename to leaf-server/src/main/java/org/dreeam/leaf/util/map/TrackerByFluidMap.java index 00688538e2..8dbdccee88 100644 --- a/leaf-server/src/main/java/org/dreeam/leaf/util/map/FluidHeightMap.java +++ b/leaf-server/src/main/java/org/dreeam/leaf/util/map/TrackerByFluidMap.java @@ -1,18 +1,19 @@ package org.dreeam.leaf.util.map; -import it.unimi.dsi.fastutil.objects.AbstractObject2DoubleMap; import it.unimi.dsi.fastutil.objects.AbstractObjectSet; +import it.unimi.dsi.fastutil.objects.AbstractReference2ObjectMap; import it.unimi.dsi.fastutil.objects.ObjectIterator; import it.unimi.dsi.fastutil.objects.ObjectSet; import net.minecraft.tags.FluidTags; import net.minecraft.tags.TagKey; +import net.minecraft.world.entity.EntityFluidInteraction; import net.minecraft.world.level.material.Fluid; import java.util.NoSuchElementException; -public final class FluidHeightMap extends AbstractObject2DoubleMap> { - private double water = 0.0; - private double lava = 0.0; +public final class TrackerByFluidMap extends AbstractReference2ObjectMap, EntityFluidInteraction.Tracker> { + private EntityFluidInteraction.Tracker water = null; + private EntityFluidInteraction.Tracker lava = null; @Override public int size() { @@ -20,38 +21,48 @@ public int size() { } @Override - public ObjectSet>> object2DoubleEntrySet() { + public ObjectSet, EntityFluidInteraction.Tracker>> reference2ObjectEntrySet() { return new EntrySet(); } @Override - public double getDouble(Object k) { - return k == FluidTags.WATER ? water : k == FluidTags.LAVA ? lava : 0.0; + public EntityFluidInteraction.Tracker get(Object k) { + return k == FluidTags.WATER ? water : k == FluidTags.LAVA ? lava : null; } @Override - public double put(TagKey k, double v) { + public EntityFluidInteraction.Tracker put(TagKey k, EntityFluidInteraction.Tracker v) { if (k == FluidTags.WATER) { - double prev = this.water; + EntityFluidInteraction.Tracker prev = this.water; this.water = v; return prev; } else if (k == FluidTags.LAVA) { - double prev = this.lava; + EntityFluidInteraction.Tracker prev = this.lava; this.lava = v; return prev; } - return 0.0; + return null; } @Override public void clear() { - this.water = 0.0; - this.lava = 0.0; + this.water = null; + this.lava = null; } - private final class EntrySet extends AbstractObjectSet>> { + public void init () { + this.water = new EntityFluidInteraction.Tracker(); + this.lava = new EntityFluidInteraction.Tracker(); + } + + public void reset() { + this.water.reset(); + this.lava.reset(); + } + + private final class EntrySet extends AbstractObjectSet, EntityFluidInteraction.Tracker>> { @Override - public ObjectIterator>> iterator() { + public ObjectIterator, EntityFluidInteraction.Tracker>> iterator() { return new EntryIterator(); } @@ -62,38 +73,38 @@ public int size() { @Override public boolean contains(Object o) { - if (!(o instanceof Entry entry)) { + if (!(o instanceof Entry entry)) { return false; } Object key = entry.getKey(); if (key == FluidTags.WATER) { - return entry.getDoubleValue() == water; + return entry.getValue() == water; } else if (key == FluidTags.LAVA) { - return entry.getDoubleValue() == lava; + return entry.getValue() == lava; } return false; } @Override public boolean remove(final Object o) { - if (!(o instanceof Entry entry)) { + if (!(o instanceof Entry entry)) { return false; } Object key = entry.getKey(); if (key == FluidTags.WATER) { - water = 0.0; + water = null; return true; } else if (key == FluidTags.LAVA) { - lava = 0.0; + lava = null; return true; } return false; } } - private final class EntryIterator implements ObjectIterator>> { + private final class EntryIterator implements ObjectIterator, EntityFluidInteraction.Tracker>> { private int index = 0; - private Entry> entry = null; + private Entry, EntityFluidInteraction.Tracker> entry = null; @Override public boolean hasNext() { @@ -101,16 +112,16 @@ public boolean hasNext() { } @Override - public Entry> next() { + public Entry, EntityFluidInteraction.Tracker> next() { if (!hasNext()) { throw new NoSuchElementException(); } if (index == 0) { index++; - return entry = new DoubleEntry(FluidTags.WATER); + return entry = new TrackerEntry(FluidTags.WATER); } else { index++; - return entry = new DoubleEntry(FluidTags.LAVA); + return entry = new TrackerEntry(FluidTags.LAVA); } } @@ -121,18 +132,18 @@ public void remove() { } TagKey key = entry.getKey(); if (key == FluidTags.WATER) { - water = 0.0; + water = null; } else if (key == FluidTags.LAVA) { - lava = 0.0; + lava = null; } entry = null; } } - private final class DoubleEntry implements Entry> { + private final class TrackerEntry implements Entry, EntityFluidInteraction.Tracker> { private final TagKey key; - public DoubleEntry(TagKey key) { + public TrackerEntry(TagKey key) { this.key = key; } @@ -142,13 +153,13 @@ public TagKey getKey() { } @Override - public double getDoubleValue() { + public EntityFluidInteraction.Tracker getValue() { return key == FluidTags.WATER ? water : lava; } @Override - public double setValue(double value) { - double prev; + public EntityFluidInteraction.Tracker setValue(EntityFluidInteraction.Tracker value) { + EntityFluidInteraction.Tracker prev; if (key == FluidTags.WATER) { prev = water; water = value;