/** * 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.liutils.core.event.eventhandler; import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedList; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.gameevent.InputEvent.KeyInputEvent; import cpw.mods.fml.common.gameevent.InputEvent.MouseInputEvent; import cpw.mods.fml.common.gameevent.PlayerEvent.ItemCraftedEvent; import cpw.mods.fml.common.gameevent.PlayerEvent.ItemPickupEvent; import cpw.mods.fml.common.gameevent.PlayerEvent.ItemSmeltedEvent; import cpw.mods.fml.common.gameevent.PlayerEvent.PlayerChangedDimensionEvent; import cpw.mods.fml.common.gameevent.PlayerEvent.PlayerLoggedInEvent; import cpw.mods.fml.common.gameevent.PlayerEvent.PlayerLoggedOutEvent; import cpw.mods.fml.common.gameevent.PlayerEvent.PlayerRespawnEvent; import cpw.mods.fml.common.gameevent.TickEvent.ClientTickEvent; import cpw.mods.fml.common.gameevent.TickEvent.PlayerTickEvent; import cpw.mods.fml.common.gameevent.TickEvent.RenderTickEvent; import cpw.mods.fml.common.gameevent.TickEvent.ServerTickEvent; import cpw.mods.fml.common.gameevent.TickEvent.WorldTickEvent; import cpw.mods.fml.common.network.FMLNetworkEvent.ClientDisconnectionFromServerEvent; /** * * @author Violet * */ public class LIFMLGameEventDispatcher { public static final LIFMLGameEventDispatcher INSTANCE = new LIFMLGameEventDispatcher(); private LIFMLGameEventDispatcher() { } public static void init() { FMLCommonHandler.instance().bus().register(INSTANCE); } public void registerMouseInput(LIHandler handler) { addMouseInput.add(handler); } public void registerKeyInput(LIHandler handler) { addKeyInput.add(handler); } public void registerItemPickup(LIHandler handler) { addItemPickup.add(handler); } public void registerItemCrafted(LIHandler handler) { addItemCrafted.add(handler); } public void registerItemSmelted(LIHandler handler) { addItemSmelted.add(handler); } public void registerPlayerLoggedIn(LIHandler handler) { addPlayerLoggedIn.add(handler); } public void registerPlayerLoggedOut(LIHandler handler) { addPlayerLoggedOut.add(handler); } public void registerPlayerRespawn(LIHandler handler) { addPlayerRespawn.add(handler); } public void registerPlayerChangedDimension(LIHandler handler) { addPlayerChangedDimension.add(handler); } public void registerServerTick(LIHandler handler) { addServerTick.add(handler); } public void registerClientTick(LIHandler handler) { addClientTick.add(handler); } public void registerWorldTick(LIHandler handler) { addWorldTick.add(handler); } public void registerPlayerTick(LIHandler handler) { addPlayerTick.add(handler); } public void registerRenderTick(LIHandler handler) { addRenderTick.add(handler); } private final LinkedList<LIHandler> hMouseInput = new LinkedList<LIHandler>(); private final ArrayList<LIHandler> addMouseInput = new ArrayList<LIHandler>(); private final LinkedList<LIHandler> hKeyInput = new LinkedList<LIHandler>(); private final ArrayList<LIHandler> addKeyInput = new ArrayList<LIHandler>(); private final LinkedList<LIHandler> hItemPickup = new LinkedList<LIHandler>(); private final ArrayList<LIHandler> addItemPickup = new ArrayList<LIHandler>(); private final LinkedList<LIHandler> hItemCrafted = new LinkedList<LIHandler>(); private final ArrayList<LIHandler> addItemCrafted = new ArrayList<LIHandler>(); private final LinkedList<LIHandler> hItemSmelted = new LinkedList<LIHandler>(); private final ArrayList<LIHandler> addItemSmelted = new ArrayList<LIHandler>(); private final LinkedList<LIHandler> hPlayerLoggedIn = new LinkedList<LIHandler>(); private final ArrayList<LIHandler> addPlayerLoggedIn = new ArrayList<LIHandler>(); private final LinkedList<LIHandler> hPlayerLoggedOut = new LinkedList<LIHandler>(); private final ArrayList<LIHandler> addPlayerLoggedOut = new ArrayList<LIHandler>(); private final LinkedList<LIHandler> hPlayerRespawn = new LinkedList<LIHandler>(); private final ArrayList<LIHandler> addPlayerRespawn = new ArrayList<LIHandler>(); private final LinkedList<LIHandler> hPlayerChangedDimension = new LinkedList<LIHandler>(); private final ArrayList<LIHandler> addPlayerChangedDimension = new ArrayList<LIHandler>(); private final LinkedList<LIHandler> hServerTick = new LinkedList<LIHandler>(); private final ArrayList<LIHandler> addServerTick = new ArrayList<LIHandler>(); private final LinkedList<LIHandler> hClientTick = new LinkedList<LIHandler>(); private final ArrayList<LIHandler> addClientTick = new ArrayList<LIHandler>(); private final LinkedList<LIHandler> hWorldTick = new LinkedList<LIHandler>(); private final ArrayList<LIHandler> addWorldTick = new ArrayList<LIHandler>(); private final LinkedList<LIHandler> hPlayerTick = new LinkedList<LIHandler>(); private final ArrayList<LIHandler> addPlayerTick = new ArrayList<LIHandler>(); private final LinkedList<LIHandler> hRenderTick = new LinkedList<LIHandler>(); private final ArrayList<LIHandler> addRenderTick = new ArrayList<LIHandler>(); @SubscribeEvent public void onMouseInput(MouseInputEvent event) { if (!addMouseInput.isEmpty()) { hMouseInput.addAll(addMouseInput); addMouseInput.clear(); } for (Iterator<LIHandler> it = hMouseInput.iterator(); it.hasNext(); ) { LIHandler handler = it.next(); if (handler.isDead()) it.remove(); else handler.trigger(event); } } @SubscribeEvent public void onKeyInput(KeyInputEvent event) { if (!addKeyInput.isEmpty()) { hKeyInput.addAll(addKeyInput); addKeyInput.clear(); } for (Iterator<LIHandler> it = hKeyInput.iterator(); it.hasNext(); ) { LIHandler handler = it.next(); if (handler.isDead()) it.remove(); else handler.trigger(event); } } @SubscribeEvent public void onItemPickup(ItemPickupEvent event) { if (!addItemPickup.isEmpty()) { hItemPickup.addAll(addItemPickup); addItemPickup.clear(); } for (Iterator<LIHandler> it = hItemPickup.iterator(); it.hasNext(); ) { LIHandler handler = it.next(); if (handler.isDead()) it.remove(); else handler.trigger(event); } } @SubscribeEvent public void onItemCrafted(ItemCraftedEvent event) { if (!addItemCrafted.isEmpty()) { hItemCrafted.addAll(addItemCrafted); addItemCrafted.clear(); } for (Iterator<LIHandler> it = hItemCrafted.iterator(); it.hasNext(); ) { LIHandler handler = it.next(); if (handler.isDead()) it.remove(); else handler.trigger(event); } } @SubscribeEvent public void onItemSmelted(ItemSmeltedEvent event) { if (!addItemSmelted.isEmpty()) { hItemSmelted.addAll(addItemSmelted); addItemSmelted.clear(); } for (Iterator<LIHandler> it = hItemSmelted.iterator(); it.hasNext(); ) { LIHandler handler = it.next(); if (handler.isDead()) it.remove(); else handler.trigger(event); } } @SubscribeEvent public void onPlayerLoggedIn(PlayerLoggedInEvent event) { if (!addPlayerLoggedIn.isEmpty()) { hPlayerLoggedIn.addAll(addPlayerLoggedIn); addPlayerLoggedIn.clear(); } for (Iterator<LIHandler> it = hPlayerLoggedIn.iterator(); it.hasNext(); ) { LIHandler handler = it.next(); if (handler.isDead()) it.remove(); else handler.trigger(event); } } @SubscribeEvent public void onPlayerLoggedOut(PlayerLoggedOutEvent event) { if (!addPlayerLoggedOut.isEmpty()) { hPlayerLoggedOut.addAll(addPlayerLoggedOut); addPlayerLoggedOut.clear(); } for (Iterator<LIHandler> it = hPlayerLoggedOut.iterator(); it.hasNext(); ) { LIHandler handler = it.next(); if (handler.isDead()) it.remove(); else handler.trigger(event); } } @SubscribeEvent public void onPlayerRespawn(PlayerRespawnEvent event) { if (!addPlayerRespawn.isEmpty()) { hPlayerRespawn.addAll(addPlayerRespawn); addPlayerRespawn.clear(); } for (Iterator<LIHandler> it = hPlayerRespawn.iterator(); it.hasNext(); ) { LIHandler handler = it.next(); if (handler.isDead()) it.remove(); else handler.trigger(event); } } @SubscribeEvent public void onPlayerChangedDimension(PlayerChangedDimensionEvent event) { if (!addPlayerChangedDimension.isEmpty()) { hPlayerChangedDimension.addAll(addPlayerChangedDimension); addPlayerChangedDimension.clear(); } for (Iterator<LIHandler> it = hPlayerChangedDimension.iterator(); it.hasNext(); ) { LIHandler handler = it.next(); if (handler.isDead()) it.remove(); else handler.trigger(event); } } @SubscribeEvent public void onServerTick(ServerTickEvent event) { if (!addServerTick.isEmpty()) { hServerTick.addAll(addServerTick); addServerTick.clear(); } for (Iterator<LIHandler> it = hServerTick.iterator(); it.hasNext(); ) { LIHandler handler = it.next(); if (handler.isDead()) it.remove(); else handler.trigger(event); } } @SubscribeEvent public void onClientTick(ClientTickEvent event) { if (!addClientTick.isEmpty()) { hClientTick.addAll(addClientTick); addClientTick.clear(); } for (Iterator<LIHandler> it = hClientTick.iterator(); it.hasNext(); ) { LIHandler handler = it.next(); if (handler.isDead()) it.remove(); else handler.trigger(event); } } @SubscribeEvent public void onWorldTick(WorldTickEvent event) { if (!addWorldTick.isEmpty()) { hWorldTick.addAll(addWorldTick); addWorldTick.clear(); } for (Iterator<LIHandler> it = hWorldTick.iterator(); it.hasNext(); ) { LIHandler handler = it.next(); if (handler.isDead()) it.remove(); else handler.trigger(event); } } @SubscribeEvent public void onPlayerTick(PlayerTickEvent event) { if (!addPlayerTick.isEmpty()) { hPlayerTick.addAll(addPlayerTick); addPlayerTick.clear(); } for (Iterator<LIHandler> it = hPlayerTick.iterator(); it.hasNext(); ) { LIHandler handler = it.next(); if (handler.isDead()) it.remove(); else handler.trigger(event); } } @SubscribeEvent public void onRenderTick(RenderTickEvent event) { if (!addRenderTick.isEmpty()) { hRenderTick.addAll(addRenderTick); addRenderTick.clear(); } for (Iterator<LIHandler> it = hRenderTick.iterator(); it.hasNext(); ) { LIHandler handler = it.next(); if (handler.isDead()) it.remove(); else handler.trigger(event); } } @SubscribeEvent public void onClientDisconnectionFromServer(ClientDisconnectionFromServerEvent event) { // FIXME some of these shouldn't be cleared, we might need to treat them differently // hMouseInput.clear(); // addMouseInput.clear(); // hKeyInput.clear(); // addKeyInput.clear(); // hItemPickup.clear(); // addItemPickup.clear(); // hItemCrafted.clear(); // addItemCrafted.clear(); // hItemSmelted.clear(); // addItemSmelted.clear(); // hPlayerLoggedIn.clear(); // addPlayerLoggedIn.clear(); // hPlayerLoggedOut.clear(); // addPlayerLoggedOut.clear(); // hPlayerRespawn.clear(); // addPlayerRespawn.clear(); // hPlayerChangedDimension.clear(); // addPlayerChangedDimension.clear(); // hServerTick.clear(); // addServerTick.clear(); // hClientTick.clear(); // addClientTick.clear(); // hWorldTick.clear(); // addWorldTick.clear(); // hPlayerTick.clear(); // addPlayerTick.clear(); // hRenderTick.clear(); // addRenderTick.clear(); } }