diff options
Diffstat (limited to 'src/main/java/gregtech/api/util')
-rw-r--r-- | src/main/java/gregtech/api/util/GT_SpawnEventHandler.java | 39 |
1 files changed, 33 insertions, 6 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; } } } |