/** * 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.annoreg.mc.network; import java.util.HashMap; import java.util.Map; import net.minecraft.entity.Entity; import net.minecraft.tileentity.TileEntity; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; /** * Helper to convert objects into TargetPoint and do further network sending. * @author WeAthFolD */ public class TargetPointHelper { public static final double DEFAULT_RANGE = 16; public interface TargetPointConverter<T> { TargetPoint convert(T object, double range); } private static Map<Class<?>, TargetPointConverter> converters = new HashMap(); public static void addConverter(Class<?> klass, TargetPointConverter conv) { if(converters.containsKey(klass)) { throw new RuntimeException("Cannot add multiple TargetPointConverter for class " + klass); } converters.put(klass, conv); } public static TargetPointConverter findConverter(Object obj) { Class klass = obj.getClass(); TargetPointConverter conv; while(klass != null) { if((conv = converters.get(klass)) != null) return conv; klass = klass.getSuperclass(); } return null; } public static TargetPoint convert(Object obj, double range) { TargetPointConverter conv = findConverter(obj); if(conv == null) { throw new UnsupportedOperationException("Didn't find TargetPoint converter for " + obj); } return conv.convert(obj, range); } static { addConverter(TargetPoint.class, new TargetPointConverter<TargetPoint>() { @Override public TargetPoint convert(TargetPoint object, double range) { return object; } }); addConverter(Entity.class, new TargetPointConverter<Entity>() { @Override public TargetPoint convert(Entity object, double range) { if(range == -1) range = DEFAULT_RANGE; return new TargetPoint(object.dimension, object.posX, object.posY, object.posZ, range); } }); addConverter(TileEntity.class, new TargetPointConverter<TileEntity>() { @Override public TargetPoint convert(TileEntity object, double range) { if(range == -1) range = DEFAULT_RANGE; return new TargetPoint(object.getWorldObj().provider.dimensionId, object.xCoord + 0.5, object.yCoord + 0.5, object.zCoord + 0.5, range); } }); } }