From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Martijn Muijsers Date: Thu, 24 Nov 2022 10:31:38 +0100 Subject: [PATCH] Reduce in wall checks License: GPL-3.0 (https://www.gnu.org/licenses/gpl-3.0.html) Gale - https://galemc.org This patch is based on the following patch: "Optimize suffocation" By: Kevin Raneri As part of: Pufferfish (https://github.com/pufferfish-gg/Pufferfish) Licensed under: GPL-3.0 (https://www.gnu.org/licenses/gpl-3.0.html) * Pufferfish description * The isInWall check to determine suffocation is quite expensive, and often is completely unnecessary to check. We do two things here to improve this: 1. We only check for suffocation once per 20 ticks. The maximum no-damage ticks value means that this change should be extremely difficult, if not impossible, for players to notice. 2. We additionally execute a check to see if the player can even take damage in the first place. This check doesn't improve performance much but is so much cheaper than the suffocation check that it's worth keeping it. diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java index 3b3b4adc1c1a298e15c88aa115f4137742a7ab51..c7b8c58a67a4e6f4a98730c7ef9f62072b788bc3 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java @@ -400,7 +400,10 @@ public abstract class LivingEntity extends Entity { boolean flag = this instanceof net.minecraft.world.entity.player.Player; if (!this.level.isClientSide) { - if (this.isInWall()) { + // Gale start - Pufferfish - reduce in wall checks + long checkStuckInWallInterval = this.level.galeConfig().smallOptimizations.reducedIntervals.checkStuckInWall; + if ((checkStuckInWallInterval <= 1 || (tickCount % checkStuckInWallInterval == 0 && couldPossiblyBeHurt(1.0F))) && this.isInWall()) { + // Gale end - Pufferfish - reduce in wall checks this.hurt(DamageSource.IN_WALL, 1.0F); } else if (flag && !this.level.getWorldBorder().isWithinBounds(this.getBoundingBox())) { double d0 = this.level.getWorldBorder().getDistanceToBorder(this) + this.level.getWorldBorder().getDamageSafeZone(); @@ -1324,6 +1327,15 @@ public abstract class LivingEntity extends Entity { return this.getHealth() <= 0.0F; } + // Gale start - Pufferfish - reduce in wall checks + public boolean couldPossiblyBeHurt(float amount) { + if ((float) this.invulnerableTime > (float) this.invulnerableDuration / 2.0F && amount <= this.lastHurt) { + return false; + } + return true; + } + // Gale end - Pufferfish - reduce in wall checks + @Override public boolean hurt(DamageSource source, float amount) { if (this.isInvulnerableTo(source)) { diff --git a/src/main/java/org/galemc/gale/configuration/GaleWorldConfiguration.java b/src/main/java/org/galemc/gale/configuration/GaleWorldConfiguration.java index b993c2276d14c0a384898e9705a1af6fa6d585cf..d34ee90eaf160a72d4898feed13d94b0b61eded3 100644 --- a/src/main/java/org/galemc/gale/configuration/GaleWorldConfiguration.java +++ b/src/main/java/org/galemc/gale/configuration/GaleWorldConfiguration.java @@ -101,6 +101,21 @@ public class GaleWorldConfiguration extends ConfigurationPart { public int acquirePoiForStuckEntity = 200; // Gale end - Airplane - reduce acquire POI for stuck entities + // Gale start - Pufferfish - reduce in wall checks + /** + * Interval at which to check whether an entity is stuck in a wall, to deal suffocation damage. + * Since after dealing damage, there is an interval (this may change in the future, but approximately + * 1 second) at which entities cannot take repeated damage, delaying the suffocation check by less is + * almost unnoticeable. + * Any value <= 0 behaves like 1. + * + */ + public int checkStuckInWall = 10; + // Gale end - Pufferfish - reduce in wall checks + } }