mirror of
https://github.com/Winds-Studio/Leaf.git
synced 2025-12-19 15:09:25 +00:00
* Unify comment format * More configurable * Remove one extra execute mid-tick task call in level tick when PWT is disabled This may cause extremely rare, weird, strange, magic, mysterious issues with plugins, or potentially more. One example is that it may cause boss mob duplication issue when `ONE MOB ONLY` was enabled in plugin SupremeBosses
225 lines
12 KiB
Diff
225 lines
12 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/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java
|
|
index f89f449c325845e334a5d710211a61280e5ce862..634d870b81dcb4491889811aaf904e8917f36c04 100644
|
|
--- a/net/minecraft/server/level/ServerPlayer.java
|
|
+++ b/net/minecraft/server/level/ServerPlayer.java
|
|
@@ -1914,7 +1914,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
|
|
this.awardStat(Stats.SWIM_ONE_CM, rounded);
|
|
this.causeFoodExhaustion(this.level().spigotConfig.swimMultiplier * (float) rounded * 0.01F, org.bukkit.event.entity.EntityExhaustionEvent.ExhaustionReason.SWIM); // CraftBukkit - EntityExhaustionEvent // Spigot
|
|
}
|
|
- } else if (this.isEyeInFluid(FluidTags.WATER)) {
|
|
+ } else if (this.isEyeInWater()) { // Leaf - Optimize isEyeInFluid
|
|
int rounded = Math.round((float)Math.sqrt(dx * dx + dy * dy + dz * dz) * 100.0F);
|
|
if (rounded > 0) {
|
|
this.awardStat(Stats.WALK_UNDER_WATER_ONE_CM, rounded);
|
|
diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java
|
|
index acd8041cd984ff1d4c424d9b3f4c1a21022ec6d4..7c625f9fee3887326518e8e38cb4f04e72a4dbf7 100644
|
|
--- a/net/minecraft/world/entity/Entity.java
|
|
+++ b/net/minecraft/world/entity/Entity.java
|
|
@@ -288,7 +288,14 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
|
|
public boolean wasTouchingWater;
|
|
protected Object2DoubleMap<TagKey<Fluid>> fluidHeight = new Object2DoubleArrayMap<>(2);
|
|
protected boolean wasEyeInWater;
|
|
- private final Set<TagKey<Fluid>> fluidOnEyes = new HashSet<>();
|
|
+ // Leaf start - Optimize isEyeInFluid
|
|
+ // Remove original field since plugin should not direct access to it, and able to
|
|
+ // expose potential incompatibility asap.
|
|
+ // In paper api, if plugins have custom conditions, then It's more reasonable to
|
|
+ // use isEyeInFluid and their own conditions.
|
|
+ //private final Set<TagKey<Fluid>> fluidOnEyes = null;
|
|
+ private int isInWaterOrLava;
|
|
+ // Leaf end - Optimize isEyeInFluid
|
|
public int invulnerableTime;
|
|
protected boolean firstTick = true;
|
|
protected final SynchedEntityData entityData;
|
|
@@ -2037,8 +2044,8 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
|
|
}
|
|
|
|
private void updateFluidOnEyes() {
|
|
- this.wasEyeInWater = this.isEyeInFluid(FluidTags.WATER);
|
|
- this.fluidOnEyes.clear();
|
|
+ this.wasEyeInWater = this.isInWaterOrLava == 1; // Leaf - Optimize isEyeInFluid
|
|
+ this.isInWaterOrLava = 0; // Leaf - Optimize isEyeInFluid - reset cache
|
|
double eyeY = this.getEyeY();
|
|
if (!(
|
|
this.getVehicle() instanceof AbstractBoat abstractBoat
|
|
@@ -2050,7 +2057,9 @@ 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) {
|
|
- fluidState.getTags().forEach(this.fluidOnEyes::add);
|
|
+ // Leaf start - Optimize isEyeInFluid
|
|
+ this.isInWaterOrLava = fluidState.isEmpty() ? 0 : fluidState.is(FluidTags.WATER) ? 1 : 2;
|
|
+ // Leaf end - Optimize isEyeInFluid
|
|
}
|
|
}
|
|
}
|
|
@@ -2130,9 +2139,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 (isInWaterOrLava == 0) {
|
|
+ return false;
|
|
+ }
|
|
+ if (fluidTag == FluidTags.WATER && isInWaterOrLava == 1) {
|
|
+ return true;
|
|
+ }
|
|
+ return fluidTag == FluidTags.LAVA && isInWaterOrLava == 2;
|
|
+ }
|
|
+
|
|
+ public boolean isEyeInWater() {
|
|
+ return isInWaterOrLava == 1;
|
|
+ }
|
|
+
|
|
+ public boolean isEyeInLava() {
|
|
+ return isInWaterOrLava == 2;
|
|
}
|
|
+ // Leaf end - Optimize isEyeInFluid
|
|
|
|
public boolean isInLava() {
|
|
return !this.firstTick && this.fluidHeight.getDouble(FluidTags.LAVA) > 0.0;
|
|
diff --git a/net/minecraft/world/entity/ExperienceOrb.java b/net/minecraft/world/entity/ExperienceOrb.java
|
|
index 66ae0b340c7e9ebccfeaee786577e27916ace38c..b7cd9b286e7392c3fd619c7ba9e049076e245fd6 100644
|
|
--- a/net/minecraft/world/entity/ExperienceOrb.java
|
|
+++ b/net/minecraft/world/entity/ExperienceOrb.java
|
|
@@ -153,7 +153,7 @@ public class ExperienceOrb extends Entity {
|
|
} else {
|
|
super.tick();
|
|
boolean flag = !this.level().noCollision(this.getBoundingBox());
|
|
- if (this.isEyeInFluid(FluidTags.WATER)) {
|
|
+ if (this.isEyeInWater()) { // Leaf - Optimize isEyeInFluid
|
|
this.setUnderwaterMovement();
|
|
} else if (!flag) {
|
|
this.applyGravity();
|
|
diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java
|
|
index 4476a43011d1f8e7be6fc62410fef80c3e4f945a..de22fce4f98a600a26d1d78f3bbc1c5f5a8b5bfa 100644
|
|
--- a/net/minecraft/world/entity/LivingEntity.java
|
|
+++ b/net/minecraft/world/entity/LivingEntity.java
|
|
@@ -463,7 +463,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin
|
|
}
|
|
}
|
|
|
|
- if (this.isEyeInFluid(FluidTags.WATER)
|
|
+ if (this.isEyeInWater() // Leaf - Optimize isEyeInFluid
|
|
&& !serverLevel1.getBlockState(BlockPos.containing(this.getX(), this.getEyeY(), this.getZ())).is(Blocks.BUBBLE_COLUMN)) {
|
|
boolean flag1 = !this.canBreatheUnderwater()
|
|
&& !MobEffectUtil.hasWaterBreathing(this)
|
|
diff --git a/net/minecraft/world/entity/animal/AbstractFish.java b/net/minecraft/world/entity/animal/AbstractFish.java
|
|
index 0002e39e2670ad92849ccc0aada163b174fe1ec2..36b787f5cf4f30589d8b78f86b58553895a1ae51 100644
|
|
--- a/net/minecraft/world/entity/animal/AbstractFish.java
|
|
+++ b/net/minecraft/world/entity/animal/AbstractFish.java
|
|
@@ -182,7 +182,7 @@ public abstract class AbstractFish extends WaterAnimal implements Bucketable {
|
|
|
|
@Override
|
|
public void vanillaTick() { // Purpur - Ridables
|
|
- if (this.fish.isEyeInFluid(FluidTags.WATER)) {
|
|
+ if (this.fish.isEyeInWater()) { // Leaf - Optimize isEyeInFluid
|
|
this.fish.setDeltaMovement(this.fish.getDeltaMovement().add(0.0, 0.005, 0.0));
|
|
}
|
|
|
|
diff --git a/net/minecraft/world/entity/animal/horse/SkeletonHorse.java b/net/minecraft/world/entity/animal/horse/SkeletonHorse.java
|
|
index f6ab6ecc10486694d77905239a82bda4dec94936..8550a8758b1b26e0ddd9ed7f6ae0f167e23d96fe 100644
|
|
--- a/net/minecraft/world/entity/animal/horse/SkeletonHorse.java
|
|
+++ b/net/minecraft/world/entity/animal/horse/SkeletonHorse.java
|
|
@@ -111,7 +111,7 @@ public class SkeletonHorse extends AbstractHorse {
|
|
|
|
@Override
|
|
public SoundEvent getAmbientSound() {
|
|
- return this.isEyeInFluid(FluidTags.WATER) ? SoundEvents.SKELETON_HORSE_AMBIENT_WATER : SoundEvents.SKELETON_HORSE_AMBIENT;
|
|
+ return this.isEyeInWater() ? SoundEvents.SKELETON_HORSE_AMBIENT_WATER : SoundEvents.SKELETON_HORSE_AMBIENT; // Leaf - Optimize isEyeInFluid
|
|
}
|
|
|
|
@Override
|
|
diff --git a/net/minecraft/world/entity/monster/Strider.java b/net/minecraft/world/entity/monster/Strider.java
|
|
index e1717b5c854aa81fdd7b7e715d7c3498d9f86072..31cace20dfd61bd591f501d840a190799808926f 100644
|
|
--- a/net/minecraft/world/entity/monster/Strider.java
|
|
+++ b/net/minecraft/world/entity/monster/Strider.java
|
|
@@ -391,7 +391,7 @@ public class Strider extends Animal implements ItemSteerable {
|
|
|
|
@Override
|
|
protected boolean canAddPassenger(Entity passenger) {
|
|
- return !this.isVehicle() && !this.isEyeInFluid(FluidTags.LAVA);
|
|
+ return !this.isVehicle() && !this.isEyeInLava(); // Leaf - Optimize isEyeInFluid
|
|
}
|
|
|
|
@Override
|
|
diff --git a/net/minecraft/world/entity/monster/Witch.java b/net/minecraft/world/entity/monster/Witch.java
|
|
index 4b253ae8149f5d9505c5140a00a96d8c8850b1c4..bfb0e3381abb93bea1079fb0d476cf856fca442e 100644
|
|
--- a/net/minecraft/world/entity/monster/Witch.java
|
|
+++ b/net/minecraft/world/entity/monster/Witch.java
|
|
@@ -178,7 +178,7 @@ public class Witch extends Raider implements RangedAttackMob {
|
|
}
|
|
} else {
|
|
Holder<Potion> holder = null;
|
|
- if (this.random.nextFloat() < 0.15F && this.isEyeInFluid(FluidTags.WATER) && !this.hasEffect(MobEffects.WATER_BREATHING)) {
|
|
+ if (this.random.nextFloat() < 0.15F && this.isEyeInWater() && !this.hasEffect(MobEffects.WATER_BREATHING)) { // Leaf - Optimize isEyeInFluid
|
|
holder = Potions.WATER_BREATHING;
|
|
} else if (this.random.nextFloat() < 0.15F
|
|
&& (this.isOnFire() || this.getLastDamageSource() != null && this.getLastDamageSource().is(DamageTypeTags.IS_FIRE))
|
|
diff --git a/net/minecraft/world/entity/monster/Zombie.java b/net/minecraft/world/entity/monster/Zombie.java
|
|
index 202dca0a106a1610d8e58b7e9ba0c612998dd868..c27aa33e667abd89c10708f64b172efdf2f07a60 100644
|
|
--- a/net/minecraft/world/entity/monster/Zombie.java
|
|
+++ b/net/minecraft/world/entity/monster/Zombie.java
|
|
@@ -286,7 +286,7 @@ public class Zombie extends Monster {
|
|
this.doUnderWaterConversion();
|
|
}
|
|
} else if (this.convertsInWater()) {
|
|
- if (this.isEyeInFluid(FluidTags.WATER)) {
|
|
+ if (this.isEyeInWater()) { // Leaf - Optimize isEyeInFluid
|
|
this.inWaterTime++;
|
|
if (this.inWaterTime >= 600) {
|
|
this.startUnderWaterConversion(300);
|
|
diff --git a/net/minecraft/world/entity/player/Player.java b/net/minecraft/world/entity/player/Player.java
|
|
index 2da9d6a2c12f490bda2cd0b9fb83fa35749f8761..108ef0759e4060fc02d517175731f413c7e2532f 100644
|
|
--- a/net/minecraft/world/entity/player/Player.java
|
|
+++ b/net/minecraft/world/entity/player/Player.java
|
|
@@ -398,7 +398,7 @@ public abstract class Player extends LivingEntity {
|
|
this.lastItemInMainHand = mainHandItem.copy();
|
|
}
|
|
|
|
- if (!this.isEyeInFluid(FluidTags.WATER) && this.isEquipped(Items.TURTLE_HELMET)) {
|
|
+ if (!this.isEyeInWater() && this.isEquipped(Items.TURTLE_HELMET)) { // Leaf - Optimize isEyeInFluid
|
|
this.turtleHelmetTick();
|
|
}
|
|
|
|
@@ -438,8 +438,7 @@ public abstract class Player extends LivingEntity {
|
|
}
|
|
|
|
protected boolean updateIsUnderwater() {
|
|
- this.wasUnderwater = this.isEyeInFluid(FluidTags.WATER);
|
|
- return this.wasUnderwater;
|
|
+ return this.wasUnderwater = this.isEyeInWater(); // Leaf - Optimize isEyeInFluid
|
|
}
|
|
|
|
@Override
|
|
@@ -845,7 +844,7 @@ public abstract class Player extends LivingEntity {
|
|
}
|
|
|
|
destroySpeed *= (float)this.getAttributeValue(Attributes.BLOCK_BREAK_SPEED);
|
|
- if (this.isEyeInFluid(FluidTags.WATER)) {
|
|
+ if (this.isEyeInWater()) { // Leaf - Optimize isEyeInFluid
|
|
destroySpeed *= (float)this.getAttribute(Attributes.SUBMERGED_MINING_SPEED).getValue();
|
|
}
|
|
|
|
diff --git a/net/minecraft/world/entity/vehicle/AbstractBoat.java b/net/minecraft/world/entity/vehicle/AbstractBoat.java
|
|
index d947801b616af5b5dcdcc8bb70b36f97d6a69fdd..678badf7622b81e94c973bed2082fbfafa596b24 100644
|
|
--- a/net/minecraft/world/entity/vehicle/AbstractBoat.java
|
|
+++ b/net/minecraft/world/entity/vehicle/AbstractBoat.java
|
|
@@ -793,7 +793,7 @@ public abstract class AbstractBoat extends VehicleEntity implements Leashable {
|
|
|
|
@Override
|
|
protected boolean canAddPassenger(Entity passenger) {
|
|
- return this.getPassengers().size() < this.getMaxPassengers() && !this.isEyeInFluid(FluidTags.WATER);
|
|
+ return this.getPassengers().size() < this.getMaxPassengers() && !this.isEyeInWater(); // Leaf - Optimize isEyeInFluid
|
|
}
|
|
|
|
protected int getMaxPassengers() {
|