/* * 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; public class TrackOneWay extends TrackBaseRailcraft implements ITrackPowered, ITrackReversable { private boolean reversed = false; private boolean powered = false; private static final double LOSS_FACTOR = 0.49D; @Override public EnumTrack getTrackType() { return EnumTrack.ONEWAY; } @Override public IIcon getIcon() { if (!isPowered()) { if (isReversed()) { return getIcon(3); } return getIcon(1); } if (isReversed()) { return getIcon(2); } return getIcon(0); } @Override public void onMinecartPass(EntityMinecart cart) { int meta = tileEntity.getBlockMetadata(); if (isPowered()) { if (meta == 1 || meta == 2 || meta == 3) { if ((isReversed() && cart.motionX > 0.0D) || (!isReversed() && cart.motionX < 0.0D)) { double distX = cart.posX - (tileEntity.xCoord + 0.5D); // System.out.println("cartX=" + cart.posX + ", railX=" + (i + 0.5D) + ", railDir=" + isReversed()); if (!isReversed() && distX < -0.01 || isReversed() && distX > 0.01) { // System.out.println("Setting Position"); cart.setPosition(tileEntity.xCoord + 0.5D, cart.posY, cart.posZ); } // System.out.println("mX= " + cart.motionX + ", dist=" + distX); if (!isReversed()) { cart.motionX = Math.abs(cart.motionX) * LOSS_FACTOR; } else { cart.motionX = -Math.abs(cart.motionX) * LOSS_FACTOR; } } } else if (meta == 0 || meta == 4 || meta == 5) { if ((isReversed() && cart.motionZ < 0.0D) || (!isReversed() && cart.motionZ > 0.0D)) { double distZ = cart.posZ - (tileEntity.zCoord + 0.5D); // System.out.println("cartZ=" + cart.posZ + ", railZ=" + (k + 0.5D) + ", railDir=" + isReversed()); if (isReversed() && distZ < -0.01 || !isReversed() && distZ > 0.01) { // System.out.println("Setting Position"); cart.setPosition(cart.posX, cart.posY, tileEntity.zCoord + 0.5D); } // System.out.println("mZ= " + cart.motionZ + ", dist=" + distZ); if (isReversed()) { cart.motionZ = Math.abs(cart.motionZ) * LOSS_FACTOR; } else { cart.motionZ = -Math.abs(cart.motionZ) * LOSS_FACTOR; } } } } } @Override public boolean isReversed() { return reversed; } @Override public void setReversed(boolean reversed) { this.reversed = reversed; } @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("direction", reversed); nbttagcompound.setBoolean("powered", powered); } @Override public void readFromNBT(NBTTagCompound nbttagcompound) { super.readFromNBT(nbttagcompound); reversed = nbttagcompound.getBoolean("direction"); powered = nbttagcompound.getBoolean("powered"); } @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(); } }