From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: wling-art 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 5eb740476dff894e91c2bd779ef6b760213a78a5..64f24d3e0ecb91e0b4df6229354aeac549234f1b 100644 --- a/net/minecraft/world/entity/Entity.java +++ b/net/minecraft/world/entity/Entity.java @@ -262,6 +262,9 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess protected Object2DoubleMap> fluidHeight = new Object2DoubleArrayMap<>(2); protected boolean wasEyeInWater; private final Set> 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; @@ -2022,7 +2025,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 @@ -2034,7 +2038,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 } } } @@ -2114,9 +2129,25 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess } } + // Leaf start - Optimize isEyeInFluid public boolean isEyeInFluid(TagKey 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 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;