Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: hayanesuru <hayanesuru@outlook.jp>
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<TagKey<Fluid>, EntityFluidInteraction.Tracker> trackerByFluid = new Reference2ObjectArrayMap<>();
+ private final Map<TagKey<Fluid>, EntityFluidInteraction.Tracker> trackerByFluid = new org.dreeam.leaf.util.map.TrackerByFluidMap(); // Leaf - Replace entity tracker by fluid map

public EntityFluidInteraction(final Set<TagKey<Fluid>> fluids) {
for (TagKey<Fluid> 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;
Original file line number Diff line number Diff line change
@@ -1,57 +1,68 @@
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<TagKey<Fluid>> {
private double water = 0.0;
private double lava = 0.0;
public final class TrackerByFluidMap extends AbstractReference2ObjectMap<TagKey<Fluid>, EntityFluidInteraction.Tracker> {
private EntityFluidInteraction.Tracker water = null;
private EntityFluidInteraction.Tracker lava = null;

@Override
public int size() {
return 2;
}

@Override
public ObjectSet<Entry<TagKey<Fluid>>> object2DoubleEntrySet() {
public ObjectSet<Entry<TagKey<Fluid>, 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<Fluid> k, double v) {
public EntityFluidInteraction.Tracker put(TagKey<Fluid> 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<Entry<TagKey<Fluid>>> {
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<Entry<TagKey<Fluid>, EntityFluidInteraction.Tracker>> {
@Override
public ObjectIterator<Entry<TagKey<Fluid>>> iterator() {
public ObjectIterator<Entry<TagKey<Fluid>, EntityFluidInteraction.Tracker>> iterator() {
return new EntryIterator();
}

Expand All @@ -62,55 +73,55 @@ 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<Entry<TagKey<Fluid>>> {
private final class EntryIterator implements ObjectIterator<Entry<TagKey<Fluid>, EntityFluidInteraction.Tracker>> {
private int index = 0;
private Entry<TagKey<Fluid>> entry = null;
private Entry<TagKey<Fluid>, EntityFluidInteraction.Tracker> entry = null;

@Override
public boolean hasNext() {
return index < 2;
}

@Override
public Entry<TagKey<Fluid>> next() {
public Entry<TagKey<Fluid>, 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);
}
}

Expand All @@ -121,18 +132,18 @@ public void remove() {
}
TagKey<Fluid> 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<TagKey<Fluid>> {
private final class TrackerEntry implements Entry<TagKey<Fluid>, EntityFluidInteraction.Tracker> {
private final TagKey<Fluid> key;

public DoubleEntry(TagKey<Fluid> key) {
public TrackerEntry(TagKey<Fluid> key) {
this.key = key;
}

Expand All @@ -142,13 +153,13 @@ public TagKey<Fluid> 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;
Expand Down
Loading