blob: 64200f9825d98bf3314f1fba166fee8eb387953e [file] [log] [blame] [raw]
package mekanism.common.multipart;
import java.util.Collections;
import mekanism.api.Coord4D;
import mekanism.api.EnumColor;
import mekanism.client.render.RenderGlowPanel;
import mekanism.common.MekanismItems;
import net.minecraft.client.particle.EffectRenderer;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.IIcon;
import net.minecraft.util.MovingObjectPosition;
import net.minecraftforge.common.util.ForgeDirection;
import codechicken.lib.data.MCDataInput;
import codechicken.lib.data.MCDataOutput;
import codechicken.lib.vec.Cuboid6;
import codechicken.lib.vec.Rotation;
import codechicken.lib.vec.Translation;
import codechicken.lib.vec.Vector3;
import codechicken.microblock.HollowMicroblock;
import codechicken.multipart.IconHitEffects;
import codechicken.multipart.JCuboidPart;
import codechicken.multipart.JIconHitEffects;
import codechicken.multipart.JNormalOcclusion;
import codechicken.multipart.NormalOcclusionTest;
import codechicken.multipart.TMultiPart;
import codechicken.multipart.TileMultipart;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
public class PartGlowPanel extends JCuboidPart implements JNormalOcclusion, JIconHitEffects
{
public EnumColor colour = EnumColor.WHITE;
public ForgeDirection side = ForgeDirection.DOWN;
public static Cuboid6[] bounds = new Cuboid6[6];
static
{
Cuboid6 cuboid = new Cuboid6(0.25, 0, 0.25, 0.75, 0.125, 0.75);
Translation fromOrigin = new Translation(Vector3.center);
Translation toOrigin = (Translation)fromOrigin.inverse();
for(int i = 0; i < 6; i++)
{
bounds[i] = cuboid.copy().apply(toOrigin).apply(Rotation.sideRotations[i]).apply(fromOrigin);
}
}
public PartGlowPanel()
{
super();
}
public PartGlowPanel(EnumColor colour, ForgeDirection side)
{
super();
setColour(colour);
setOrientation(side);
}
@Override
public Cuboid6 getBounds()
{
return bounds[side.ordinal()];
}
@Override
public String getType()
{
return "mekanism:glow_panel";
}
public void setColour(EnumColor newColour)
{
colour = newColour;
}
public void setOrientation(ForgeDirection newSide)
{
side = newSide;
}
@Override
public void onNeighborChanged()
{
if(!world().isRemote && !canStay())
{
TileMultipart.dropItem(new ItemStack(MekanismItems.GlowPanel, 1, colour.getMetaValue()), world(), Vector3.fromTileEntityCenter(tile()));
tile().remPart(this);
}
}
@Override
public void onPartChanged(TMultiPart other)
{
if(!world().isRemote && !canStay())
{
TileMultipart.dropItem(new ItemStack(MekanismItems.GlowPanel, 1, colour.getMetaValue()), world(), Vector3.fromTileEntityCenter(tile()));
tile().remPart(this);
}
}
@Override
public void writeDesc(MCDataOutput data)
{
data.writeInt(side.ordinal());
data.writeInt(colour.getMetaValue());
}
@Override
public void readDesc(MCDataInput data)
{
side = ForgeDirection.getOrientation(data.readInt());
colour = EnumColor.DYES[data.readInt()];
}
@Override
public void save(NBTTagCompound nbt)
{
nbt.setInteger("side", side.ordinal());
nbt.setInteger("colour", colour.getMetaValue());
}
@Override
public void load(NBTTagCompound nbt)
{
side = ForgeDirection.getOrientation(nbt.getInteger("side"));
colour = EnumColor.DYES[nbt.getInteger("colour")];
}
@Override
@SideOnly(Side.CLIENT)
public boolean renderStatic(Vector3 pos, int pass)
{
if(pass == 0)
{
RenderGlowPanel.getInstance().renderStatic(this);
return true;
}
return false;
}
@Override
public int getLightValue()
{
return 15;
}
@Override
public Iterable<Cuboid6> getOcclusionBoxes()
{
return getCollisionBoxes();
}
@Override
public boolean occlusionTest(TMultiPart other)
{
return NormalOcclusionTest.apply(this, other);
}
@Override
public IIcon getBreakingIcon(Object subPart, int side)
{
return RenderGlowPanel.icon;
}
@Override
public IIcon getBrokenIcon(int side)
{
return RenderGlowPanel.icon;
}
@Override
public void addHitEffects(MovingObjectPosition hit, EffectRenderer effectRenderer)
{
IconHitEffects.addHitEffects(this, hit, effectRenderer);
}
@Override
public void addDestroyEffects(MovingObjectPosition mop, EffectRenderer effectRenderer)
{
IconHitEffects.addDestroyEffects(this, effectRenderer, false);
}
@Override
public Iterable<ItemStack> getDrops()
{
return Collections.singletonList(pickItem(null));
}
@Override
public ItemStack pickItem(MovingObjectPosition hit)
{
return new ItemStack(MekanismItems.GlowPanel, 1, colour.getMetaValue());
}
@Override
public boolean doesTick()
{
return false;
}
public boolean canStay()
{
Coord4D adj = Coord4D.get(tile()).getFromSide(side);
return world().isSideSolid(adj.xCoord, adj.yCoord, adj.zCoord, side.getOpposite()) || tile().partMap(side.ordinal()) instanceof HollowMicroblock;
}
}