/* * Copyright (c) CovertJaguar, 2014 http://railcraft.info * * This code is the property of CovertJaguar * and may only be used with explicit written * permission unless otherwise specified on the * license page at http://railcraft.info/wiki/info:license. */ package mods.railcraft.common.carts; import mods.railcraft.api.carts.CartTools; import mods.railcraft.api.tracks.RailTools; import mods.railcraft.common.util.misc.Game; import net.minecraft.block.Block; import net.minecraft.block.BlockRailBase; import net.minecraft.item.ItemStack; import net.minecraft.world.World; import java.util.ArrayList; import java.util.List; /** * @author CovertJaguar <http://www.railcraft.info> */ public abstract class CartMaintenanceBase extends CartContainerBase { protected static final double DRAG_FACTOR = 0.9; protected static final float MAX_SPEED = 0.1f; private static final int BLINK_DURATION = 3; private static final int DATA_ID_BLINK = 25; public CartMaintenanceBase(World world) { super(world); } @Override protected void entityInit() { super.entityInit(); dataWatcher.addObject(DATA_ID_BLINK, (byte) 0); } @Override public int getSizeInventory() { return 0; } protected void blink() { dataWatcher.updateObject(DATA_ID_BLINK, (byte) BLINK_DURATION); } protected void setBlink(byte blink) { dataWatcher.updateObject(DATA_ID_BLINK, (byte) blink); } protected byte getBlink() { return dataWatcher.getWatchableObjectByte(DATA_ID_BLINK); } @Override public void onUpdate() { super.onUpdate(); if (Game.isNotHost(worldObj)) return; if (isBlinking()) setBlink((byte) (getBlink() - 1)); } @Override public List<ItemStack> getItemsDropped() { List<ItemStack> items = new ArrayList<ItemStack>(); items.add(getCartItem()); return items; } @Override public boolean canBeRidden() { return false; } @Override public double getDrag() { return EntityCartTrackRelayer.DRAG_FACTOR; } @Override public float getMaxCartSpeedOnRail() { return MAX_SPEED; } public boolean isBlinking() { return dataWatcher.getWatchableObjectByte(DATA_ID_BLINK) > 0; } protected boolean placeNewTrack(int x, int y, int z, int slotStock, int meta) { ItemStack trackStock = getStackInSlot(slotStock); if (trackStock != null) if (RailTools.placeRailAt(trackStock, worldObj, x, y, z)) { worldObj.setBlockMetadataWithNotify(x, y, z, meta, 0x02); Block block = worldObj.getBlock(x, y, z); block.onNeighborBlockChange(worldObj, x, y, z, block); worldObj.markBlockForUpdate(x, y, z); decrStackSize(slotStock, 1); blink(); return true; } return false; } protected int removeOldTrack(int x, int y, int z, Block block) { List<ItemStack> drops = block.getDrops(worldObj, x, y, z, 0, 0); for (ItemStack stack : drops) { CartTools.offerOrDropItem(this, stack); } int meta = worldObj.getBlockMetadata(x, y, z); if (((BlockRailBase) block).isPowered()) meta = meta & 7; worldObj.setBlockToAir(x, y, z); return meta; } }