/*
* 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 java.util.List;
import mods.railcraft.api.carts.IItemCart;
import mods.railcraft.common.blocks.tracks.EnumTrackMeta;
import mods.railcraft.common.plugins.forge.LocalizationPlugin;
import mods.railcraft.common.util.misc.Game;
import net.minecraft.entity.item.EntityMinecart;
import net.minecraft.entity.item.EntityMinecartContainer;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.util.DamageSource;
import net.minecraft.world.World;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.event.entity.minecart.MinecartInteractEvent;
/**
* It also contains some generic code that most carts will find useful.
*
* @author CovertJaguar <http://www.railcraft.info>
*/
public abstract class CartContainerBase extends EntityMinecartContainer implements IRailcraftCart, IItemCart {
private final ForgeDirection[] travelDirectionHistory = new ForgeDirection[2];
protected ForgeDirection travelDirection = ForgeDirection.UNKNOWN;
protected ForgeDirection verticalTravelDirection = ForgeDirection.UNKNOWN;
public CartContainerBase(World world) {
super(world);
renderDistanceWeight = CartConstants.RENDER_DIST_MULTIPLIER;
}
public CartContainerBase(World world, double x, double y, double z) {
super(world, x, y, z);
renderDistanceWeight = CartConstants.RENDER_DIST_MULTIPLIER;
}
public abstract ICartType getCartType();
@Override
public void initEntityFromItem(ItemStack stack) {
}
@Override
public final boolean interactFirst(EntityPlayer player) {
if (MinecraftForge.EVENT_BUS.post(new MinecartInteractEvent(this, player)))
return true;
return doInteract(player);
}
public boolean doInteract(EntityPlayer player) {
return true;
}
public double getDrag() {
return CartConstants.STANDARD_DRAG;
}
@Override
public ItemStack getCartItem() {
ItemStack stack = EnumCart.fromCart(this).getCartItem();
if (hasCustomInventoryName())
stack.setStackDisplayName(getCommandSenderName());
return stack;
}
public abstract List<ItemStack> getItemsDropped();
@Override
public String getInventoryName() {
return LocalizationPlugin.translate(getCartType().getTag());
}
@Override
public void setDead() {
if (Game.isNotHost(worldObj))
for (int slot = 0; slot < getSizeInventory(); slot++) {
setInventorySlotContents(slot, null);
}
super.setDead();
}
@Override
public void killMinecart(DamageSource par1DamageSource) {
setDead();
List<ItemStack> drops = getItemsDropped();
if (this.func_95999_t() != null)
drops.get(0).setStackDisplayName(this.func_95999_t());
for (ItemStack item : drops) {
entityDropItem(item, 0.0F);
}
}
@Override
public int getMinecartType() {
return -1;
}
protected void updateTravelDirection(int trackX, int trackY, int trackZ, int meta) {
EnumTrackMeta trackMeta = EnumTrackMeta.fromMeta(meta);
if (trackMeta != null) {
ForgeDirection forgeDirection = determineTravelDirection(trackMeta);
ForgeDirection previousForgeDirection = travelDirectionHistory[1];
if (previousForgeDirection != ForgeDirection.UNKNOWN && travelDirectionHistory[0] == previousForgeDirection) {
travelDirection = forgeDirection;
verticalTravelDirection = determineVerticalTravelDirection(trackMeta);
}
travelDirectionHistory[0] = previousForgeDirection;
travelDirectionHistory[1] = forgeDirection;
}
}
private ForgeDirection determineTravelDirection(EnumTrackMeta trackMeta) {
if (trackMeta.isStraightTrack()) {
if (posX - prevPosX > 0)
return ForgeDirection.EAST;
if (posX - prevPosX < 0)
return ForgeDirection.WEST;
if (posZ - prevPosZ > 0)
return ForgeDirection.SOUTH;
if (posZ - prevPosZ < 0)
return ForgeDirection.NORTH;
} else {
switch (trackMeta) {
case EAST_SOUTH_CORNER:
if (prevPosZ > posZ)
return ForgeDirection.EAST;
else
return ForgeDirection.SOUTH;
case WEST_SOUTH_CORNER:
if (prevPosZ > posZ)
return ForgeDirection.WEST;
else
return ForgeDirection.SOUTH;
case WEST_NORTH_CORNER:
if (prevPosZ > posZ)
return ForgeDirection.NORTH;
else
return ForgeDirection.WEST;
case EAST_NORTH_CORNER:
if (prevPosZ > posZ)
return ForgeDirection.NORTH;
else
return ForgeDirection.EAST;
}
}
return ForgeDirection.UNKNOWN;
}
private ForgeDirection determineVerticalTravelDirection(EnumTrackMeta trackMeta) {
if (trackMeta.isSlopeTrack())
return prevPosY < posY ? ForgeDirection.UP : ForgeDirection.DOWN;
return ForgeDirection.UNKNOWN;
}
@Override
public boolean canPassItemRequests() {
return false;
}
@Override
public boolean canAcceptPushedItem(EntityMinecart requester, ItemStack stack) {
return false;
}
@Override
public boolean canProvidePulledItem(EntityMinecart requester, ItemStack stack) {
return false;
}
}