/* * 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 net.minecraftforge.common.util.ForgeDirection; import mods.railcraft.api.tracks.ITrackPowered; public class TrackReinforcedBooster extends TrackReinforced implements ITrackPowered { private static final int POWER_PROPAGATION = 8; private static final double BOOST_FACTOR = 0.065; private static final double SLOW_FACTOR = 0.5; private static final double START_BOOST = 0.02; private static final double STALL_THRESHOLD = 0.03; private static final double BOOST_THRESHOLD = 0.01; private boolean powered = false; @Override public EnumTrack getTrackType() { return EnumTrack.REINFORCED_BOOSTER; } @Override public boolean isFlexibleRail() { return false; } @Override public IIcon getIcon() { if (!isPowered()) { return getIcon(1); } return getIcon(0); } @Override public void onMinecartPass(EntityMinecart cart) { int meta = tileEntity.getBlockMetadata(); int i = tileEntity.xCoord; int j = tileEntity.yCoord; int k = tileEntity.zCoord; int dirMeta = meta & 7; double speed = Math.sqrt(cart.motionX * cart.motionX + cart.motionZ * cart.motionZ); if (powered) { if (speed > BOOST_THRESHOLD) { cart.motionX += (cart.motionX / speed) * BOOST_FACTOR; cart.motionZ += (cart.motionZ / speed) * BOOST_FACTOR; } else if (dirMeta == 1) { if (getWorld().isSideSolid(i - 1, j, k, ForgeDirection.EAST)) { cart.motionX = START_BOOST; } else if (getWorld().isSideSolid(i + 1, j, k, ForgeDirection.WEST)) { cart.motionX = -START_BOOST; } } else if (dirMeta == 0) { if (getWorld().isSideSolid(i, j, k - 1, ForgeDirection.SOUTH)) { cart.motionZ = START_BOOST; } else if (getWorld().isSideSolid(i, j, k + 1, ForgeDirection.NORTH)) { cart.motionZ = -START_BOOST; } } } else { if (speed < STALL_THRESHOLD) { cart.motionX = 0.0D; cart.motionY = 0.0D; cart.motionZ = 0.0D; } else { cart.motionX *= SLOW_FACTOR; cart.motionY = 0.0D; cart.motionZ *= SLOW_FACTOR; } } } @Override public int getPowerPropagation() { return POWER_PROPAGATION; } @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); } @Override public void readFromNBT(NBTTagCompound data) { super.readFromNBT(data); powered = data.getBoolean("powered"); } @Override public void writePacketData(DataOutputStream data) throws IOException { super.writePacketData(data); data.writeBoolean(powered); } @Override public void readPacketData(DataInputStream data) throws IOException { super.readPacketData(data); powered = data.readBoolean(); markBlockNeedsUpdate(); } }