aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gregtech
diff options
context:
space:
mode:
authorJason Mitchell <jason@puzzle.io>2023-01-06 02:00:26 -0800
committerGitHub <noreply@github.com>2023-01-06 11:00:26 +0100
commitc61a6c5cdeaee7fbf2a6d183c2daa69fa761af04 (patch)
treeb416f33388e95b0c5690c3c7008845c9d2f22cb9 /src/main/java/gregtech
parent7015c5b2eb5b081e1a477cf430a8173b2de6d206 (diff)
downloadGT5-Unofficial-c61a6c5cdeaee7fbf2a6d183c2daa69fa761af04.tar.gz
GT5-Unofficial-c61a6c5cdeaee7fbf2a6d183c2daa69fa761af04.tar.bz2
GT5-Unofficial-c61a6c5cdeaee7fbf2a6d183c2daa69fa761af04.zip
Optimize `denyMobSpawn` slightly. (#1633)
* Optimize `denyMobSpawn` slightly. * Don't try to load the tile if we're outside of the max possible range of a Repellent
Diffstat (limited to 'src/main/java/gregtech')
-rw-r--r--src/main/java/gregtech/api/util/GT_SpawnEventHandler.java39
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_MonsterRepellent.java4
2 files changed, 35 insertions, 8 deletions
diff --git a/src/main/java/gregtech/api/util/GT_SpawnEventHandler.java b/src/main/java/gregtech/api/util/GT_SpawnEventHandler.java
index 38c43da7c2..0661ea56b7 100644
--- a/src/main/java/gregtech/api/util/GT_SpawnEventHandler.java
+++ b/src/main/java/gregtech/api/util/GT_SpawnEventHandler.java
@@ -2,6 +2,7 @@ package gregtech.api.util;
import cpw.mods.fml.common.eventhandler.Event;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
+import gregtech.api.enums.GT_Values;
import gregtech.api.metatileentity.BaseMetaTileEntity;
import gregtech.common.tileentities.machines.basic.GT_MetaTileEntity_MonsterRepellent;
import java.util.List;
@@ -15,13 +16,28 @@ import net.minecraftforge.event.entity.living.LivingSpawnEvent.CheckSpawn;
public class GT_SpawnEventHandler {
public static volatile List<int[]> mobReps = new CopyOnWriteArrayList<>();
+ // Future Optimiztation ideas, if this isn't sufficient
+ // 1: Keep a weakref list of mob repellents so we already have the tile
+ // 2: Have the tick method update a HashMap of (int[], range) so we don't have to load the tile at all
public GT_SpawnEventHandler() {
MinecraftForge.EVENT_BUS.register(this);
}
+ // Range of a powered repellent
+ public static int getPoweredRepellentRange(int aTier) {
+ return 16 + (48 * aTier);
+ }
+
+ // Range of an unpowered repellent
+ public static int getUnpoweredRepellentRange(int aTier) {
+ return 4 + (12 * aTier);
+ }
+
@SubscribeEvent
public void denyMobSpawn(CheckSpawn event) {
+ if (event.getResult() == Event.Result.DENY) return;
+
if (event.entityLiving instanceof EntitySlime
&& !(((EntitySlime) event.entityLiving).getCustomNameTag().length() > 0)) {
if (event.getResult() == Event.Result.ALLOW) event.setResult(Event.Result.DEFAULT);
@@ -32,21 +48,32 @@ public class GT_SpawnEventHandler {
}
if (event.entityLiving.isCreatureType(EnumCreatureType.monster, false)) {
+ final double maxRangeCheck = Math.pow(getUnpoweredRepellentRange(GT_Values.V.length - 1), 2);
for (int[] rep : mobReps) {
if (rep[3] == event.entity.worldObj.provider.dimensionId) {
- TileEntity tTile = event.entity.worldObj.getTileEntity(rep[0], rep[1], rep[2]);
+ // If the chunk isn't loaded, we ignore this Repellent
+ if (!event.entity.worldObj.blockExists(rep[0], rep[1], rep[2])) continue;
+ final double dx = rep[0] + 0.5F - event.entity.posX;
+ final double dy = rep[1] + 0.5F - event.entity.posY;
+ final double dz = rep[2] + 0.5F - event.entity.posZ;
+
+ final double check = (dx * dx + dz * dz + dy * dy);
+ // Fail early if outside of max range
+ if (check > maxRangeCheck) continue;
+
+ final TileEntity tTile = event.entity.worldObj.getTileEntity(rep[0], rep[1], rep[2]);
if (tTile instanceof BaseMetaTileEntity
&& ((BaseMetaTileEntity) tTile).getMetaTileEntity()
instanceof GT_MetaTileEntity_MonsterRepellent) {
- int r = ((GT_MetaTileEntity_MonsterRepellent) ((BaseMetaTileEntity) tTile).getMetaTileEntity())
+ final int r = ((GT_MetaTileEntity_MonsterRepellent)
+ ((BaseMetaTileEntity) tTile).getMetaTileEntity())
.mRange;
- double dx = rep[0] + 0.5F - event.entity.posX;
- double dy = rep[1] + 0.5F - event.entity.posY;
- double dz = rep[2] + 0.5F - event.entity.posZ;
- if ((dx * dx + dz * dz + dy * dy) <= Math.pow(r, 2)) {
+ if (check <= Math.pow(r, 2)) {
if (event.entityLiving instanceof EntitySlime)
((EntitySlime) event.entityLiving).setCustomNameTag("DoNotSpawnSlimes");
event.setResult(Event.Result.DENY);
+ // We're already DENYing it. No reason to keep checking
+ return;
}
}
}
diff --git a/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_MonsterRepellent.java b/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_MonsterRepellent.java
index e97be4e34a..65f62f240a 100644
--- a/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_MonsterRepellent.java
+++ b/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_MonsterRepellent.java
@@ -88,9 +88,9 @@ public class GT_MetaTileEntity_MonsterRepellent extends GT_MetaTileEntity_Tiered
}
if (aBaseMetaTileEntity.isUniversalEnergyStored(getMinimumStoredEU())
&& aBaseMetaTileEntity.decreaseStoredEnergyUnits(1L << (this.mTier * 2), false)) {
- mRange = 16 + (48 * mTier);
+ mRange = GT_SpawnEventHandler.getPoweredRepellentRange(mTier);
} else {
- mRange = 4 + (12 * mTier);
+ mRange = GT_SpawnEventHandler.getUnpoweredRepellentRange(mTier);
}
}
}