package mods.ocminecart.common.entityextend; import cpw.mods.fml.common.Loader; import li.cil.oc.api.API; import mods.ocminecart.OCMinecart; import net.minecraft.entity.item.EntityMinecart; import java.util.ArrayList; import java.util.HashMap; import java.util.UUID; public class RemoteExtenderRegister { private static HashMap<Class<? extends EntityMinecart>, Class<? extends RemoteCartExtender>> list = new HashMap<Class<? extends EntityMinecart>, Class<? extends RemoteCartExtender>>(); private static ArrayList<RemoteCartExtender> updater = new ArrayList<RemoteCartExtender>(); public static boolean registerRemote(Class<? extends EntityMinecart> cart, Class<? extends RemoteCartExtender> remote){ if(list.containsKey(cart)) return false; list.put(cart, remote); return true; } public static int addRemote(EntityMinecart cart){ if(!list.containsKey(cart.getClass())) return 1; if(cart.getExtendedProperties(RemoteCartExtender.PROP_ID)!=null) return 2; Class<? extends RemoteCartExtender> c = list.get(cart.getClass()); try { RemoteCartExtender remote = c.newInstance(); cart.registerExtendedProperties(RemoteCartExtender.PROP_ID, remote); } catch (Exception e) { OCMinecart.logger.fatal("Error. Tried to add the remote extender "+c.getName()+" to Minecart "+cart.getClass().getName()); e.printStackTrace(); return 1; } return 0; } public static boolean hasRemote(EntityMinecart cart){ return cart.getExtendedProperties(RemoteCartExtender.PROP_ID)!=null && (cart.getExtendedProperties(RemoteCartExtender.PROP_ID) instanceof RemoteCartExtender); } public static int enableRemote(EntityMinecart cart, boolean b){ if(!hasRemote(cart)) return 1; RemoteCartExtender ext = (RemoteCartExtender) cart.getExtendedProperties(RemoteCartExtender.PROP_ID); if(ext==null) return 1; if(ext.isEnabled() == b) return 2; ext.setEnabled(b); return 0; } public static boolean isRemoteEnabled(EntityMinecart cart){ if(!hasRemote(cart)) return false; RemoteCartExtender ext = (RemoteCartExtender) cart.getExtendedProperties(RemoteCartExtender.PROP_ID); if(ext==null) return false; return ext.isEnabled(); } public static boolean addRemoteUpdate(RemoteCartExtender ext){ if(updater.contains(ext)) return false; updater.add(ext); return true; } public static boolean containsEntity(UUID uuid){ if(updater.isEmpty() || uuid == null) return false; for(int i=0;i<updater.size();i+=1){ if(updater.get(i).entity!=null && updater.get(i).entity.getUniqueID().equals(uuid) ){ return true; } } return false; } public static void removeRemoteUpdate(EntityMinecart entity){ if(updater.isEmpty() || entity == null) return; for(int i=0; i<updater.size(); i++){ RemoteCartExtender e = updater.get(i); if(!e.isEnabled() || e.entity.getUniqueID() == entity.getUniqueID()){ e.setEnabled(false,true); } } } public static boolean removeRemoteUpdate(RemoteCartExtender ext){ if(!updater.contains(ext)) return false; updater.remove(ext); API.network.leaveWirelessNetwork(ext); //Sometimes it doesn't leave the network (Dimension changing) return true; } public static void serverTick(){ ArrayList<Integer> marked = new ArrayList<Integer>(); for(int i=0;i<updater.size();i+=1){ if(updater.get(i).isEnabled()) updater.get(i).update(); else marked.add(i); } if(!marked.isEmpty()){ for(int i=0;i<marked.size();i+=1){ updater.remove(marked.get(i)); } } } public static RemoteCartExtender getExtender(EntityMinecart cart){ if(!hasRemote(cart)) return null; return (RemoteCartExtender) cart.getExtendedProperties(RemoteCartExtender.PROP_ID); } public static void reinit() { updater.clear(); } public static void register(){ if(Loader.isModLoaded("Railcraft")){ registerRemote(mods.railcraft.common.carts.EntityLocomotiveSteamSolid.class, RemoteSteamLocomotive.class); registerRemote(mods.railcraft.common.carts.EntityLocomotiveElectric.class, RemoteElectricLocomotive.class); } } }