001 /*
002 * The FML Forge Mod Loader suite.
003 * Copyright (C) 2012 cpw
004 *
005 * This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free
006 * Software Foundation; either version 2.1 of the License, or any later version.
007 *
008 * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
009 * A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
010 *
011 * You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51
012 * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
013 */
014
015 package cpw.mods.fml.common.modloader;
016
017 import java.util.EnumSet;
018 import java.util.HashMap;
019 import java.util.Map;
020 import java.util.concurrent.Callable;
021
022 import com.google.common.collect.ArrayListMultimap;
023 import com.google.common.collect.HashMultimap;
024 import com.google.common.collect.ListMultimap;
025 import com.google.common.collect.Maps;
026 import com.google.common.collect.SetMultimap;
027
028 import net.minecraft.command.ICommand;
029 import net.minecraft.entity.Entity;
030 import net.minecraft.entity.passive.IAnimals;
031 import net.minecraft.entity.boss.EntityDragon;
032 import net.minecraft.entity.player.EntityPlayer;
033 import net.minecraft.inventory.Container;
034 import net.minecraft.src.BaseMod;
035 import net.minecraft.src.TradeEntry;
036 import cpw.mods.fml.common.FMLCommonHandler;
037 import cpw.mods.fml.common.FMLLog;
038 import cpw.mods.fml.common.ICraftingHandler;
039 import cpw.mods.fml.common.IDispenseHandler;
040 import cpw.mods.fml.common.IDispenserHandler;
041 import cpw.mods.fml.common.IFuelHandler;
042 import cpw.mods.fml.common.IPickupNotifier;
043 import cpw.mods.fml.common.IWorldGenerator;
044 import cpw.mods.fml.common.Loader;
045 import cpw.mods.fml.common.TickType;
046 import cpw.mods.fml.common.network.IChatListener;
047 import cpw.mods.fml.common.network.IConnectionHandler;
048 import cpw.mods.fml.common.network.IGuiHandler;
049 import cpw.mods.fml.common.network.IPacketHandler;
050 import cpw.mods.fml.common.network.NetworkRegistry;
051 import cpw.mods.fml.common.registry.EntityRegistry;
052 import cpw.mods.fml.common.registry.EntityRegistry.EntityRegistration;
053 import cpw.mods.fml.common.registry.VillagerRegistry.IVillageTradeHandler;
054 import cpw.mods.fml.common.registry.VillagerRegistry;
055
056 /**
057 * @author cpw
058 *
059 */
060 @SuppressWarnings("deprecation")
061 public class ModLoaderHelper
062 {
063 public static IModLoaderSidedHelper sidedHelper;
064
065 private static Map<BaseModProxy, ModLoaderGuiHelper> guiHelpers = Maps.newHashMap();
066 private static Map<Integer, ModLoaderGuiHelper> guiIDs = Maps.newHashMap();
067
068 public static void updateStandardTicks(BaseModProxy mod, boolean enable, boolean useClock)
069 {
070 ModLoaderModContainer mlmc = (ModLoaderModContainer) Loader.instance().getReversedModObjectList().get(mod);
071 if (mlmc==null)
072 {
073 mlmc = (ModLoaderModContainer) Loader.instance().activeModContainer();
074 }
075 if (mlmc == null)
076 {
077 FMLLog.severe("Attempted to register ModLoader ticking for invalid BaseMod %s",mod);
078 return;
079 }
080 BaseModTicker ticker = mlmc.getGameTickHandler();
081 EnumSet<TickType> ticks = ticker.ticks();
082 // If we're enabled we get render ticks
083 if (enable && !useClock) {
084 ticks.add(TickType.RENDER);
085 } else {
086 ticks.remove(TickType.RENDER);
087 }
088 // If we're enabled but we want clock ticks, or we're server side we get game ticks
089 if (enable && (useClock || FMLCommonHandler.instance().getSide().isServer())) {
090 ticks.add(TickType.CLIENT);
091 ticks.add(TickType.WORLDLOAD);
092 } else {
093 ticks.remove(TickType.CLIENT);
094 ticks.remove(TickType.WORLDLOAD);
095 }
096 }
097
098 public static void updateGUITicks(BaseModProxy mod, boolean enable, boolean useClock)
099 {
100 ModLoaderModContainer mlmc = (ModLoaderModContainer) Loader.instance().getReversedModObjectList().get(mod);
101 if (mlmc==null)
102 {
103 mlmc = (ModLoaderModContainer) Loader.instance().activeModContainer();
104 }
105 if (mlmc == null)
106 {
107 FMLLog.severe("Attempted to register ModLoader ticking for invalid BaseMod %s",mod);
108 return;
109 }
110 EnumSet<TickType> ticks = mlmc.getGUITickHandler().ticks();
111 // If we're enabled and we don't want clock ticks we get render ticks
112 if (enable && !useClock) {
113 ticks.add(TickType.RENDER);
114 } else {
115 ticks.remove(TickType.RENDER);
116 }
117 // If we're enabled but we want clock ticks, or we're server side we get world ticks
118 if (enable && useClock) {
119 ticks.add(TickType.CLIENT);
120 ticks.add(TickType.WORLDLOAD);
121 } else {
122 ticks.remove(TickType.CLIENT);
123 ticks.remove(TickType.WORLDLOAD);
124 }
125 }
126
127 public static IPacketHandler buildPacketHandlerFor(BaseModProxy mod)
128 {
129 return new ModLoaderPacketHandler(mod);
130 }
131
132 public static IWorldGenerator buildWorldGenHelper(BaseModProxy mod)
133 {
134 return new ModLoaderWorldGenerator(mod);
135 }
136
137 public static IFuelHandler buildFuelHelper(BaseModProxy mod)
138 {
139 return new ModLoaderFuelHelper(mod);
140 }
141
142 public static ICraftingHandler buildCraftingHelper(BaseModProxy mod)
143 {
144 return new ModLoaderCraftingHelper(mod);
145 }
146
147 public static void finishModLoading(ModLoaderModContainer mc)
148 {
149 if (sidedHelper != null)
150 {
151 sidedHelper.finishModLoading(mc);
152 }
153 }
154
155 public static IConnectionHandler buildConnectionHelper(BaseModProxy mod)
156 {
157 return new ModLoaderConnectionHandler(mod);
158 }
159
160 public static IPickupNotifier buildPickupHelper(BaseModProxy mod)
161 {
162 return new ModLoaderPickupNotifier(mod);
163 }
164
165 public static void buildGuiHelper(BaseModProxy mod, int id)
166 {
167 ModLoaderGuiHelper handler = guiHelpers.get(mod);
168 if (handler == null)
169 {
170 handler = new ModLoaderGuiHelper(mod);
171 guiHelpers.put(mod,handler);
172 NetworkRegistry.instance().registerGuiHandler(mod, handler);
173 }
174 handler.associateId(id);
175 guiIDs.put(id, handler);
176 }
177
178 public static void openGui(int id, EntityPlayer player, Container container, int x, int y, int z)
179 {
180 ModLoaderGuiHelper helper = guiIDs.get(id);
181 helper.injectContainerAndID(container, id);
182 player.openGui(helper.getMod(), id, player.worldObj, x, y, z);
183 }
184
185 public static Object getClientSideGui(BaseModProxy mod, EntityPlayer player, int ID, int x, int y, int z)
186 {
187 if (sidedHelper != null)
188 {
189 return sidedHelper.getClientGui(mod, player, ID, x, y, z);
190 }
191 return null;
192 }
193
194 public static IDispenserHandler buildDispenseHelper(BaseModProxy mod)
195 {
196 return new ModLoaderDispenseHelper(mod);
197 }
198
199
200 public static void buildEntityTracker(BaseModProxy mod, Class<? extends Entity> entityClass, int entityTypeId, int updateRange, int updateInterval,
201 boolean sendVelocityInfo)
202 {
203 EntityRegistration er = EntityRegistry.registerModLoaderEntity(mod, entityClass, entityTypeId, updateRange, updateInterval, sendVelocityInfo);
204 er.setCustomSpawning(new ModLoaderEntitySpawnCallback(mod, er), EntityDragon.class.isAssignableFrom(entityClass) || IAnimals.class.isAssignableFrom(entityClass));
205 }
206
207 private static ModLoaderVillageTradeHandler[] tradeHelpers = new ModLoaderVillageTradeHandler[6];
208
209 public static void registerTrade(int profession, TradeEntry entry)
210 {
211 assert profession < tradeHelpers.length : "The profession is out of bounds";
212 if (tradeHelpers[profession] == null)
213 {
214 tradeHelpers[profession] = new ModLoaderVillageTradeHandler();
215 VillagerRegistry.instance().registerVillageTradeHandler(profession, tradeHelpers[profession]);
216 }
217
218 tradeHelpers[profession].addTrade(entry);
219 }
220
221 public static void addCommand(ICommand command)
222 {
223 ModLoaderModContainer mlmc = (ModLoaderModContainer) Loader.instance().activeModContainer();
224 if (mlmc!=null)
225 {
226 mlmc.addServerCommand(command);
227 }
228 }
229
230 public static IChatListener buildChatListener(BaseModProxy mod)
231 {
232 return new ModLoaderChatListener(mod);
233 }
234 }