/* * 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 mods.railcraft.api.carts.CartTools; import mods.railcraft.api.core.items.IToolCrowbar; import mods.railcraft.api.tracks.ITrackInstance; import mods.railcraft.api.tracks.ITrackPowered; import mods.railcraft.common.carts.LinkageManager; import mods.railcraft.common.plugins.forge.ChatPlugin; import mods.railcraft.common.plugins.forge.LocalizationPlugin; import mods.railcraft.common.util.misc.Game; import net.minecraft.entity.item.EntityMinecart; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.IIcon; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.util.Locale; public class TrackCoupler extends TrackBaseRailcraft implements ITrackPowered { private EntityMinecart taggedCart; private boolean powered = false; private Mode mode = Mode.COUPLER; enum Mode { COUPLER(8) { @Override public void onMinecartPass(TrackCoupler track, EntityMinecart cart) { CartTools.getLinkageManager(cart.worldObj).createLink(track.taggedCart, cart); track.taggedCart = cart; } }, DECOUPLER(0) { @Override public void onMinecartPass(TrackCoupler track, EntityMinecart cart) { CartTools.getLinkageManager(cart.worldObj).breakLinks(cart); LinkageManager.printDebug("Reason For Broken Link: Passed Decoupler Track."); } }, AUTO_COUPLER(0) { @Override public void onMinecartPass(TrackCoupler track, EntityMinecart cart) { LinkageManager.instance().setAutoLink(cart, true); } }; public static Mode[] VALUES = values(); private int powerPropagation; Mode(int powerPropagation) { this.powerPropagation = powerPropagation; } public static Mode fromOrdinal(int ordinal) { return VALUES[ordinal % VALUES.length]; } public Mode next() { return fromOrdinal(ordinal() + 1); } public Mode previous() { return fromOrdinal(ordinal() + VALUES.length - 1); } public String getTag() { return name().replace('_', '.').toLowerCase(Locale.ENGLISH); } public abstract void onMinecartPass(TrackCoupler track, EntityMinecart cart); } @Override public EnumTrack getTrackType() { return EnumTrack.COUPLER; } @Override public IIcon getIcon() { int iconIndex = 0; if (!isPowered()) iconIndex++; iconIndex += mode.ordinal() * 2; return getIcon(iconIndex); } @Override public boolean blockActivated(EntityPlayer player) { ItemStack current = player.getCurrentEquippedItem(); if (current != null && current.getItem() instanceof IToolCrowbar) { IToolCrowbar crowbar = (IToolCrowbar) current.getItem(); if (crowbar.canWhack(player, current, getX(), getY(), getZ())) { Mode m; if (player.isSneaking()) m = mode.previous(); else m = mode.next(); crowbar.onWhack(player, current, getX(), getY(), getZ()); if (Game.isHost(getWorld())) setMode(m); else ChatPlugin.sendLocalizedChat(player, "railcraft.gui.track.mode.change", "\u00A75" + LocalizationPlugin.translate("railcraft.gui.track.coupler.mode." + m.getTag())); return true; } } return false; } @Override public void onMinecartPass(EntityMinecart cart) { if (isPowered()) { mode.onMinecartPass(this, cart); } } public void setMode(Mode m) { if (mode != m) { mode = m; sendUpdateToClient(); } } @Override public boolean isPowered() { return powered; } @Override public void setPowered(boolean powered) { this.powered = powered; } @Override public boolean canPropagatePowerTo(ITrackInstance track) { if (track instanceof TrackCoupler) { TrackCoupler c = (TrackCoupler) track; return mode == c.mode; } return false; } @Override public int getPowerPropagation() { return mode.powerPropagation; } @Override public void writeToNBT(NBTTagCompound data) { super.writeToNBT(data); data.setBoolean("powered", powered); data.setByte("mode", (byte) mode.ordinal()); } @Override public void readFromNBT(NBTTagCompound data) { super.readFromNBT(data); powered = data.getBoolean("powered"); mode = Mode.fromOrdinal(data.getByte("mode")); if (data.getBoolean("decouple")) mode = Mode.DECOUPLER; if (data.getInteger("trackId") == EnumTrack.DECOUPLER.ordinal()) mode = Mode.DECOUPLER; } @Override public void writePacketData(DataOutputStream data) throws IOException { super.writePacketData(data); data.writeBoolean(powered); data.writeByte(mode.ordinal()); } @Override public void readPacketData(DataInputStream data) throws IOException { super.readPacketData(data); boolean p = data.readBoolean(); byte m = data.readByte(); boolean needsUpdate = false; if (p != powered) { powered = p; needsUpdate = true; } if (m != mode.ordinal()) { mode = Mode.fromOrdinal(m); needsUpdate = true; } if (needsUpdate) markBlockNeedsUpdate(); } }