diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/CommonProxy.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/CommonProxy.java index 74580fca..7ca1e5ea 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/CommonProxy.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/CommonProxy.java @@ -8,6 +8,8 @@ import com.fouristhenumber.utilitiesinexcess.compat.Mods; import com.fouristhenumber.utilitiesinexcess.network.PacketHandler; import com.fouristhenumber.utilitiesinexcess.utils.SoundVolumeChecks; +import com.gtnewhorizon.gtnhlib.datastructs.space.ArrayProximityCheck4D; +import com.gtnewhorizon.gtnhlib.datastructs.space.VolumeShape; import com.gtnewhorizon.gtnhlib.keybind.SyncedKeybind; import cpw.mods.fml.common.event.FMLInitializationEvent; @@ -18,6 +20,7 @@ public class CommonProxy { public SoundVolumeChecks soundVolumeChecks; + public ArrayProximityCheck4D mobSpawnBlockChecks = new ArrayProximityCheck4D(VolumeShape.CUBE); public SyncedKeybind GLOVE_KEYBIND; diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java index 73d2eaa0..f98e3aea 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java @@ -18,11 +18,13 @@ import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockEnderLotus; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockEtherealGlass; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockFloating; +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockGigaTorch; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockInverted; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockLapisAetherius; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockMagicWood; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockMarginallyMaximisedChest; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockPacifistsBench; +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockPendantLight; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockPortalEndOfTime; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockPortalUnderWorld; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockPureLove; @@ -153,6 +155,8 @@ public enum ModBlocks { SMART_PUMP(BlockConfig.enableSmartPump, new BlockSmartPump(), "smart_pump"), TRADING_POST(BlockConfig.enableTradingPost, new BlockTradingPost(), "trading_post"), DECORATIVE_BLOCKS(BlockConfig.enableDecorativeBlocks, new BlockDecorative(), BlockDecorative.ItemBlockDecorative.class, "decorative_block"), + PENDANT_LIGHT(BlockConfig.pendantLight.enablePendantLight, new BlockPendantLight(), BlockPendantLight.ItemBlockPendantLight.class, "pendant_light"), + GIGA_TORCH(BlockConfig.gigaTorch.enableGigaTorch, new BlockGigaTorch(), BlockGigaTorch.ItemBlockGigaTorch.class, "giga_torch"), ; // leave trailing semicolon // spotless:on diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java index a4c9ea2f..2e00e508 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java @@ -18,8 +18,10 @@ import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityBlockUpdateDetector; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityConveyor; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityDrum; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityGigaTorch; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityMarginallyMaximisedChest; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityPacifistsBench; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityPendantLight; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityPortalUnderWorld; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityPureLove; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityRadicallyReducedChest; @@ -119,6 +121,8 @@ public void init(FMLInitializationEvent event) { GameRegistry.registerTileEntity(TileEntityRadicallyReducedChest.class, "TileEntityRadicallyReducedChestUIE"); GameRegistry.registerTileEntity(TileEntitySoundMuffler.class, "TileEntitySoundMufflerUIE"); GameRegistry.registerTileEntity(TileEntityRainMuffler.class, "TileEntityRainMufflerUIE"); + GameRegistry.registerTileEntity(TileEntityPendantLight.class, "TileEntityPendantLightUIE"); + GameRegistry.registerTileEntity(TileEntityGigaTorch.class, "TileEntityGigaTorchUIE"); GameRegistry.registerTileEntity(TileEntityBlockUpdateDetector.class, "TileEntityBlockUpdateDetector"); GameRegistry.registerTileEntity(TileEntityConveyor.class, "TileEntityConveyor"); GameRegistry.registerTileEntity(TileEntityPortalUnderWorld.class, "TileEntityPortalUnderWorld"); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/client/IMCForNEI.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/client/IMCForNEI.java index 40d8437a..ad3fae31 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/client/IMCForNEI.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/client/IMCForNEI.java @@ -183,6 +183,8 @@ public static void IMCSender() { sendInfoPage("", "nei.infopage.uie.underworld_portal.2"); sendInfoPage("", "nei.infopage.uie.underworld_portal.3"); + sendInfoPage("", "nei.infopage.uie.pendant_light.1"); + sendInfoPage("", "nei.infopage.uie.giga_torch.1"); sendInfoPage("", "nei.infopage.uie.trading_post.1"); } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockGigaTorch.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockGigaTorch.java new file mode 100644 index 00000000..6a8de0d5 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockGigaTorch.java @@ -0,0 +1,88 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks; + +import static net.minecraftforge.common.util.ForgeDirection.*; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityGigaTorch; +import com.fouristhenumber.utilitiesinexcess.config.blocks.BlockConfig; +import com.gtnewhorizon.gtnhlib.client.model.ModelISBRH; + +public class BlockGigaTorch extends BlockContainer { + + public BlockGigaTorch() { + super(Material.circuits); + setBlockName("giga_torch"); + setBlockTextureName("utilitiesinexcess:giga_torch"); + setHardness(0.0F); + setLightLevel(0.9375F); // 15 light level + setStepSound(soundTypeWood); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityGigaTorch(); + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public int getRenderType() { + return ModelISBRH.JSON_ISBRH_ID; + } + + @Override + public AxisAlignedBB getCollisionBoundingBoxFromPool(World worldIn, int x, int y, int z) { + return null; + } + + @Override + public boolean canPlaceBlockAt(World worldIn, int x, int y, int z) { + if (World.doesBlockHaveSolidTopSurface(worldIn, x, y - 1, z)) { + return true; + } else { + Block block = worldIn.getBlock(x, y - 1, z); + return block.canPlaceTorchOnTop(worldIn, x, y - 1, z); + } + } + + @Override + public void onNeighborBlockChange(World worldIn, int x, int y, int z, Block neighbor) { + if (!this.canPlaceBlockAt(worldIn, x, y, z) && worldIn.getBlock(x, y, z) == this) { + this.dropBlockAsItem(worldIn, x, y, z, 0, 0); + worldIn.setBlockToAir(x, y, z); + } + } + + public static class ItemBlockGigaTorch extends ItemBlock { + + public ItemBlockGigaTorch(Block block) { + super(block); + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean bool) { + tooltip.add( + StatCollector.translateToLocalFormatted("tile.giga_torch.desc", BlockConfig.gigaTorch.gigaTorchRange)); + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockPendantLight.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockPendantLight.java new file mode 100644 index 00000000..504a14dd --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockPendantLight.java @@ -0,0 +1,77 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks; + +import static net.minecraftforge.common.util.ForgeDirection.*; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityPendantLight; +import com.fouristhenumber.utilitiesinexcess.config.blocks.BlockConfig; +import com.gtnewhorizon.gtnhlib.client.model.ModelISBRH; + +public class BlockPendantLight extends BlockContainer { + + public BlockPendantLight() { + super(Material.circuits); + setBlockName("pendant_light"); + setBlockTextureName("utilitiesinexcess:pendant_light"); + setHardness(0.0F); + setLightLevel(0.9375F); // 15 light level + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityPendantLight(); + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public int getRenderType() { + return ModelISBRH.JSON_ISBRH_ID; + } + + @Override + public boolean canPlaceBlockOnSide(World worldIn, int x, int y, int z, int side) { + return worldIn.isSideSolid(x, y + 1, z, DOWN); + } + + @Override + public void onNeighborBlockChange(World worldIn, int x, int y, int z, Block neighbor) { + if (!this.canPlaceBlockAt(worldIn, x, y, z) && worldIn.getBlock(x, y, z) == this) { + this.dropBlockAsItem(worldIn, x, y, z, 0, 0); + worldIn.setBlockToAir(x, y, z); + } + } + + public static class ItemBlockPendantLight extends ItemBlock { + + public ItemBlockPendantLight(Block block) { + super(block); + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean bool) { + tooltip.add( + StatCollector + .translateToLocalFormatted("tile.pendant_light.desc", BlockConfig.pendantLight.pendantLightRange)); + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/events/MobDenySpawnEvents.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/events/MobDenySpawnEvents.java new file mode 100644 index 00000000..eea55867 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/events/MobDenySpawnEvents.java @@ -0,0 +1,51 @@ +package com.fouristhenumber.utilitiesinexcess.common.events; + +import net.minecraft.entity.EnumCreatureType; +import net.minecraft.entity.monster.EntitySlime; +import net.minecraftforge.event.entity.living.LivingSpawnEvent; + +import com.fouristhenumber.utilitiesinexcess.ModBlocks; +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import com.gtnewhorizon.gtnhlib.eventbus.EventBusSubscriber; + +import cpw.mods.fml.common.eventhandler.Event; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; + +@SuppressWarnings("unused") +@EventBusSubscriber() +public class MobDenySpawnEvents { + + @EventBusSubscriber.Condition + public static boolean shouldSubscribe() { + return ModBlocks.GIGA_TORCH.isEnabled(); + } + + // context https://github.com/GTNewHorizons/GT5-Unofficial/pull/905 + @SubscribeEvent + public static void denySpawn(LivingSpawnEvent.CheckSpawn event) { + if (event.getResult() == Event.Result.DENY) return; + + if (event.entityLiving instanceof EntitySlime slime && !slime.hasCustomNameTag() + && event.getResult() == Event.Result.ALLOW) { + event.setResult(Event.Result.DEFAULT); + } + + if (event.getResult() == Event.Result.ALLOW) { + return; + } + + if (event.entityLiving.isCreatureType(EnumCreatureType.monster, false)) { + if (UtilitiesInExcess.proxy.mobSpawnBlockChecks.isInRange( + event.entity.worldObj.provider.dimensionId, + event.entity.posX, + event.entity.posY, + event.entity.posZ)) { + if (event.entityLiving instanceof EntitySlime slime) { + slime.setCustomNameTag("DoNotSpawnSlimes"); + } + event.setResult(Event.Result.DENY); + } + } + } + +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityGigaTorch.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityGigaTorch.java new file mode 100644 index 00000000..4ee8ab1e --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityGigaTorch.java @@ -0,0 +1,29 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities; + +import net.minecraft.tileentity.TileEntity; + +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import com.fouristhenumber.utilitiesinexcess.config.blocks.BlockConfig; + +public class TileEntityGigaTorch extends TileEntity { + + @Override + public boolean canUpdate() { + return false; + } + + // placed or loaded from chunk + @Override + public void validate() { + super.validate(); + UtilitiesInExcess.proxy.mobSpawnBlockChecks + .put(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, BlockConfig.gigaTorch.gigaTorchRange); + } + + // removed or unloaded + @Override + public void invalidate() { + UtilitiesInExcess.proxy.mobSpawnBlockChecks.remove(worldObj.provider.dimensionId, xCoord, yCoord, zCoord); + super.invalidate(); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityPendantLight.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityPendantLight.java new file mode 100644 index 00000000..064691f2 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityPendantLight.java @@ -0,0 +1,29 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities; + +import net.minecraft.tileentity.TileEntity; + +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import com.fouristhenumber.utilitiesinexcess.config.blocks.BlockConfig; + +public class TileEntityPendantLight extends TileEntity { + + @Override + public boolean canUpdate() { + return false; + } + + // placed or loaded from chunk + @Override + public void validate() { + super.validate(); + UtilitiesInExcess.proxy.mobSpawnBlockChecks + .put(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, BlockConfig.pendantLight.pendantLightRange); + } + + // removed or unloaded + @Override + public void invalidate() { + UtilitiesInExcess.proxy.mobSpawnBlockChecks.remove(worldObj.provider.dimensionId, xCoord, yCoord, zCoord); + super.invalidate(); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/BlockConfig.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/BlockConfig.java index d06c02c4..b1fd8502 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/BlockConfig.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/BlockConfig.java @@ -165,6 +165,36 @@ public static class RainMuffler { public int rainMufflerRange; } + @Config.Comment("Pendant Light Configuration") + public static final PendantLight pendantLight = new PendantLight(); + + @Config.LangKey("utilitiesinexcess.config.block.pendant_light") + public static class PendantLight { + + @Config.DefaultBoolean(true) + public boolean enablePendantLight; + + @Config.Comment("The radius a pendant light blocks mob spawns (as a square box)") + @Config.DefaultInt(16) + @Config.RangeInt(min = 1, max = 256) + public int pendantLightRange; + } + + @Config.Comment("Giga Torch Configuration") + public static final GigaTorch gigaTorch = new GigaTorch(); + + @Config.LangKey("utilitiesinexcess.config.block.giga_torch") + public static class GigaTorch { + + @Config.DefaultBoolean(true) + public boolean enableGigaTorch; + + @Config.Comment("The radius a giga torch blocks mob spawns (as a square box)") + @Config.DefaultInt(64) + @Config.RangeInt(min = 1, max = 256) + public int gigaTorchRange; + } + @Config.Comment("Cursed Earth Configuration") public static final Spikes spikes = new Spikes(); diff --git a/src/main/resources/assets/utilitiesinexcess/blockstates/giga_torch.json b/src/main/resources/assets/utilitiesinexcess/blockstates/giga_torch.json new file mode 100644 index 00000000..fed10791 --- /dev/null +++ b/src/main/resources/assets/utilitiesinexcess/blockstates/giga_torch.json @@ -0,0 +1,5 @@ +{ + "variants": { + "": { "model": "utilitiesinexcess:blocks/giga_torch"} + } +} diff --git a/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang b/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang index 6ccead81..36e79fae 100644 --- a/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang +++ b/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang @@ -470,6 +470,14 @@ nei.infopage.uie.temporal_gate.3=Right-click the portal in any other dimension t nei.infopage.uie.temporal_gate.4=You will appear at the most recent portal placed in the End of Time. If it no longer exists, you will appear at the bedrock below where you originally entered. If even that is gone, the platform will reappear, replacing anything in its way. nei.infopage.uie.temporal_gate.5=§4§oWas that red star in the sky always there? +tile.pendant_light.name=Pendant Light +tile.pendant_light.desc=%d block radius (square) +nei.infopage.uie.pendant_light.1=A torch that prevents natural mob spawning in range. Spawners are not affected. Must hang from block + +tile.giga_torch.name=Giga Torch +tile.giga_torch.desc=%d block radius (square) +nei.infopage.uie.giga_torch.1=A torch that prevents natural mob spawning in range. Spawners are not affected. + tile.trading_post.name=Trading Post tile.trading_post.villager_count=Found %,d Villagers tile.trading_post.search_hint=Search... diff --git a/src/main/resources/assets/utilitiesinexcess/models/blocks/giga_torch.json b/src/main/resources/assets/utilitiesinexcess/models/blocks/giga_torch.json new file mode 100644 index 00000000..37d9bca6 --- /dev/null +++ b/src/main/resources/assets/utilitiesinexcess/models/blocks/giga_torch.json @@ -0,0 +1,86 @@ +{ + "format_version": "1.21.11", + "credit": "Made with Blockbench", + "textures": { + "0": "utilitiesinexcess:models/giga_torch" + }, + "elements": [ + { + "from": [ + 6, + 0, + 6 + ], + "to": [ + 10, + 12, + 10 + ], + "rotation": { + "angle": 0, + "axis": "y", + "origin": [ + 8, + 0, + 8 + ] + }, + "faces": { + "north": { + "uv": [ + 0, + 0, + 4, + 12 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 0, + 0, + 4, + 12 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 0, + 0, + 4, + 12 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 0, + 0, + 4, + 12 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 0, + 0, + 4, + 4 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 0, + 0, + 4, + 4 + ], + "texture": "#0" + } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/models/giga_torch.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/models/giga_torch.png new file mode 100644 index 00000000..c39edf16 Binary files /dev/null and b/src/main/resources/assets/utilitiesinexcess/textures/blocks/models/giga_torch.png differ