/**
* This class was created by <Vazkii>. It's distributed as
* part of the Botania Mod. Get the Source Code in github:
* https://github.com/Vazkii/Botania
*
* Botania is Open Source and distributed under the
* Botania License: http://botaniamod.net/license.php
*
* File Created @ [May 29, 2015, 8:21:17 PM (GMT)]
*/
package vazkii.botania.common.block.tile;
import net.minecraft.block.state.IBlockState;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.ScaledResolution;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.RenderHelper;
import net.minecraft.client.resources.I18n;
import net.minecraft.init.Blocks;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.StringUtils;
import net.minecraft.util.math.BlockPos;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import vazkii.botania.api.internal.VanillaPacketDispatcher;
import vazkii.botania.api.item.IHourglassTrigger;
import vazkii.botania.api.state.BotaniaStateProps;
import vazkii.botania.common.item.ModItems;
import javax.annotation.Nonnull;
public class TileHourglass extends TileSimpleInventory {
private static final String TAG_TIME = "time";
private static final String TAG_TIME_FRACTION = "timeFraction";
private static final String TAG_FLIP = "flip";
private static final String TAG_FLIP_TICKS = "flipTicks";
private static final String TAG_LOCK = "lock";
private static final String TAG_MOVE = "move";
private int time = 0;
public float timeFraction = 0F;
public float lastFraction = 0;
public boolean flip = false;
public int flipTicks = 0;
public boolean lock = false;
public boolean move = true;
public boolean dust = false;
@Override
public void update() {
int totalTime = getTotalTime();
ItemStack dustStack = itemHandler.getStackInSlot(0);
dust = !dustStack.isEmpty() && dustStack.getItem() == ModItems.manaResource;
if(totalTime > 0 || dust) {
if(move && !dust)
time++;
if(time >= totalTime) {
time = 0;
flip = !flip;
flipTicks = 4;
if(!world.isRemote) {
world.setBlockState(getPos(), world.getBlockState(getPos()).withProperty(BotaniaStateProps.POWERED, true), 1 | 2);
VanillaPacketDispatcher.dispatchTEToNearbyPlayers(this);
world.scheduleUpdate(pos, getBlockType(), getBlockType().tickRate(world));
}
for(EnumFacing facing : EnumFacing.VALUES) {
BlockPos pos = getPos().offset(facing);
IBlockState state = world.getBlockState(pos);
if(state.getBlock() instanceof IHourglassTrigger)
((IHourglassTrigger) state.getBlock()).onTriggeredByHourglass(world, pos, this);
}
}
lastFraction = timeFraction;
timeFraction = (float) time / (float) totalTime;
} else {
time = 0;
lastFraction = 0F;
timeFraction = 0F;
}
if(flipTicks > 0)
flipTicks--;
}
public void onManaCollide() {
if(!world.isRemote) {
if(dust)
time++;
else move = !move;
VanillaPacketDispatcher.dispatchTEToNearbyPlayers(this);
}
}
public int getTotalTime() {
ItemStack stack = itemHandler.getStackInSlot(0);
if(stack.isEmpty())
return 0;
return getStackItemTime(stack) * stack.getCount();
}
public static int getStackItemTime(ItemStack stack) {
if(stack.isEmpty())
return 0;
if(stack.getItem() == Item.getItemFromBlock(Blocks.SAND))
return stack.getItemDamage() == 1 ? 200 : 20;
if(stack.getItem() == Item.getItemFromBlock(Blocks.SOUL_SAND))
return 1200;
if(stack.getItem() == ModItems.manaResource)
return 1;
return 0;
}
public int getColor() {
ItemStack stack = itemHandler.getStackInSlot(0);
if(stack.isEmpty())
return 0;
if(stack.getItem() == Item.getItemFromBlock(Blocks.SAND))
return stack.getItemDamage() == 1 ? 0xE95800 : 0xFFEC49;
if(stack.getItem() == Item.getItemFromBlock(Blocks.SOUL_SAND))
return 0x5A412f;
if(stack.getItem() == ModItems.manaResource)
return 0x03abff;
return 0;
}
@Override
protected SimpleItemStackHandler createItemHandler() {
return new SimpleItemStackHandler(this, true) {
@Nonnull
@Override
public ItemStack insertItem(int slot, @Nonnull ItemStack stack, boolean simulate) {
if(!stack.isEmpty() && (stack.getItem() == Item.getItemFromBlock(Blocks.SAND) || stack.getItem() == Item.getItemFromBlock(Blocks.SOUL_SAND)) || stack.getItem() == ModItems.manaResource && stack.getItemDamage() == 23)
return super.insertItem(slot, stack, simulate);
else return stack;
}
};
}
@Override
public void writePacketNBT(NBTTagCompound par1nbtTagCompound) {
super.writePacketNBT(par1nbtTagCompound);
par1nbtTagCompound.setInteger(TAG_TIME, time);
par1nbtTagCompound.setFloat(TAG_TIME_FRACTION, timeFraction);
par1nbtTagCompound.setBoolean(TAG_FLIP, flip);
par1nbtTagCompound.setInteger(TAG_FLIP_TICKS, flipTicks);
par1nbtTagCompound.setBoolean(TAG_MOVE, move);
par1nbtTagCompound.setBoolean(TAG_LOCK, lock);
}
@Override
public void readPacketNBT(NBTTagCompound par1nbtTagCompound) {
super.readPacketNBT(par1nbtTagCompound);
time = par1nbtTagCompound.getInteger(TAG_TIME);
timeFraction = par1nbtTagCompound.getFloat(TAG_TIME_FRACTION);
flip = par1nbtTagCompound.getBoolean(TAG_FLIP);
flipTicks = par1nbtTagCompound.getInteger(TAG_FLIP_TICKS);
move = par1nbtTagCompound.getBoolean(TAG_MOVE);
lock = par1nbtTagCompound.getBoolean(TAG_LOCK);
}
@Override
public int getSizeInventory() {
return 1;
}
@Override
public void markDirty() {
super.markDirty();
time = 0;
timeFraction = 0F;
VanillaPacketDispatcher.dispatchTEToNearbyPlayers(this);
}
@SideOnly(Side.CLIENT)
public void renderHUD(ScaledResolution res) {
Minecraft mc = Minecraft.getMinecraft();
int x = res.getScaledWidth() / 2 + 10;
int y = res.getScaledHeight() / 2 - 10;
ItemStack stack = itemHandler.getStackInSlot(0);
if(!stack.isEmpty()) {
RenderHelper.enableGUIStandardItemLighting();
GlStateManager.enableRescaleNormal();
mc.getRenderItem().renderItemIntoGUI(stack, x, y);
mc.getRenderItem().renderItemOverlays(mc.fontRendererObj, stack, x, y);
GlStateManager.disableRescaleNormal();
RenderHelper.disableStandardItemLighting();
int time = getTotalTime();
String timeStr = StringUtils.ticksToElapsedTime(time);
mc.fontRendererObj.drawStringWithShadow(timeStr, x + 20, y, getColor());
String status = "";
if(lock)
status = "locked";
if(!move)
status = status.isEmpty() ? "stopped" : "lockedStopped";
if(!status.isEmpty())
mc.fontRendererObj.drawStringWithShadow(I18n.format("botaniamisc." + status), x + 20, y + 12, getColor());
}
}
}