001    package cpw.mods.fml.client.modloader;
002    
003    import java.util.Collection;
004    import java.util.Collections;
005    import java.util.Map;
006    import java.util.Map.Entry;
007    
008    import net.minecraft.client.Minecraft;
009    import net.minecraft.src.BaseMod;
010    import net.minecraft.src.Entity;
011    import net.minecraft.src.EntityClientPlayerMP;
012    import net.minecraft.src.EntityPlayer;
013    import net.minecraft.src.KeyBinding;
014    import net.minecraft.src.Packet250CustomPayload;
015    import net.minecraft.src.Render;
016    
017    import com.google.common.base.Supplier;
018    import com.google.common.base.Suppliers;
019    import com.google.common.collect.Iterables;
020    import com.google.common.collect.Iterators;
021    import com.google.common.collect.Maps;
022    import com.google.common.collect.Multimap;
023    import com.google.common.collect.Multimaps;
024    
025    import cpw.mods.fml.client.FMLClientHandler;
026    import cpw.mods.fml.client.registry.KeyBindingRegistry;
027    import cpw.mods.fml.client.registry.RenderingRegistry;
028    import cpw.mods.fml.common.FMLLog;
029    import cpw.mods.fml.common.Loader;
030    import cpw.mods.fml.common.modloader.BaseModProxy;
031    import cpw.mods.fml.common.modloader.IModLoaderSidedHelper;
032    import cpw.mods.fml.common.modloader.ModLoaderHelper;
033    import cpw.mods.fml.common.modloader.ModLoaderModContainer;
034    import cpw.mods.fml.common.network.EntitySpawnPacket;
035    import cpw.mods.fml.common.registry.EntityRegistry.EntityRegistration;
036    
037    public class ModLoaderClientHelper implements IModLoaderSidedHelper
038    {
039    
040        /**
041         * @param mod
042         * @param inventoryRenderer
043         * @return
044         */
045        public static int obtainBlockModelIdFor(BaseMod mod, boolean inventoryRenderer)
046        {
047            int renderId=RenderingRegistry.getNextAvailableRenderId();
048            ModLoaderBlockRendererHandler bri=new ModLoaderBlockRendererHandler(renderId, inventoryRenderer, mod);
049            RenderingRegistry.registerBlockHandler(bri);
050            return renderId;
051        }
052    
053    
054        public static void handleFinishLoadingFor(ModLoaderModContainer mc, Minecraft game)
055        {
056            FMLLog.finer("Handling post startup activities for ModLoader mod %s", mc.getModId());
057            BaseMod mod = (BaseMod) mc.getMod();
058    
059            Map<Class<? extends Entity>, Render> renderers = Maps.newHashMap();
060    
061            mod.addRenderer(renderers);
062    
063            for (Entry<Class<? extends Entity>, Render> e : renderers.entrySet())
064            {
065                FMLLog.finest("Registering ModLoader entity renderer %s as instance of %s", e.getKey().getName(), e.getValue().getClass().getName());
066                RenderingRegistry.registerEntityRenderingHandler(e.getKey(), e.getValue());
067            }
068    
069            mod.registerAnimation(game);
070        }
071    
072        public ModLoaderClientHelper(Minecraft client)
073        {
074            this.client = client;
075            ModLoaderHelper.sidedHelper = this;
076            keyBindingContainers = Multimaps.newMultimap(Maps.<ModLoaderModContainer, Collection<ModLoaderKeyBindingHandler>>newHashMap(), new Supplier<Collection<ModLoaderKeyBindingHandler>>()
077            {
078                @Override
079                public Collection<ModLoaderKeyBindingHandler> get()
080                {
081                    return Collections.singleton(new ModLoaderKeyBindingHandler());
082                }
083            });
084        }
085    
086        private Minecraft client;
087        private static Multimap<ModLoaderModContainer, ModLoaderKeyBindingHandler> keyBindingContainers;
088    
089        @Override
090        public void finishModLoading(ModLoaderModContainer mc)
091        {
092            handleFinishLoadingFor(mc, client);
093        }
094    
095    
096        public static void registerKeyBinding(BaseModProxy mod, KeyBinding keyHandler, boolean allowRepeat)
097        {
098            ModLoaderModContainer mlmc = (ModLoaderModContainer) Loader.instance().activeModContainer();
099            ModLoaderKeyBindingHandler handler = Iterables.getOnlyElement(keyBindingContainers.get(mlmc));
100            handler.setModContainer(mlmc);
101            handler.addKeyBinding(keyHandler, allowRepeat);
102            KeyBindingRegistry.registerKeyBinding(handler);
103        }
104    
105    
106        @Override
107        public Object getClientGui(BaseModProxy mod, EntityPlayer player, int ID, int x, int y, int z)
108        {
109            return ((net.minecraft.src.BaseMod)mod).getContainerGUI((EntityClientPlayerMP) player, ID, x, y, z);
110        }
111    
112    
113        @Override
114        public Entity spawnEntity(BaseModProxy mod, EntitySpawnPacket input, EntityRegistration er)
115        {
116            return ((net.minecraft.src.BaseMod)mod).spawnEntity(er.getModEntityId(), client.theWorld, input.scaledX, input.scaledY, input.scaledZ);
117        }
118    
119    
120        @Override
121        public void sendClientPacket(BaseModProxy mod, Packet250CustomPayload packet)
122        {
123            ((net.minecraft.src.BaseMod)mod).clientCustomPayload(client.thePlayer.sendQueue, packet);
124        }
125    }