119 lines
4.3 KiB
Java

package com.hbm.blocks.test;
import java.util.Random;
import com.hbm.blocks.ModBlocks;
import com.hbm.lib.RefStrings;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack;
import net.minecraft.util.Facing;
import net.minecraft.util.IIcon;
import net.minecraft.util.MathHelper;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
public class TestCharge extends Block {
@SideOnly(Side.CLIENT)
private IIcon bottomIcon;
@SideOnly(Side.CLIENT)
private IIcon topIcon;
public TestCharge(Material mat) {
super(mat);
}
@Override
public int getRenderType() {
return 16;
}
@Override
public void onBlockPlacedBy(World p_149689_1_, int p_149689_2_, int p_149689_3_, int p_149689_4_, EntityLivingBase p_149689_5_, ItemStack p_149689_6_) {
int l = determineOrientation(p_149689_1_, p_149689_2_, p_149689_3_, p_149689_4_, p_149689_5_);
p_149689_1_.setBlockMetadataWithNotify(p_149689_2_, p_149689_3_, p_149689_4_, l, 2);
}
public static int determineOrientation(World p_150071_0_, int p_150071_1_, int p_150071_2_, int p_150071_3_, EntityLivingBase p_150071_4_) {
//instead of mirrored piston behavior, we could just scan for nearby cores and adjust it accordingly
if(MathHelper.abs((float) p_150071_4_.posX - (float) p_150071_1_) < 2.0F && MathHelper.abs((float) p_150071_4_.posZ - (float) p_150071_3_) < 2.0F) {
double d0 = p_150071_4_.posY + 1.82D - (double) p_150071_4_.yOffset;
if(d0 - (double) p_150071_2_ > 2.0D) {
return 0;
}
if((double) p_150071_2_ - d0 > 0.0D) {
return 1;
}
}
int l = MathHelper.floor_double((double) (p_150071_4_.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3;
return l == 0 ? 3 : (l == 1 ? 4 : (l == 2 ? 2 : (l == 3 ? 5 : 1)));
}
@SideOnly(Side.CLIENT)
public void registerBlockIcons(IIconRegister p_149651_1_) {
this.blockIcon = p_149651_1_.registerIcon(RefStrings.MODID + ":test_charge_side");
this.topIcon = p_149651_1_.registerIcon(RefStrings.MODID + ":test_charge_top");
this.bottomIcon = p_149651_1_.registerIcon(RefStrings.MODID + ":test_charge_bottom");
}
@SideOnly(Side.CLIENT)
public IIcon getIcon(int p_149691_1_, int p_149691_2_) {
int k = getPistonOrientation(p_149691_2_);
return k > 5 ? this.topIcon : (p_149691_1_ == k ? this.topIcon : (p_149691_1_ == Facing.oppositeSide[k] ? this.bottomIcon : this.blockIcon));
}
public static int getPistonOrientation(int p_150076_0_) {
return p_150076_0_ & 7;
}
@Override
public void onNeighborBlockChange(World world, int x, int y, int z, Block block) {
//instead of exploding outright, we schedule an update. this will let redstone lines transmit signals
//even if they are on top of the charge which would get destroyed, allowing for more compact designs
if(!world.isRemote && world.isBlockIndirectlyGettingPowered(x, y, z)) {
world.scheduledUpdatesAreImmediate = false;
world.scheduleBlockUpdate(x, y, z, this, 1);
}
}
@Override
public void updateTick(World world, int x, int y, int z, Random rand) {
if(!world.isRemote) {
ForgeDirection dir = ForgeDirection.getOrientation(getPistonOrientation(world.getBlockMetadata(x, y, z)));
//is our target a core?
if(world.getBlock(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ) == ModBlocks.test_core) {
//increment meta, schedule an update and set to air
world.setBlock(x, y, z, Blocks.air);
int core = world.getBlockMetadata(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ);
//this should be false by default and only true for special world gen, but some mods tend to leak immediate updates
world.scheduledUpdatesAreImmediate = false;
world.setBlockMetadataWithNotify(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ, core + 1, 4); //flag 4 causes no block update and no re-render on clients
world.scheduleBlockUpdate(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ, ModBlocks.test_core, 1); //set delay to 2 if 1 isn't enough
//if not, just explode, who cares
} else {
world.newExplosion(null, x + 0.5, y + 0.5, z + 0.5, 5.0F, false, true);
}
}
}
}