aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gtPlusPlus/core/block
diff options
context:
space:
mode:
authorRaven Szewczyk <git@eigenraven.me>2024-05-24 19:50:35 +0100
committerRaven Szewczyk <git@eigenraven.me>2024-05-24 19:50:35 +0100
commit6d1b2216464d4dad449ac6fcfec476832224a55e (patch)
tree526a0c15f7056313c80e6c0386e025e9b3f61781 /src/main/java/gtPlusPlus/core/block
parentb5d35f40afa606ed1b07061dad82e0521a59c186 (diff)
downloadGT5-Unofficial-6d1b2216464d4dad449ac6fcfec476832224a55e.tar.gz
GT5-Unofficial-6d1b2216464d4dad449ac6fcfec476832224a55e.tar.bz2
GT5-Unofficial-6d1b2216464d4dad449ac6fcfec476832224a55e.zip
Merge addon sources
Diffstat (limited to 'src/main/java/gtPlusPlus/core/block')
-rw-r--r--src/main/java/gtPlusPlus/core/block/ModBlocks.java104
-rw-r--r--src/main/java/gtPlusPlus/core/block/base/BasicBlock.java70
-rw-r--r--src/main/java/gtPlusPlus/core/block/base/BasicTileBlockWithTooltip.java322
-rw-r--r--src/main/java/gtPlusPlus/core/block/base/BlockBaseFluid.java102
-rw-r--r--src/main/java/gtPlusPlus/core/block/base/BlockBaseModular.java245
-rw-r--r--src/main/java/gtPlusPlus/core/block/base/BlockBaseOre.java217
-rw-r--r--src/main/java/gtPlusPlus/core/block/general/BlockCompressedObsidian.java100
-rw-r--r--src/main/java/gtPlusPlus/core/block/general/BlockSuperLight.java197
-rw-r--r--src/main/java/gtPlusPlus/core/block/general/FluidTankInfinite.java141
-rw-r--r--src/main/java/gtPlusPlus/core/block/general/HellFire.java535
-rw-r--r--src/main/java/gtPlusPlus/core/block/general/LightGlass.java137
-rw-r--r--src/main/java/gtPlusPlus/core/block/general/MiningExplosives.java193
-rw-r--r--src/main/java/gtPlusPlus/core/block/general/antigrief/BlockWitherProof.java161
-rw-r--r--src/main/java/gtPlusPlus/core/block/general/fluids/BlockFluidSludge.java68
-rw-r--r--src/main/java/gtPlusPlus/core/block/machine/CircuitProgrammer.java153
-rw-r--r--src/main/java/gtPlusPlus/core/block/machine/DecayablesChest.java186
-rw-r--r--src/main/java/gtPlusPlus/core/block/machine/FishTrap.java136
-rw-r--r--src/main/java/gtPlusPlus/core/block/machine/Machine_PestKiller.java137
-rw-r--r--src/main/java/gtPlusPlus/core/block/machine/Machine_PooCollector.java177
-rw-r--r--src/main/java/gtPlusPlus/core/block/machine/Machine_ProjectTable.java160
-rw-r--r--src/main/java/gtPlusPlus/core/block/machine/Machine_SuperJukebox.java558
-rw-r--r--src/main/java/gtPlusPlus/core/block/machine/VolumetricFlaskSetter.java157
22 files changed, 4256 insertions, 0 deletions
diff --git a/src/main/java/gtPlusPlus/core/block/ModBlocks.java b/src/main/java/gtPlusPlus/core/block/ModBlocks.java
new file mode 100644
index 0000000000..634a073b02
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/block/ModBlocks.java
@@ -0,0 +1,104 @@
+package gtPlusPlus.core.block;
+
+import net.minecraft.block.Block;
+import net.minecraftforge.fluids.Fluid;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.block.general.BlockCompressedObsidian;
+import gtPlusPlus.core.block.general.FluidTankInfinite;
+import gtPlusPlus.core.block.general.HellFire;
+import gtPlusPlus.core.block.general.LightGlass;
+import gtPlusPlus.core.block.general.MiningExplosives;
+import gtPlusPlus.core.block.general.antigrief.BlockWitherProof;
+import gtPlusPlus.core.block.machine.CircuitProgrammer;
+import gtPlusPlus.core.block.machine.DecayablesChest;
+import gtPlusPlus.core.block.machine.FishTrap;
+import gtPlusPlus.core.block.machine.Machine_PestKiller;
+import gtPlusPlus.core.block.machine.Machine_PooCollector;
+import gtPlusPlus.core.block.machine.Machine_ProjectTable;
+import gtPlusPlus.core.block.machine.Machine_SuperJukebox;
+import gtPlusPlus.core.block.machine.VolumetricFlaskSetter;
+import gtPlusPlus.core.fluids.FluidRegistryHandler;
+
+public final class ModBlocks {
+
+ public static Block blockCircuitProgrammer;
+ public static Block blockVolumetricFlaskSetter;
+
+ public static Block blockFishTrap;
+ public static Block blockDecayablesChest;
+
+ public static Block blockCasingsMisc;
+ public static Block blockCasings2Misc;
+ public static Block blockCasings3Misc;
+ public static Block blockCasings4Misc;
+ public static Block blockCasings5Misc;
+ public static Block blockCasings6Misc;
+ public static Block blockCasingsTieredGTPP;
+ public static Block blockSpecialMultiCasings;
+ public static Block blockSpecialMultiCasings2;
+ public static Block blockCustomMachineCasings;
+ public static Block blockCustomPipeGearCasings;
+
+ public static Block MatterFabricatorEffectBlock;
+
+ public static Fluid fluidSludge = new Fluid("fluid.sludge");
+ public static Block blockFluidSludge;
+
+ public static Block blockMiningExplosive;
+
+ public static Block blockHellfire;
+ public static Block blockInfiniteFLuidTank;
+ public static Block blockProjectTable;
+ public static Block blockWitherGuard;
+ public static Block blockCompressedObsidian;
+
+ public static Block blockPlayerDoorWooden;
+ public static Block blockPlayerDoorIron;
+ public static Block blockPlayerDoorCustom_Glass;
+ public static Block blockPlayerDoorCustom_Ice;
+ public static Block blockPlayerDoorCustom_Cactus;
+
+ public static Block blockCustomJukebox;
+
+ public static Block blockPooCollector;
+
+ public static Block blockPestKiller;
+
+ public static void init() {
+ Logger.INFO("Initializing Blocks.");
+
+ registerBlocks();
+ }
+
+ public static void registerBlocks() {
+
+ Logger.INFO("Registering Blocks.");
+ MatterFabricatorEffectBlock = new LightGlass(false);
+
+ // Fluids
+ FluidRegistryHandler.registerFluids();
+
+ // Workbench
+ blockFishTrap = new FishTrap();
+ blockInfiniteFLuidTank = new FluidTankInfinite();
+ blockMiningExplosive = new MiningExplosives();
+ blockHellfire = new HellFire();
+ blockProjectTable = new Machine_ProjectTable();
+ blockWitherGuard = new BlockWitherProof();
+ blockCompressedObsidian = new BlockCompressedObsidian();
+
+ blockCircuitProgrammer = new CircuitProgrammer();
+
+ blockDecayablesChest = new DecayablesChest();
+
+ blockCustomJukebox = new Machine_SuperJukebox();
+
+ blockPooCollector = new Machine_PooCollector();
+
+ blockPestKiller = new Machine_PestKiller();
+
+ blockVolumetricFlaskSetter = new VolumetricFlaskSetter();
+
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/block/base/BasicBlock.java b/src/main/java/gtPlusPlus/core/block/base/BasicBlock.java
new file mode 100644
index 0000000000..d39c194dfd
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/block/base/BasicBlock.java
@@ -0,0 +1,70 @@
+package gtPlusPlus.core.block.base;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import net.minecraft.block.BlockContainer;
+import net.minecraft.block.material.Material;
+import net.minecraft.entity.EnumCreatureType;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.util.Utils;
+
+public class BasicBlock extends BlockContainer {
+
+ public BasicBlock(BlockTypes type, final String unlocalizedName, final Material material, final int harvestLevel) {
+ super(material);
+ this.setBlockName(Utils.sanitizeString(unlocalizedName));
+
+ if (type != BlockTypes.ORE && !unlocalizedName.toLowerCase()
+ .contains("ore")) {
+ this.setBlockTextureName(GTPlusPlus.ID + ":" + unlocalizedName);
+ }
+
+ this.setCreativeTab(AddToCreativeTab.tabBlock);
+ this.setResistance(6.0F);
+ this.setLightLevel(0.0F);
+ this.setHardness(1.0f * harvestLevel);
+ this.setHarvestLevel("pickaxe", harvestLevel);
+ this.setStepSound(soundTypeMetal);
+ }
+
+ public static enum BlockTypes {
+
+ STANDARD("blockBlock", "pickaxe", soundTypeMetal),
+ FRAME("blockFrameGt", "wrench", soundTypeMetal),
+ ORE("blockStone", "pickaxe", soundTypeStone);
+
+ private final String TEXTURE_NAME;
+ private final String HARVEST_TOOL;
+ private final SoundType soundOfBlock;
+
+ BlockTypes(final String textureName, final String harvestTool, final SoundType blockSound) {
+ this.TEXTURE_NAME = textureName;
+ this.HARVEST_TOOL = harvestTool;
+ this.soundOfBlock = blockSound;
+ }
+
+ public String getTexture() {
+ return this.TEXTURE_NAME;
+ }
+
+ public String getHarvestTool() {
+ return this.HARVEST_TOOL;
+ }
+
+ }
+
+ @Override
+ public TileEntity createNewTileEntity(final World p_149915_1_, final int p_149915_2_) {
+ return null;
+ }
+
+ @Override
+ public boolean canCreatureSpawn(final EnumCreatureType type, final IBlockAccess world, final int x, final int y,
+ final int z) {
+ return false;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/block/base/BasicTileBlockWithTooltip.java b/src/main/java/gtPlusPlus/core/block/base/BasicTileBlockWithTooltip.java
new file mode 100644
index 0000000000..c39565ea41
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/block/base/BasicTileBlockWithTooltip.java
@@ -0,0 +1,322 @@
+package gtPlusPlus.core.block.base;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockContainer;
+import net.minecraft.block.material.Material;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.EnumCreatureType;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemBlock;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import appeng.core.CreativeTab;
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.api.interfaces.ITileTooltip;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.api.objects.minecraft.CubicObject;
+import gtPlusPlus.api.objects.minecraft.SafeTexture;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.minecraft.InventoryUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public abstract class BasicTileBlockWithTooltip extends BlockContainer implements ITileTooltip {
+
+ /**
+ * Each mapped object holds the data for the six sides.
+ */
+ @SideOnly(Side.CLIENT)
+ private AutoMap<CubicObject<SafeTexture>> mSidedTextureArray;
+
+ /**
+ * Holds the data for the six sides, each side holds an array of data for each respective meta.
+ */
+ @SideOnly(Side.CLIENT)
+ private AutoMap<CubicObject<String>> mSidedTexturePathArray;
+
+ /**
+ * Does this block have any meta at all?
+ */
+ public final boolean hasMeta() {
+ return getMetaCount() > 0;
+ }
+
+ /**
+ * The amount of meta this block has.
+ */
+ public abstract int getMetaCount();
+
+ /**
+ * Does this {@link Block} require special {@link ItemBlock} handling?
+ *
+ * @return The {@link Class} that will be used for this {@link Block}.
+ */
+ public Class<? extends ItemBlock> getItemBlockClass() {
+ return ItemBlock.class;
+ }
+
+ /**
+ * A lazy way to declare the unlocal name for the block, makes boilerplating easy.
+ *
+ * @return The internal name for this block.
+ */
+ public abstract String getUnlocalBlockName();
+
+ /**
+ * Lazy Boilerplating.
+ *
+ * @return Block Hardness.
+ */
+ protected abstract float initBlockHardness();
+
+ /**
+ * Lazy Boilerplating.
+ *
+ * @return Block Resistance.
+ */
+ protected abstract float initBlockResistance();
+
+ /**
+ * Lazy Boilerplating.
+ *
+ * @return The {@link CreativeTab} this Block is shown on.
+ */
+ protected abstract CreativeTabs initCreativeTab();
+
+ /**
+ * The ID used by the {@link ITileTooltip} handler. Return -1 if you are not providing a custom {@link ItemBlock} in
+ * {@link #getItemBlockClass}().
+ */
+ @Override
+ public abstract int getTooltipID();
+
+ public BasicTileBlockWithTooltip(Material aBlockMat) {
+ super(aBlockMat);
+ // Use Abstract method values
+ this.setHardness(initBlockHardness());
+ this.setResistance(initBlockResistance());
+ this.setBlockName(getUnlocalBlockName());
+ this.setCreativeTab(initCreativeTab());
+ // Register the block last.
+ GameRegistry.registerBlock(this, getItemBlockClass(), getUnlocalBlockName());
+ Logger.INFO("Registered " + getTileEntityName() + ".");
+ if (Utils.isClient()) {
+ // Handle Textures
+ handleTextures();
+ }
+ }
+
+ /**
+ * The name of the Tile Entity.
+ */
+ protected abstract String getTileEntityName();
+
+ /**
+ * The String used for texture pathing.
+ *
+ * @return Sanitized {@link String}, containing no spaces or illegal characters.
+ */
+ private String getTileEntityNameForTexturePathing() {
+ return Utils.sanitizeString(getTileEntityName().replace(" ", ""));
+ }
+
+ /**
+ * An array of CubicObjects, one for each meta, else just a single cell array. Expected to be null regularly, as the
+ * default texture handling should suffice. Handy if re-using textures or using a non-standard structure for them.
+ * FULL texture path must be used, inclusive of the MODID and a colon.
+ */
+ public CubicObject<String>[] getCustomTextureDirectoryObject() {
+ return null;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public final IIcon getIcon(final int ordinalSide, final int aMeta) {
+ return mSidedTextureArray.get(aMeta)
+ .get(ForgeDirection.getOrientation(ordinalSide))
+ .getIcon();
+ }
+
+ @Override
+ public IIcon getIcon(IBlockAccess aWorld, int aX, int aY, int aZ, int ordinalSide) {
+ return super.getIcon(aWorld, aX, aY, aZ, ordinalSide);
+ }
+
+ @SideOnly(Side.CLIENT)
+ private void handleTextures() {
+
+ Logger.INFO("[TeTexture] Building Texture Maps for " + getTileEntityName() + ".");
+
+ // Init on the Client side only, to prevent Field initialisers existing in the Server side bytecode.
+ mSidedTextureArray = new AutoMap<>();
+ mSidedTexturePathArray = new AutoMap<>();
+
+ // Store them in forge order
+ // DOWN, UP, NORTH, SOUTH, WEST, EAST
+
+ // Default Path Name, this will make us look inside 'miscutils\textures\blocks'
+ final String aPrefixTexPath = GTPlusPlus.ID + ":";
+ // Default Path Name, this will make us look in the subdirectory for this Tile Entity.
+ final String aTexPathMid = "TileEntities" + CORE.SEPERATOR
+ + getTileEntityNameForTexturePathing()
+ + CORE.SEPERATOR;
+ // Construct a full path
+ String aTexPathBuilt = aPrefixTexPath + aTexPathMid;
+ // File Name Suffixes, without meta tags
+ String aStringBot;
+ String aStringTop;
+ String aStringBack;
+ String aStringFront;
+ String aStringLeft;
+ String aStringRight;
+ // Do we provide a matrix of custom data to be used for texture processing instead?
+ if (getCustomTextureDirectoryObject() != null) {
+ // Get custom provided texture data.
+ CubicObject<String>[] aDataMap = getCustomTextureDirectoryObject();
+ Logger.INFO("[TeTexture] Found custom texture data, using this instead. Size: " + aDataMap.length);
+ // Map each meta string data to the main map.
+ for (int i = 0; i < aDataMap.length; i++) {
+ mSidedTexturePathArray.put(aDataMap[i]);
+ Logger.INFO("Mapped value for meta " + i + ".");
+ }
+ } else {
+ Logger.INFO("[TeTexture] Processing " + (1 + getMetaCount()) + " sets.");
+ // Iterate once for each meta
+ for (int i = 0; i < (1 + getMetaCount()); i++) {
+
+ // File Name Suffixes, without meta tags
+ aStringBot = "Bottom";
+ aStringTop = "Top";
+ aStringBack = "Back";
+ aStringFront = "Front";
+ aStringLeft = "Left";
+ aStringRight = "Right";
+
+ // Add tails if we have meta
+ if (hasMeta()) {
+ aStringBot = aStringBot + "_" + i;
+ aStringTop = aStringTop + "_" + i;
+ aStringBack = aStringBack + "_" + i;
+ aStringFront = aStringFront + "_" + i;
+ aStringLeft = aStringLeft + "_" + i;
+ aStringRight = aStringRight + "_" + i;
+ }
+ // Append the full path
+ aStringBot = aTexPathBuilt + aStringBot;
+ aStringTop = aTexPathBuilt + aStringTop;
+ aStringBack = aTexPathBuilt + aStringBack;
+ aStringFront = aTexPathBuilt + aStringFront;
+ aStringLeft = aTexPathBuilt + aStringLeft;
+ aStringRight = aTexPathBuilt + aStringRight;
+ // Convenience Blob
+ CubicObject<String> aMetaBlob = new CubicObject<>(
+ aStringBot,
+ aStringTop,
+ aStringBack,
+ aStringFront,
+ aStringLeft,
+ aStringRight);
+ mSidedTexturePathArray.put(aMetaBlob);
+ Logger.INFO("[TeTexture] Added Texture Path data to map for meta " + i);
+ }
+ }
+ Logger.INFO("[TeTexture] Map size for pathing: " + mSidedTexturePathArray.size());
+
+ // Iteration Index
+ int aIndex = 0;
+
+ // Iterate each CubicObject, holding the six texture paths for each meta.
+ for (CubicObject<String> aMetaBlob : mSidedTexturePathArray) {
+ // Make a Safe Texture for each side
+ SafeTexture aBottom = SafeTexture.register(aMetaBlob.DOWN);
+ SafeTexture aTop = SafeTexture.register(aMetaBlob.UP);
+ SafeTexture aBack = SafeTexture.register(aMetaBlob.NORTH);
+ SafeTexture aFont = SafeTexture.register(aMetaBlob.SOUTH);
+ SafeTexture aWest = SafeTexture.register(aMetaBlob.WEST);
+ SafeTexture aEast = SafeTexture.register(aMetaBlob.EAST);
+ // Store them in an Array
+ SafeTexture[] aInjectBlob = new SafeTexture[] { aBottom, aTop, aBack, aFont, aWest, aEast };
+ // Convenience Blob
+ CubicObject<SafeTexture> aMetaBlob2 = new CubicObject<>(aInjectBlob);
+ // Store this Blob into
+ mSidedTextureArray.put(aMetaBlob2);
+ Logger.INFO("[TeTexture] Added SafeTexture data to map for meta " + (aIndex++));
+ }
+ Logger.INFO("[TeTexture] Map size for registration: " + mSidedTextureArray.size());
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public final void registerBlockIcons(final IIconRegister aRegisterer) {}
+
+ @Override
+ public abstract TileEntity createNewTileEntity(final World world, final int p_149915_2_);
+
+ /**
+ * Called when {@link #breakBlock}() is called, but before {@link InventoryUtils#dropInventoryItems} and the super
+ * call.
+ */
+ public void onBlockBreak() {}
+
+ @Override
+ public final void breakBlock(final World world, final int x, final int y, final int z, final Block block,
+ final int number) {
+ onBlockBreak();
+ InventoryUtils.dropInventoryItems(world, x, y, z, block);
+ super.breakBlock(world, x, y, z, block, number);
+ }
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ @Override
+ public final void getSubBlocks(Item aItem, CreativeTabs p_149666_2_, List aList) {
+ if (hasMeta()) {
+ for (int i = 0; i < getMetaCount(); i++) {
+ aList.add(ItemUtils.simpleMetaStack(aItem, i, 1));
+ }
+ } else {
+ aList.add(ItemUtils.getSimpleStack(aItem));
+ }
+ }
+
+ @Override
+ public boolean canCreatureSpawn(final EnumCreatureType type, final IBlockAccess world, final int x, final int y,
+ final int z) {
+ return false;
+ }
+
+ /**
+ * Get the block's damage value (for use with pick block).
+ */
+ @Override
+ public int getDamageValue(World aWorld, int aX, int aY, int aZ) {
+ return aWorld.getBlockMetadata(aX, aY, aZ);
+ }
+
+ @Override
+ public Item getItemDropped(int meta, Random rand, int p_149650_3_) {
+ return ItemUtils.getSimpleStack(this, 1)
+ .getItem();
+ }
+
+ @Override
+ public ArrayList<ItemStack> getDrops(World world, int x, int y, int z, int metadata, int fortune) {
+ ArrayList<ItemStack> drops = new ArrayList<>();
+ drops.add(ItemUtils.simpleMetaStack(this, metadata, 1));
+ return drops;
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/block/base/BlockBaseFluid.java b/src/main/java/gtPlusPlus/core/block/base/BlockBaseFluid.java
new file mode 100644
index 0000000000..6772b71262
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/block/base/BlockBaseFluid.java
@@ -0,0 +1,102 @@
+package gtPlusPlus.core.block.base;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.Random;
+
+import net.minecraft.block.material.Material;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.entity.EnumCreatureType;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.BlockFluidClassic;
+import net.minecraftforge.fluids.Fluid;
+
+import cpw.mods.fml.client.FMLClientHandler;
+import cpw.mods.fml.common.Optional;
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.Mods;
+import gtPlusPlus.core.client.renderer.particle.EntityDropParticleFX;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.item.base.itemblock.ItemBlockMeta;
+import gtPlusPlus.core.util.Utils;
+
+public class BlockBaseFluid extends BlockFluidClassic {
+
+ private final String name;
+ private final IIcon[] textureArray = new IIcon[6];
+
+ protected float particleRed = 1.0F;
+ protected float particleGreen = 1.0F;
+ protected float particleBlue = 1.0F;
+
+ public BlockBaseFluid(String materialName, Fluid fluid, Material material) {
+ super(fluid, material);
+ this.setLightOpacity(2);
+ this.name = Utils.sanitizeString(materialName);
+ this.setBlockName("fluid" + this.name);
+ this.setCreativeTab(AddToCreativeTab.tabBlock);
+ GameRegistry.registerBlock(this, ItemBlockMeta.class, "fluid" + this.name);
+ }
+
+ @Override
+ public boolean canCreatureSpawn(EnumCreatureType arg0, IBlockAccess arg1, int arg2, int arg3, int arg4) {
+ return false;
+ }
+
+ public boolean preInit() {
+ return true;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIcon(int ordinalSide, int meta) {
+ return ordinalSide <= 1 ? this.textureArray[0] : this.textureArray[1];
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerBlockIcons(IIconRegister icon) {
+ this.textureArray[0] = icon.registerIcon(GTPlusPlus.ID + ":" + "fluid/" + "Fluid_" + this.name + "_Still");
+ this.textureArray[1] = icon.registerIcon(GTPlusPlus.ID + ":" + "fluid/" + "Fluid_" + this.name + "_Flow");
+ }
+
+ @Override
+ @Optional.Method(modid = Mods.Names.C_O_F_H_CORE)
+ @SideOnly(Side.CLIENT)
+ public void randomDisplayTick(World arg0, int arg1, int arg2, int arg3, Random arg4) {
+ super.randomDisplayTick(arg0, arg1, arg2, arg3, arg4);
+ double arg5 = arg1 + arg4.nextFloat();
+ double arg7 = arg2 - 1.05D;
+ double arg9 = arg3 + arg4.nextFloat();
+ if (super.density < 0) {
+ arg7 = arg2 + 2.1D;
+ }
+
+ if (arg4.nextInt(20) == 0
+ && arg0.isSideSolid(
+ arg1,
+ arg2 + super.densityDir,
+ arg3,
+ super.densityDir == -1 ? ForgeDirection.UP : ForgeDirection.DOWN)
+ && !arg0.getBlock(arg1, arg2 + 2 * super.densityDir, arg3)
+ .getMaterial()
+ .blocksMovement()) {
+ EntityDropParticleFX arg11 = new EntityDropParticleFX(
+ arg0,
+ arg5,
+ arg7,
+ arg9,
+ this.particleRed,
+ this.particleGreen,
+ this.particleBlue,
+ super.densityDir);
+ FMLClientHandler.instance()
+ .getClient().effectRenderer.addEffect(arg11);
+ }
+ }
+}
diff --git a/src/main/java/gtPlusPlus/core/block/base/BlockBaseModular.java b/src/main/java/gtPlusPlus/core/block/base/BlockBaseModular.java
new file mode 100644
index 0000000000..b07c6d1529
--- /dev/null
+++ b/src/main/java/gtPlusPlus/core/block/base/BlockBaseModular.java
@@ -0,0 +1,245 @@
+package gtPlusPlus.core.block.base;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static gregtech.api.enums.Mods.GregTech;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import net.minecraft.block.Block;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.IBlockAccess;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TextureSet;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_OreDictUnificator;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.item.base.itemblock.ItemBlockGtBlock;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class BlockBaseModular extends BasicBlock {
+
+ protected Material blockMaterial;
+
+ protected int blockColour;
+ public BlockTypes thisBlock;
+ protected String thisBlockMaterial;
+ protected String thisBlockMaterialTranslatedName;
+ protected final String thisBlockType;
+
+ private static final HashMap<String, Block> sBlockCache = new HashMap<>();
+
+ public static Block getMaterialBlock(Material aMaterial, BlockTypes aType) {
+ return sBlockCache.get(aMaterial.getUnlocalizedName() + "." + aType.name());
+ }
+
+ public BlockBaseModular(final Material material, final BlockTypes blockType) {
+ this(material, blockType, material.getRgbAsHex());
+ }
+
+ public BlockBaseModular(final Material material, final BlockTypes blockType, final int colour) {
+ this(
+ material.getUnlocalizedName(),
+ material.getLocalizedName(),
+ net.minecraft.block.material.Material.iron,
+ blockType,
+ colour,
+ Math.min(Math.max(material.vTier, 1), 6));
+ blockMaterial = material;
+ registerComponent();
+ sBlockCache.put(material.getUnlocalizedName() + "." + blockType.name(), this);
+ thisBlockMaterialTranslatedName = material.getTranslatedName();
+ GT_LanguageManager.addStringLocalization("gtplusplus." + getUnlocalizedName() + ".name", getProperName());
+ }
+
+ protected BlockBaseModular(final String unlocalizedName, final String blockMaterialString,
+ final net.minecraft.block.material.Material vanillaMaterial, final BlockTypes blockType, final int colour,
+ final int miningLevel) {
+ super(blockType, unlocalizedName, vanillaMaterial, miningLevel);
+ this.setHarvestLevel(blockType.getHarvestTool(), miningLevel);
+ this.setBlockTextureName(GTPlusPlus.ID + ":" + blockType.getTexture());
+ this.blockColour = colour;
+ this.thisBlock = blockType;
+ this.thisBlockMaterial = blockMaterialString;
+ this.thisBlockType = blockType.name()
+ .toUpperCase();
+ this.setBlockName(this.getUnlocalizedProperName());
+ int fx = getBlockTypeMeta();
+ GameRegistry.registerBlock(
+ this,
+ ItemBlockGtBlock.class,
+ Utils.sanitizeString(blockType.getTexture() + unlocalizedName));
+ if (fx == 0) {
+ GT_OreDictUnificator
+ .registerOre("block" + unifyMaterialName(thisBlockMaterial), ItemUtils.getSimpleStack(this));
+ } else if (fx == 1) {
+ GT_OreDictUnificator
+ .registerOre("frameGt" + unifyMaterialName(thisBlockMaterial), ItemUtils.getSimpleStack(this));
+ } else if (fx == 2) {
+ GT_OreDictUnificator
+ .registerOre("frameGt" + unifyMaterialName(thisBlockMaterial), ItemUtils.getSimpleStack(this));
+ }
+ }
+
+ public static String unifyMaterialName(String rawMaterName) {
+ return rawMaterName.replace(" ", "")
+ .replace("-", "")
+ .replace("_", "");
+ }
+
+ public void registerComponent() {
+ Logger.MATERIALS("Attempting to register " + this.getUnlocalizedName() + ".");
+ if (this.blockMaterial == null) {
+ Logger.MATERIALS("Tried to register " + this.getUnlocalizedName() + " but the material was null.");
+ return;
+ }
+ String aName = blockMaterial.getUnlocalizedName();
+ // Register Component
+ Map<String, ItemStack> aMap = Material.mComponentMap.get(aName);
+ if (aMap == null) {
+ aMap = new HashMap<>();
+ }
+ int fx = getBlockTypeMeta();
+ String aKey = (fx == 0 ? OrePrefixes.block.name()
+ : (fx == 1 ? OrePrefixes.frameGt.name() : OrePrefixes.ore.name()));
+ ItemStack x = aMap.get(aKey);
+ if (x == null) {
+ aMap.put(aKey, ItemUtils.getSimpleStack(this));
+ Logger.MATERIALS("Registering a material component. Item: [" + aName + "] Map: [" + aKey + "]");
+ Material.mComponentMap.put(aName, aMap);
+ } else {
+ // Bad
+ Logger.MATERIALS("Tried to double register a material component.");
+ }
+ }
+
+ public int getBlockTypeMeta() {
+ if (this.thisBlockType.equals(
+ BlockTypes.STANDARD.name()
+ .toUpperCase())) {
+ return 0;
+ } else if (this.thisBlockType.equals(
+ BlockTypes.FRAME.name()
+ .toUpperCase())) {
+ return 1;
+ } else
+ if (this.thisBlockType.equals(
+ BlockTypes.ORE.name()
+ .toUpperCase())) {
+ return 2;
+ }
+ return 0;
+ }
+
+ /**
+ * Returns which pass should this block be rendered on. 0 for solids and 1 for alpha
+ */