/* * 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.ITrackEmitter; import mods.railcraft.api.tracks.ITrackReversable; import mods.railcraft.common.blocks.RailcraftBlocks; import mods.railcraft.common.plugins.forge.PowerPlugin; import mods.railcraft.common.util.misc.Game; public class TrackDetectorDirection extends TrackBaseRailcraft implements ITrackReversable, ITrackEmitter { private static final int POWER_DELAY = 10; private boolean reversed = false; private byte delay = 0; @Override public EnumTrack getTrackType() { return EnumTrack.DETECTOR_DIRECTION; } @Override public IIcon getIcon() { if (getPowerOutput() != 0) { if (isReversed()) { return getIcon(3); } return getIcon(1); } if (isReversed()) { return getIcon(2); } return getIcon(0); } @Override public boolean canUpdate() { return true; } @Override public void updateEntity() { if (Game.isNotHost(getWorld())) { return; } if (delay > 0) { delay--; if (delay == 0) { notifyNeighbors(); } } } @Override public void onMinecartPass(EntityMinecart cart) { int meta = tileEntity.getBlockMetadata(); if (meta == 1 || meta == 2 || meta == 3) { if ((isReversed() && cart.motionX < 0.0D) || (!isReversed() && cart.motionX > 0.0D)) { setTrackPowering(); } } else if (meta == 0 || meta == 4 || meta == 5) { if ((isReversed() && cart.motionZ > 0.0D) || (!isReversed() && cart.motionZ < 0.0D)) { setTrackPowering(); } } } private void notifyNeighbors() { getWorld().notifyBlocksOfNeighborChange(getX(), getY(), getZ(), RailcraftBlocks.getBlockTrack()); getWorld().notifyBlocksOfNeighborChange(getX(), getY() - 1, getZ(), RailcraftBlocks.getBlockTrack()); sendUpdateToClient(); } private void setTrackPowering() { boolean notify = delay == 0; delay = POWER_DELAY; if (notify) { notifyNeighbors(); } } @Override public int getPowerOutput() { return delay > 0 ? PowerPlugin.FULL_POWER : PowerPlugin.NO_POWER; } @Override public boolean isReversed() { return reversed; } @Override public void setReversed(boolean reversed) { this.reversed = reversed; } @Override public void writeToNBT(NBTTagCompound nbttagcompound) { super.writeToNBT(nbttagcompound); nbttagcompound.setBoolean("direction", reversed); nbttagcompound.setByte("delay", delay); } @Override public void readFromNBT(NBTTagCompound nbttagcompound) { super.readFromNBT(nbttagcompound); reversed = nbttagcompound.getBoolean("direction"); delay = nbttagcompound.getByte("delay"); } @Override public void writePacketData(DataOutputStream data) throws IOException { super.writePacketData(data); data.writeByte(delay); data.writeBoolean(reversed); } @Override public void readPacketData(DataInputStream data) throws IOException { super.readPacketData(data); delay = data.readByte(); reversed = data.readBoolean(); markBlockNeedsUpdate(); } }