9
0
mirror of https://github.com/Winds-Studio/Leaf.git synced 2025-12-19 15:09:25 +00:00
Files
Leaf/leaf-server/minecraft-patches/features/0258-Optimize-isEyeInFluid.patch
2025-06-25 23:05:25 +09:00

78 lines
3.7 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: wling-art <wlingzhenyu@163.com>
Date: Sat, 17 May 2025 08:25:33 +0800
Subject: [PATCH] Optimize isEyeInFluid
diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java
index 2a1affd8b38ad3a2eb5861f03929619e3f2e3e4d..4dce68aafbccfeda82d0bee127a59f43502c6f70 100644
--- a/net/minecraft/world/entity/Entity.java
+++ b/net/minecraft/world/entity/Entity.java
@@ -289,6 +289,9 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
protected Object2DoubleMap<TagKey<Fluid>> fluidHeight = new Object2DoubleArrayMap<>(2);
protected boolean wasEyeInWater;
private final Set<TagKey<Fluid>> fluidOnEyes = new HashSet<>();
+ private static final int FLUID_WATER = 1; // Leaf - Optimize isEyeInFluid
+ private static final int FLUID_LAVA = 2; // Leaf - Optimize isEyeInFluid
+ private int fluidCache = 0; // Leaf - Optimize isEyeInFluid
public int invulnerableTime;
protected boolean firstTick = true;
protected final SynchedEntityData entityData;
@@ -2071,7 +2074,8 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
private void updateFluidOnEyes() {
this.wasEyeInWater = this.isEyeInFluid(FluidTags.WATER);
- this.fluidOnEyes.clear();
+ if (org.dreeam.leaf.config.modules.opt.EyeFluidCache.enabled) fluidCache = 0; else this.fluidOnEyes.clear(); // Leaf - Optimize isEyeInFluid
+
double eyeY = this.getEyeY();
if (!(
this.getVehicle() instanceof AbstractBoat abstractBoat
@@ -2083,7 +2087,18 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
FluidState fluidState = this.level().getFluidState(blockPos);
double d = blockPos.getY() + fluidState.getHeight(this.level(), blockPos);
if (d > eyeY) {
- this.fluidOnEyes.addAll(fluidState.getTagsAsSet()); // Leaf - Remove stream in updateFluidOnEyes
+ // Leaf start - Optimize isEyeInFluid
+ if (org.dreeam.leaf.config.modules.opt.EyeFluidCache.enabled) {
+ if (fluidState.is(FluidTags.WATER)) {
+ setFluidStatus(FluidTags.WATER, true);
+ }
+ if (fluidState.is(FluidTags.LAVA)) {
+ setFluidStatus(FluidTags.LAVA, true);
+ }
+ } else {
+ this.fluidOnEyes.addAll(fluidState.getTagsAsSet()); // Leaf - Remove stream in updateFluidOnEyes
+ }
+ // Leaf end - Optimize isEyeInFluid
}
}
}
@@ -2163,9 +2178,25 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
}
}
+ // Leaf start - Optimize isEyeInFluid
public boolean isEyeInFluid(TagKey<Fluid> fluidTag) {
- return this.fluidOnEyes.contains(fluidTag);
+ if (!org.dreeam.leaf.config.modules.opt.EyeFluidCache.enabled) {
+ return this.fluidOnEyes.contains(fluidTag);
+ }
+ return fluidTag == FluidTags.WATER ? (fluidCache & FLUID_WATER) != 0
+ : fluidTag == FluidTags.LAVA && (fluidCache & FLUID_LAVA) != 0;
+ }
+
+ public void setFluidStatus(TagKey<Fluid> fluidTag, boolean isInFluid) {
+ int bit = fluidTag == FluidTags.WATER ? FLUID_WATER
+ : fluidTag == FluidTags.LAVA ? FLUID_LAVA
+ : 0;
+
+ if (bit == 0) return;
+
+ fluidCache = isInFluid ? (fluidCache | bit) : (fluidCache & ~bit);
}
+ // Leaf end - Optimize isEyeInFluid
public boolean isInLava() {
return !this.firstTick && this.fluidHeight.getDouble(FluidTags.LAVA) > 0.0;