/**
 * Copyright (c) Lambda Innovation, 2013-2015
 * 本作品版权由Lambda Innovation所有。
 * http://www.li-dev.cn/
 *
 * This project is open-source, and it is distributed under 
 * the terms of GNU General Public License. You can modify
 * and distribute freely as long as you follow the license.
 * 本项目是一个开源项目，且遵循GNU通用公共授权协议。
 * 在遵照该协议的情况下，您可以自由传播和修改。
 * http://www.gnu.org/licenses/gpl.html
 */
package cn.lambdalib.multiblock;

import cn.lambdalib.core.LambdaLib;
import net.minecraft.block.Block;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.common.util.ForgeDirection;

/**
 * Class that stores and handles per-block orientation&sub block ID info. You
 * should delegate the save&store methods via your TileEntity that implements
 * IMultiTile.
 * 
 * @author WeathFolD
 */
public class InfoBlockMulti {

	final TileEntity te;

	ForgeDirection dir = ForgeDirection.NORTH;
	int subID;

	private boolean loaded; // Client-Only flag. Indicate if it was syncedSingle.
	int syncCD; // Ticks until sending next sync request.

	InfoBlockMulti(TileEntity _te, ForgeDirection _dir, int sid) {
		te = _te;
		dir = _dir;
		subID = sid;
	}

	public InfoBlockMulti(TileEntity _te) {
		te = _te;
	}

	/**
	 * Use this Ctor to restore your Info in TileEntity's readNBT method.
	 */
	public InfoBlockMulti(TileEntity _te, NBTTagCompound tag) {
		te = _te;
		load(tag);
	}

	/**
	 * Delegate this method in your TileEntity's updateEntity method.
	 */
	public void update() {
		if (te.getWorldObj().isRemote) {
			if (!loaded) {
				if (syncCD == 0) {
					LambdaLib.netHandler.sendToServer(new MsgBlockMulti.Req(this));
					syncCD = 10;
				} else {
					--syncCD;
				}
			}
		} else {
			// Check block consistency every 1s in server.
			if (syncCD == 0) {
				syncCD = 20;
			}
			boolean fail = false;
			Block b = te.getBlockType();
			if (!(b instanceof BlockMulti)) {
				fail = true;
			} else {
				TileEntity ori = ((BlockMulti) b).getOriginTile(te);
				if (ori == null) {
					fail = true;
				}
			}
			if (fail) { // Kill this block.
				te.getWorldObj().setBlockToAir(te.xCoord, te.yCoord, te.zCoord);
				te.getWorldObj().removeTileEntity(te.xCoord, te.yCoord, te.zCoord);
			}
		}
	}

	public boolean isLoaded() {
		return te.getWorldObj().isRemote ? loaded : true;
	}

	public int getSubID() {
		return subID;
	}

	public ForgeDirection getDir() {
		return dir;
	}

	public void setLoaded() {
		loaded = true;
	}

	public void save(NBTTagCompound tag) {
		tag.setByte("dir", (byte) dir.ordinal());
		tag.setInteger("sub", subID);
	}

	public void load(NBTTagCompound tag) {
		dir = ForgeDirection.values()[tag.getByte("dir")];
		subID = tag.getInteger("sub");
		loaded = true;
	}

}

@@ -1015,14 +1015,8 @@
 nced
-Single
 .%0A%09i

Fix strange refactor error