/* * 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.blocks.machine.gamma; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.item.EntityMinecart; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemMinecart; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.IIcon; import net.minecraftforge.common.util.ForgeDirection; import mods.railcraft.api.carts.CartTools; import mods.railcraft.api.core.items.IMinecartItem; import mods.railcraft.common.blocks.machine.IEnumMachine; import mods.railcraft.common.blocks.machine.TileMachineItem; import mods.railcraft.common.carts.CartUtils; import mods.railcraft.common.core.RailcraftConfig; import mods.railcraft.common.gui.EnumGui; import mods.railcraft.common.gui.GuiHandler; import mods.railcraft.common.plugins.forge.PowerPlugin; import mods.railcraft.common.util.inventory.InvTools; import mods.railcraft.common.util.inventory.wrappers.InventoryCopy; import mods.railcraft.common.util.misc.Game; import mods.railcraft.common.util.misc.MiscTools; import net.minecraft.block.Block; import net.minecraft.entity.EntityLivingBase; import net.minecraft.world.WorldServer; public class TileDispenserCart extends TileMachineItem { protected ForgeDirection direction = ForgeDirection.NORTH; protected boolean powered; protected int timeSinceLastSpawn; public TileDispenserCart() { super(3); } @Override public IEnumMachine getMachineType() { return EnumMachineGamma.DISPENSER_CART; } @Override public IIcon getIcon(int side) { if (direction.ordinal() == side) return getMachineType().getTexture(3); if (side != 0 && side != 1) return getMachineType().getTexture(2); return getMachineType().getTexture(1); } @Override public boolean rotateBlock(ForgeDirection axis) { if (direction == axis) direction = axis.getOpposite(); else direction = axis; markBlockForUpdate(); return true; } @Override public boolean openGui(EntityPlayer player) { GuiHandler.openGui(EnumGui.CART_DISPENSER, player, worldObj, xCoord, yCoord, zCoord); return true; } @Override public void onBlockPlacedBy(EntityLivingBase entityliving, ItemStack stack) { super.onBlockPlacedBy(entityliving, stack); direction = MiscTools.getSideFacingTrack(worldObj, xCoord, yCoord, zCoord); if (direction == ForgeDirection.UNKNOWN) direction = MiscTools.getSideClosestToPlayer(worldObj, xCoord, yCoord, zCoord, entityliving); } @Override public boolean canUpdate() { return true; } @Override public void updateEntity() { super.updateEntity(); if (timeSinceLastSpawn < Integer.MAX_VALUE) timeSinceLastSpawn++; } public void onPulse() { EntityMinecart cart = CartTools.getMinecartOnSide(worldObj, xCoord, yCoord, zCoord, 0, direction); if (cart == null) { if (timeSinceLastSpawn > RailcraftConfig.getCartDispenserMinDelay() * 20) for (int ii = 0; ii < getSizeInventory(); ii++) { ItemStack cartStack = getStackInSlot(ii); if (cartStack != null) { int x = MiscTools.getXOnSide(xCoord, direction); int y = MiscTools.getYOnSide(yCoord, direction); int z = MiscTools.getZOnSide(zCoord, direction); boolean minecartItem = cartStack.getItem() instanceof IMinecartItem; if (cartStack.getItem() instanceof ItemMinecart || minecartItem) { boolean canPlace = true; if (minecartItem) canPlace = ((IMinecartItem) cartStack.getItem()).canBePlacedByNonPlayer(cartStack); if (canPlace) { ItemStack placedStack = cartStack.copy(); EntityMinecart placedCart = CartUtils.placeCart(getOwner(), placedStack, (WorldServer) worldObj, x, y, z); if (placedCart != null) { decrStackSize(ii, 1); timeSinceLastSpawn = 0; break; } } } else { float rx = MiscTools.getRand().nextFloat() * 0.8F + 0.1F; float ry = MiscTools.getRand().nextFloat() * 0.8F + 0.1F; float rz = MiscTools.getRand().nextFloat() * 0.8F + 0.1F; EntityItem item = new EntityItem(worldObj, x + rx, y + ry, z + rz, cartStack); float factor = 0.05F; item.motionX = (float) MiscTools.getRand().nextGaussian() * factor; item.motionY = (float) MiscTools.getRand().nextGaussian() * factor + 0.2F; item.motionZ = (float) MiscTools.getRand().nextGaussian() * factor; if (worldObj.spawnEntityInWorld(item)) setInventorySlotContents(ii, null); } } } } else if (!cart.isDead && cart.getCartItem() != null) { IInventory testInv = new InventoryCopy(this); ItemStack cartStack = cart.getCartItem(); if (cart.hasCustomInventoryName()) cartStack.setStackDisplayName(cart.getCommandSenderName()); ItemStack remainder = InvTools.moveItemStack(cartStack.copy(), testInv); if (remainder == null) { InvTools.moveItemStack(cartStack, this); if (cart.riddenByEntity != null) cart.riddenByEntity.mountEntity(null); cart.setDead(); } } } @Override public void onNeighborBlockChange(Block block) { super.onNeighborBlockChange(block); if (Game.isNotHost(getWorld())) return; boolean newPower = PowerPlugin.isBlockBeingPowered(worldObj, xCoord, yCoord, zCoord); if (!powered && newPower) { powered = newPower; onPulse(); } else powered = newPower; } @Override public void writeToNBT(NBTTagCompound data) { super.writeToNBT(data); data.setBoolean("powered", powered); data.setByte("direction", (byte) direction.ordinal()); data.setInteger("time", timeSinceLastSpawn); } @Override public void readFromNBT(NBTTagCompound data) { super.readFromNBT(data); powered = data.getBoolean("powered"); direction = ForgeDirection.getOrientation(data.getByte("direction")); timeSinceLastSpawn = data.getInteger("time"); } @Override public void writePacketData(DataOutputStream data) throws IOException { super.writePacketData(data); data.writeByte(direction.ordinal()); // data.writeBoolean(powered); } @Override public void readPacketData(DataInputStream data) throws IOException { super.readPacketData(data); direction = ForgeDirection.getOrientation(data.readByte()); // powered = data.readBoolean(); markBlockForUpdate(); } public boolean getPowered() { return powered; } public void setPowered(boolean power) { powered = power; } @Override public int getInventoryStackLimit() { return 64; } }