/*
* The FML Forge Mod Loader suite.
* Copyright (C) 2012 cpw
*
* 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
* Software Foundation; either version 2.1 of the License, or any later version.
*
* 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
* A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
*
* 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
* Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
package cpw.mods.fml.common.modloader;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.Callable;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.ListMultimap;
import com.google.common.collect.Maps;
import com.google.common.collect.SetMultimap;
import net.minecraft.command.ICommand;
import net.minecraft.entity.Entity;
import net.minecraft.entity.passive.IAnimals;
import net.minecraft.entity.boss.EntityDragon;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.src.BaseMod;
import net.minecraft.src.TradeEntry;
import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.common.FMLLog;
import cpw.mods.fml.common.ICraftingHandler;
import cpw.mods.fml.common.IDispenseHandler;
import cpw.mods.fml.common.IDispenserHandler;
import cpw.mods.fml.common.IFuelHandler;
import cpw.mods.fml.common.IPickupNotifier;
import cpw.mods.fml.common.IWorldGenerator;
import cpw.mods.fml.common.Loader;
import cpw.mods.fml.common.TickType;
import cpw.mods.fml.common.network.IChatListener;
import cpw.mods.fml.common.network.IConnectionHandler;
import cpw.mods.fml.common.network.IGuiHandler;
import cpw.mods.fml.common.network.IPacketHandler;
import cpw.mods.fml.common.network.NetworkRegistry;
import cpw.mods.fml.common.registry.EntityRegistry;
import cpw.mods.fml.common.registry.EntityRegistry.EntityRegistration;
import cpw.mods.fml.common.registry.VillagerRegistry.IVillageTradeHandler;
import cpw.mods.fml.common.registry.VillagerRegistry;
/**
* @author cpw
*
*/
@SuppressWarnings("deprecation")
public class ModLoaderHelper
{
public static IModLoaderSidedHelper sidedHelper;
private static Map<BaseModProxy, ModLoaderGuiHelper> guiHelpers = Maps.newHashMap();
private static Map<Integer, ModLoaderGuiHelper> guiIDs = Maps.newHashMap();
public static void updateStandardTicks(BaseModProxy mod, boolean enable, boolean useClock)
{
ModLoaderModContainer mlmc = (ModLoaderModContainer) Loader.instance().getReversedModObjectList().get(mod);
if (mlmc==null)
{
mlmc = (ModLoaderModContainer) Loader.instance().activeModContainer();
}
if (mlmc == null)
{
FMLLog.severe("Attempted to register ModLoader ticking for invalid BaseMod %s",mod);
return;
}
BaseModTicker ticker = mlmc.getGameTickHandler();
EnumSet<TickType> ticks = ticker.ticks();
// If we're enabled we get render ticks
if (enable && !useClock) {
ticks.add(TickType.RENDER);
} else {
ticks.remove(TickType.RENDER);
}
// If we're enabled but we want clock ticks, or we're server side we get game ticks
if (enable && (useClock || FMLCommonHandler.instance().getSide().isServer())) {
ticks.add(TickType.CLIENT);
ticks.add(TickType.WORLDLOAD);
} else {
ticks.remove(TickType.CLIENT);
ticks.remove(TickType.WORLDLOAD);
}
}
public static void updateGUITicks(BaseModProxy mod, boolean enable, boolean useClock)
{
ModLoaderModContainer mlmc = (ModLoaderModContainer) Loader.instance().getReversedModObjectList().get(mod);
if (mlmc==null)
{
mlmc = (ModLoaderModContainer) Loader.instance().activeModContainer();
}
if (mlmc == null)
{
FMLLog.severe("Attempted to register ModLoader ticking for invalid BaseMod %s",mod);
return;
}
EnumSet<TickType> ticks = mlmc.getGUITickHandler().ticks();
// If we're enabled and we don't want clock ticks we get render ticks
if (enable && !useClock) {
ticks.add(TickType.RENDER);
} else {
ticks.remove(TickType.RENDER);
}
// If we're enabled but we want clock ticks, or we're server side we get world ticks
if (enable && useClock) {
ticks.add(TickType.CLIENT);
ticks.add(TickType.WORLDLOAD);
} else {
ticks.remove(TickType.CLIENT);
ticks.remove(TickType.WORLDLOAD);
}
}
public static IPacketHandler buildPacketHandlerFor(BaseModProxy mod)
{
return new ModLoaderPacketHandler(mod);
}
public static IWorldGenerator buildWorldGenHelper(BaseModProxy mod)
{
return new ModLoaderWorldGenerator(mod);
}
public static IFuelHandler buildFuelHelper(BaseModProxy mod)
{
return new ModLoaderFuelHelper(mod);
}
public static ICraftingHandler buildCraftingHelper(BaseModProxy mod)
{
return new ModLoaderCraftingHelper(mod);
}
public static void finishModLoading(ModLoaderModContainer mc)
{
if (sidedHelper != null)
{
sidedHelper.finishModLoading(mc);
}
}
public static IConnectionHandler buildConnectionHelper(BaseModProxy mod)
{
return new ModLoaderConnectionHandler(mod);
}
public static IPickupNotifier buildPickupHelper(BaseModProxy mod)
{
return new ModLoaderPickupNotifier(mod);
}
public static void buildGuiHelper(BaseModProxy mod, int id)
{
ModLoaderGuiHelper handler = guiHelpers.get(mod);
if (handler == null)
{
handler = new ModLoaderGuiHelper(mod);
guiHelpers.put(mod,handler);
NetworkRegistry.instance().registerGuiHandler(mod, handler);
}
handler.associateId(id);
guiIDs.put(id, handler);
}
public static void openGui(int id, EntityPlayer player, Container container, int x, int y, int z)
{
ModLoaderGuiHelper helper = guiIDs.get(id);
helper.injectContainerAndID(container, id);
player.openGui(helper.getMod(), id, player.worldObj, x, y, z);
}
public static Object getClientSideGui(BaseModProxy mod, EntityPlayer player, int ID, int x, int y, int z)
{
if (sidedHelper != null)
{
return sidedHelper.getClientGui(mod, player, ID, x, y, z);
}
return null;
}
public static IDispenserHandler buildDispenseHelper(BaseModProxy mod)
{
return new ModLoaderDispenseHelper(mod);
}
public static void buildEntityTracker(BaseModProxy mod, Class<? extends Entity> entityClass, int entityTypeId, int updateRange, int updateInterval,
boolean sendVelocityInfo)
{
EntityRegistration er = EntityRegistry.registerModLoaderEntity(mod, entityClass, entityTypeId, updateRange, updateInterval, sendVelocityInfo);
er.setCustomSpawning(new ModLoaderEntitySpawnCallback(mod, er), EntityDragon.class.isAssignableFrom(entityClass) || IAnimals.class.isAssignableFrom(entityClass));
}
private static ModLoaderVillageTradeHandler[] tradeHelpers = new ModLoaderVillageTradeHandler[6];
public static void registerTrade(int profession, TradeEntry entry)
{
assert profession < tradeHelpers.length : "The profession is out of bounds";
if (tradeHelpers[profession] == null)
{
tradeHelpers[profession] = new ModLoaderVillageTradeHandler();
VillagerRegistry.instance().registerVillageTradeHandler(profession, tradeHelpers[profession]);
}
tradeHelpers[profession].addTrade(entry);
}
public static void addCommand(ICommand command)
{
ModLoaderModContainer mlmc = (ModLoaderModContainer) Loader.instance().activeModContainer();
if (mlmc!=null)
{
mlmc.addServerCommand(command);
}
}
public static IChatListener buildChatListener(BaseModProxy mod)
{
return new ModLoaderChatListener(mod);
}
}