/*
* 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 com.mojang.authlib.GameProfile;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import mods.railcraft.api.carts.CartTools;
import mods.railcraft.api.carts.IMinecart;
import mods.railcraft.api.core.items.IMinecartItem;
import mods.railcraft.common.blocks.tracks.TrackTools;
import mods.railcraft.common.util.inventory.InvTools;
import net.minecraft.entity.Entity;
import net.minecraft.entity.item.EntityMinecart;
import mods.railcraft.common.util.misc.Game;
import mods.railcraft.common.util.misc.MiscTools;
import net.minecraft.block.Block;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.network.play.server.S1BPacketEntityAttach;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.world.World;
import net.minecraft.world.WorldServer;
/**
* @author CovertJaguar <http://www.railcraft.info>
*/
public class CartUtils {
public static Map<Item, ICartType> vanillaCartItemMap = new HashMap<Item, ICartType>();
public static Map<Class<? extends EntityMinecart>, ICartType> classReplacements = new HashMap<Class<? extends EntityMinecart>, ICartType>();
/**
* Spawns a new cart entity using the provided item.
* <p/>
* The backing item must implement <code>IMinecartItem</code> and/or extend
* <code>ItemMinecart</code>.
* <p/>
* Generally Forge requires all cart items to extend ItemMinecart.
*
* @param owner The player name that should used as the owner
* @param cart An ItemStack containing a cart item, will not be changed by
* the function
* @param world The World object
* @param x x-Coord
* @param y y-Coord
* @param z z-Coord
* @return the cart placed or null if failed
* @see IMinecartItem , ItemMinecart
*/
public static EntityMinecart placeCart(GameProfile owner, ItemStack cart, WorldServer world, int x, int y, int z) {
if (cart == null)
return null;
cart = cart.copy();
ICartType vanillaType = vanillaCartItemMap.get(cart.getItem());
if (vanillaType != null)
return placeCart(vanillaType, owner, cart, world, x, y, z);
return CartTools.placeCart(owner, cart, world, x, y, z);
}
public static EntityMinecart placeCart(ICartType cartType, GameProfile owner, ItemStack cartStack, World world, int i, int j, int k) {
Block block = world.getBlock(i, j, k);
if (TrackTools.isRailBlock(block))
if (!CartTools.isMinecartAt(world, i, j, k, 0)) {
EntityMinecart cart = cartType.makeCart(cartStack, world, (float) i + 0.5F, (float) j + 0.5F, (float) k + 0.5F);
if (cartStack.hasDisplayName())
cart.setMinecartName(cartStack.getDisplayName());
CartTools.setCartOwner(cart, owner);
if (world.spawnEntityInWorld(cart))
return cart;
}
return null;
}
/**
* Will return true if the cart matches the provided filter item.
*
* @param stack the Filter
* @param cart the Cart
* @return true if the item matches the cart
* @see IMinecart
*/
public static boolean doesCartMatchFilter(ItemStack stack, EntityMinecart cart) {
if (stack == null)
return false;
if (cart instanceof IMinecart) {
if (stack.hasDisplayName())
return ((IMinecart) cart).doesCartMatchFilter(stack, cart) && stack.getDisplayName().equals(cart.getCartItem().getDisplayName());
return ((IMinecart) cart).doesCartMatchFilter(stack, cart);
}
ItemStack cartItem = cart.getCartItem();
return cartItem != null && InvTools.isCartItemEqual(stack, cartItem, true);
}
public static void explodeCart(EntityMinecart cart) {
if (cart.isDead)
return;
cart.getEntityData().setBoolean("HighSpeed", false);
cart.motionX = 0;
cart.motionZ = 0;
if (Game.isNotHost(cart.worldObj))
return;
if (cart.riddenByEntity != null)
cart.riddenByEntity.mountEntity(cart);
cart.worldObj.newExplosion(cart, cart.posX, cart.posY, cart.posZ, 3F, true, true);
if (MiscTools.getRand().nextInt(2) == 0)
cart.setDead();
}
public static boolean cartVelocityIsLessThan(EntityMinecart cart, float vel) {
return Math.abs(cart.motionX) < vel && Math.abs(cart.motionZ) < vel;
}
@SuppressWarnings("rawtypes")
public static List<EntityMinecart> getMinecartsIn(World world, AxisAlignedBB searchBox) {
List entities = world.getEntitiesWithinAABB(EntityMinecart.class, searchBox);
List<EntityMinecart> carts = new ArrayList<EntityMinecart>();
for (Object o : entities) {
EntityMinecart cart = (EntityMinecart) o;
if (!cart.isDead)
carts.add((EntityMinecart) o);
}
return carts;
}
@SuppressWarnings("rawtypes")
public static List<UUID> getMinecartUUIDsAt(World world, int i, int j, int k, float sensitivity) {
sensitivity = Math.min(sensitivity, 0.49f);
List entities = world.getEntitiesWithinAABB(EntityMinecart.class, AxisAlignedBB.getBoundingBox(i + sensitivity, j + sensitivity, k + sensitivity, i + 1 - sensitivity, j + 1 - sensitivity, k + 1 - sensitivity));
List<UUID> carts = new ArrayList<UUID>();
for (Object o : entities) {
EntityMinecart cart = (EntityMinecart) o;
if (!cart.isDead)
carts.add(((EntityMinecart) o).getPersistentID());
}
return carts;
}
public static void dismount(EntityMinecart cart, double x, double y, double z) {
if (cart.riddenByEntity == null)
return;
Entity rider = cart.riddenByEntity;
rider.ridingEntity = null;
cart.riddenByEntity = null;
if (rider instanceof EntityPlayerMP) {
EntityPlayerMP player = ((EntityPlayerMP) rider);
player.playerNetServerHandler.sendPacket(new S1BPacketEntityAttach(0, rider, null));
player.setPositionAndUpdate(x, y, z);
} else
rider.setLocationAndAngles(x, y, z, rider.rotationYaw, rider.rotationPitch);
}
}