2025-02-09 18:39:15 +11:00

137 lines
3.9 KiB
Java

package com.hbm.blocks.generic;
import com.hbm.blocks.BlockEnumMulti;
import com.hbm.world.gen.INBTTransformable;
import cpw.mods.fml.client.registry.RenderingRegistry;
import net.minecraft.block.material.Material;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.item.ItemStack;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.MathHelper;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
public class BlockDecoModel extends BlockEnumMulti implements INBTTransformable {
public BlockDecoModel(Material mat, Class<? extends Enum> theEnum, boolean multiName, boolean multiTexture) {
super(mat, theEnum, multiName, multiTexture);
}
public static int renderID = RenderingRegistry.getNextAvailableRenderId();
@Override
public int getRenderType() {
return renderID;
}
@Override
public boolean isOpaqueCube() {
return false;
}
@Override
public boolean renderAsNormalBlock() {
return false;
}
//Did somebody say - pain?
//Alright fuckers, looks like 2/b010 = North, 3/b011 = South, 4/b100 = West, 5/b101 = East for sides.
//I'll just opt for something similar (0/b00 North, 1/b01 South, 2/b10 West, 3/b11 East)
//Assumes meta is using the third and fourth bits.
@Override
public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack stack) {
int i = MathHelper.floor_double(player.rotationYaw * 4.0F / 360.0F + 0.5D) & 3;
int meta;
if((i & 1) != 1)
meta = i >> 1; //For North(b00>b00) and South(b10>b01), shift bits right by one
else {
if(i == 3)
meta = 2; //For West(b11>b10), just set to 2
else
meta = 3; //For East(b01>b11), just set to 3
}
world.setBlockMetadataWithNotify(x, y, z, (meta << 2) | stack.getItemDamage(), 2);
}
@Override
public int damageDropped(int meta) {
return meta & 3;
}
//These are separate because they have to be constant
private float mnX = 0.0F; //min
private float mnY = 0.0F;
private float mnZ = 0.0F;
private float mxX = 1.0F; //max
private float mxY = 1.0F;
private float mxZ = 1.0F;
public BlockDecoModel setBlockBoundsTo(float minX, float minY, float minZ, float maxX, float maxY, float maxZ) {
mnX = minX;
mnY = minY;
mnZ = minZ;
mxX = maxX;
mxY = maxY;
mxZ = maxZ;
return this;
}
@Override
public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) {
switch(world.getBlockMetadata(x, y, z) >> 2) {
case 0://North
this.setBlockBounds(1 - mxX, mnY, 1 - mxZ, 1 - mnX, mxY, 1 - mnZ);
break;
case 1://South
this.setBlockBounds(mnX, mnY, mnZ, mxX, mxY, mxZ);
break;
case 2://West
this.setBlockBounds(1 - mxZ, mnY, mnX, 1 - mnZ, mxY, mxX);
break;
case 3://East
this.setBlockBounds(mnZ, mnY, 1 - mxX, mxZ, mxY, 1 - mnX);
break;
}
}
@Override
public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) {
this.setBlockBoundsBasedOnState(world, x, y, z);
return AxisAlignedBB.getBoundingBox(x + this.minX, y + this.minY, z + this.minZ, x + this.maxX, y + this.maxY, z + this.maxZ);
}
@Override
public int transformMeta(int meta, int coordBaseMode) {
//N: 0b00, S: 0b01, W: 0b10, E: 0b11
int rot = meta >> 2;
int type = meta & 3;
switch(coordBaseMode) {
default: //South
break;
case 1: //West
if((rot & 3) < 2) //N & S can just have bits toggled
rot = rot ^ 3;
else //W & E can just have first bit set to 0
rot = rot ^ 2;
break;
case 2: //North
rot = rot ^ 1; //N, W, E & S can just have first bit toggled
break;
case 3: //East
if((rot & 3) < 2)//N & S can just have second bit set to 1
rot = rot ^ 2;
else //W & E can just have bits toggled
rot = rot ^ 3;
break;
}
//genuinely like. why did i do that
return (rot << 2) | type; //To accommodate for BlockDecoModel's shift in the rotation bits; otherwise, simply bit-shift right and or any non-rotation meta after
}
}