/*
* 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.locking;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import mods.railcraft.api.carts.CartTools;
import mods.railcraft.common.blocks.tracks.TrackNextGenLocking;
import net.minecraft.entity.item.EntityMinecart;
import net.minecraft.nbt.NBTTagCompound;
/**
*
* @author CovertJaguar <http://www.railcraft.info/>
*/
public class HoldingLockingProfile extends LockingProfile {
protected static float DIR_THRESHOLD = 0.01f;
protected boolean launchForward = true;
public HoldingLockingProfile(TrackNextGenLocking track) {
super(track);
}
@Override
public void onLock(EntityMinecart cart) {
super.onLock(cart);
setLaunchDirection(cart);
}
@Override
public void onRelease(EntityMinecart cart) {
super.onRelease(cart);
int meta = track.tileEntity.getBlockMetadata();
double speed = CartTools.getCartSpeedUncapped(cart);
double boostX = TrackNextGenLocking.START_BOOST;
double boostZ = TrackNextGenLocking.START_BOOST;
if (speed > 0.005D) {
boostX = (Math.abs(cart.motionX) / speed) * TrackNextGenLocking.BOOST_FACTOR;
boostZ = (Math.abs(cart.motionZ) / speed) * TrackNextGenLocking.BOOST_FACTOR;
}
if (meta == 0 || meta == 4 || meta == 5)
if (launchForward)
cart.motionZ += boostZ;
else
cart.motionZ -= boostZ;
else if (meta == 1 || meta == 2 || meta == 3)
if (launchForward)
cart.motionX += boostX;
else
cart.motionX -= boostX;
}
protected void setLaunchDirection(EntityMinecart cart) {
int meta = track.tileEntity.getBlockMetadata();
double speed = CartTools.getCartSpeedUncapped(cart);
if (speed > DIR_THRESHOLD) {
boolean launch = launchForward;
if (meta == 0 || meta == 4 || meta == 5)
launch = cart.motionZ > 0;
else if (meta == 1 || meta == 2 || meta == 3)
launch = cart.motionX > 0;
if (launchForward != launch) {
launchForward = launch;
track.sendUpdateToClient();
}
}
}
@Override
public void writeToNBT(NBTTagCompound data) {
super.writeToNBT(data);
data.setBoolean("launchForward", launchForward);
}
@Override
public void readFromNBT(NBTTagCompound data) {
super.readFromNBT(data);
launchForward = data.getBoolean("launchForward");
}
@Override
public void writePacketData(DataOutputStream data) throws IOException {
super.writePacketData(data);
data.writeBoolean(launchForward);
}
@Override
public void readPacketData(DataInputStream data) throws IOException {
super.readPacketData(data);
launchForward = data.readBoolean();
track.markBlockNeedsUpdate();
}
}