/* * 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.tracks; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import net.minecraft.entity.item.EntityMinecart; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.IIcon; import mods.railcraft.api.core.items.IToolCrowbar; import mods.railcraft.api.tracks.ITrackPowered; import mods.railcraft.common.blocks.tracks.speedcontroller.SpeedControllerReinforced; import mods.railcraft.common.core.RailcraftConfig; import mods.railcraft.common.gui.EnumGui; import mods.railcraft.common.gui.GuiHandler; import mods.railcraft.common.util.misc.SafeNBTWrapper; import mods.railcraft.common.util.network.IGuiReturnHandler; public class TrackLauncher extends TrackReinforced implements ITrackPowered, IGuiReturnHandler { private boolean powered = false; private byte launchForce = 5; public static final int MIN_LAUNCH_FORCE = 5; private static final float LAUNCH_THRESHOLD = 0.01f; public TrackLauncher() { speedController = SpeedControllerReinforced.getInstance(); } @Override public EnumTrack getTrackType() { return EnumTrack.LAUNCHER; } @Override public boolean isFlexibleRail() { return false; } @Override public IIcon getIcon() { if (!isPowered()) { return getIcon(1); } return getIcon(0); } @Override public boolean blockActivated(EntityPlayer player) { ItemStack current = player.getCurrentEquippedItem(); if (current != null && current.getItem() instanceof IToolCrowbar) { IToolCrowbar crowbar = (IToolCrowbar) current.getItem(); if (crowbar.canWhack(player, current, getX(), getY(), getZ())) { GuiHandler.openGui(EnumGui.TRACK_LAUNCHER, player, getWorld(), tileEntity.xCoord, tileEntity.yCoord, tileEntity.zCoord); crowbar.onWhack(player, current, getX(), getY(), getZ()); return true; } } return false; } @Override public void onMinecartPass(EntityMinecart cart) { if (isPowered()) { if (Math.abs(cart.motionX) > LAUNCH_THRESHOLD) { cart.motionX = Math.copySign(0.6f, cart.motionX); } if (Math.abs(cart.motionZ) > LAUNCH_THRESHOLD) { cart.motionZ = Math.copySign(0.6f, cart.motionZ); } cart.setMaxSpeedAirLateral(0.6f); cart.setMaxSpeedAirVertical(0.5f); cart.setDragAir(0.99999); cart.motionY = getLaunchForce() * 0.1; cart.getEntityData().setInteger("Launched", 1); cart.setCanUseRail(false); cart.moveEntity(cart.motionX, 1.5, cart.motionZ); } } @Override public boolean isPowered() { return powered; } @Override public void setPowered(boolean powered) { this.powered = powered; } @Override public void writeToNBT(NBTTagCompound data) { super.writeToNBT(data); data.setBoolean("powered", powered); data.setByte("force", getLaunchForce()); } @Override public void readFromNBT(NBTTagCompound data) { super.readFromNBT(data); powered = data.getBoolean("powered"); SafeNBTWrapper safe = new SafeNBTWrapper(data); setLaunchForce(safe.getByte("force")); } @Override public void writePacketData(DataOutputStream data) throws IOException { super.writePacketData(data); data.writeBoolean(powered); data.writeByte(launchForce); } @Override public void readPacketData(DataInputStream data) throws IOException { super.readPacketData(data); powered = data.readBoolean(); launchForce = data.readByte(); markBlockNeedsUpdate(); } @Override public void writeGuiData(DataOutputStream data) throws IOException { data.writeByte(launchForce); } @Override public void readGuiData(DataInputStream data, EntityPlayer sender) throws IOException { launchForce = data.readByte(); } public byte getLaunchForce() { return launchForce; } public void setLaunchForce(int force) { force = Math.max(force, MIN_LAUNCH_FORCE); force = Math.min(force, RailcraftConfig.getLaunchRailMaxForce()); launchForce = (byte) force; } }