package openblocks.client.renderer.entity; import com.google.common.collect.Maps; import cpw.mods.fml.common.eventhandler.Event; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import java.util.Map; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.RenderGlobal; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraftforge.client.event.RenderWorldLastEvent; import net.minecraftforge.common.MinecraftForge; public class EntitySelectionHandler { public interface ISelectAware {} public interface ISelectionRenderer<E extends Entity> { public void render(E e, EntityPlayer player, RenderGlobal context, float partialTickTime); } public static class RegisterSelectionRendererEvent<I extends Entity & ISelectAware> extends Event { public Class<I> cls; public ISelectionRenderer<I> renderer; } public static <I extends Entity & ISelectAware> void registerRenderer(Class<I> cls, ISelectionRenderer<I> renderer) { RegisterSelectionRendererEvent<I> evt = new RegisterSelectionRendererEvent<I>(); evt.cls = cls; evt.renderer = renderer; MinecraftForge.EVENT_BUS.post(evt); } private final Map<Class<? extends Entity>, ISelectionRenderer<Entity>> registry = Maps.newIdentityHashMap(); @SubscribeEvent public void renderEvents(RenderWorldLastEvent evt) { final Minecraft mc = Minecraft.getMinecraft(); if (mc.objectMouseOver != null) { final Entity target = mc.objectMouseOver.entityHit; if (target instanceof ISelectAware) { ISelectionRenderer<Entity> renderer = registry.get(mc.objectMouseOver.entityHit.getClass()); if (renderer != null) renderer.render(target, mc.thePlayer, evt.context, evt.partialTicks); } } } @SubscribeEvent @SuppressWarnings("unchecked") public void handleRegister(RegisterSelectionRendererEvent<?> evt) { registry.put(evt.cls, (ISelectionRenderer<Entity>)evt.renderer); } }