/*
* 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.nbt.NBTTagCompound;
import net.minecraft.util.IIcon;
import mods.railcraft.api.tracks.ITrackPowered;
import mods.railcraft.api.tracks.ITrackReversable;
import mods.railcraft.common.carts.EntityLocomotive;
public class TrackSpeedTransition extends TrackSpeed implements ITrackPowered, ITrackReversable {
private boolean powered = false;
private boolean reversed = false;
private static final double BOOST_AMOUNT = 0.04;
private static final double SLOW_FACTOR = 0.65;
private static final double BOOST_THRESHOLD = 0.01;
@Override
public EnumTrack getTrackType() {
return EnumTrack.SPEED_TRANSITION;
}
@Override
public IIcon getIcon() {
if (!isPowered()) {
if (isReversed()) {
return getIcon(3);
}
return getIcon(1);
}
if (isReversed()) {
return getIcon(2);
}
return getIcon(0);
}
@Override
public int getPowerPropagation() {
return 16;
}
@Override
public boolean isFlexibleRail() {
return false;
}
@Override
public void onMinecartPass(EntityMinecart cart) {
testCartSpeedForBooster(this, cart);
boolean highSpeed = cart.getEntityData().getBoolean("HighSpeed");
if (powered) {
double speed = Math.sqrt(cart.motionX * cart.motionX + cart.motionZ * cart.motionZ);
if (speed > BOOST_THRESHOLD) {
int meta = tileEntity.getBlockMetadata();
if (meta == 0 || meta == 4 || meta == 5) {
if (reversed ^ cart.motionZ < 0) {
boostCartSpeed(cart, speed);
} else {
slowOrNormalCartSpeed(cart, highSpeed);
}
} else if (meta == 1 || meta == 2 || meta == 3) {
if (!reversed ^ cart.motionX < 0) {
boostCartSpeed(cart, speed);
} else {
slowOrNormalCartSpeed(cart, highSpeed);
}
}
}
} else {
if (highSpeed) {
int meta = tileEntity.getBlockMetadata();
if (meta == 0 || meta == 4 || meta == 5) {
if (reversed ^ cart.motionZ > 0) {
slowCartSpeed(cart);
}
} else if (meta == 1 || meta == 2 || meta == 3) {
if (!reversed ^ cart.motionX > 0) {
slowCartSpeed(cart);
}
}
cart.motionY = 0.0D;
} else {
normalCartSpeed(cart);
}
}
}
private void boostCartSpeed(EntityMinecart cart, double currentSpeed) {
cart.motionX += (cart.motionX / currentSpeed) * BOOST_AMOUNT;
cart.motionZ += (cart.motionZ / currentSpeed) * BOOST_AMOUNT;
}
private void slowCartSpeed(EntityMinecart cart) {
if (cart instanceof EntityLocomotive) {
((EntityLocomotive) cart).forceIdle(20);
}
cart.motionX *= SLOW_FACTOR;
cart.motionZ *= SLOW_FACTOR;
}
private void slowOrNormalCartSpeed(EntityMinecart cart, boolean highSpeed) {
if (highSpeed) {
slowCartSpeed(cart);
} else {
normalCartSpeed(cart);
}
}
private void normalCartSpeed(EntityMinecart cart) {
if (Math.abs(cart.motionX) > 0.01) {
cart.motionX = Math.copySign(0.3f, cart.motionX);
}
if (Math.abs(cart.motionZ) > 0.01) {
cart.motionZ = Math.copySign(0.3f, cart.motionZ);
}
}
@Override
public boolean isPowered() {
return powered;
}
@Override
public void setPowered(boolean powered) {
this.powered = powered;
}
@Override
public void writeToNBT(NBTTagCompound nbttagcompound) {
super.writeToNBT(nbttagcompound);
nbttagcompound.setBoolean("powered", powered);
nbttagcompound.setBoolean("reversed", reversed);
}
@Override
public void readFromNBT(NBTTagCompound nbttagcompound) {
super.readFromNBT(nbttagcompound);
powered = nbttagcompound.getBoolean("powered");
reversed = nbttagcompound.getBoolean("reversed");
}
@Override
public void writePacketData(DataOutputStream data) throws IOException {
super.writePacketData(data);
data.writeBoolean(powered);
data.writeBoolean(reversed);
}
@Override
public void readPacketData(DataInputStream data) throws IOException {
super.readPacketData(data);
powered = data.readBoolean();
reversed = data.readBoolean();
markBlockNeedsUpdate();
}
@Override
public boolean isReversed() {
return reversed;
}
@Override
public void setReversed(boolean r) {
reversed = r;
}
}