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 }