package openmods.proxy;
import com.google.common.base.Optional;
import cpw.mods.fml.client.FMLClientHandler;
import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.common.ICrashCallable;
import cpw.mods.fml.common.network.IGuiHandler;
import java.io.File;
import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.EntityPlayerSP;
import net.minecraft.client.network.NetHandlerPlayClient;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.network.INetHandler;
import net.minecraft.network.NetHandlerPlayServer;
import net.minecraft.world.World;
import net.minecraftforge.client.ClientCommandHandler;
import net.minecraftforge.common.DimensionManager;
import net.minecraftforge.common.MinecraftForge;
import openmods.LibConfig;
import openmods.Log;
import openmods.OpenMods;
import openmods.block.BlockSelectionHandler;
import openmods.calc.command.CommandCalc;
import openmods.calc.command.CommandCalcFactory;
import openmods.calc.command.ICommandComponent;
import openmods.config.properties.CommandConfig;
import openmods.gui.ClientGuiHandler;
import openmods.movement.PlayerMovementManager;
import openmods.source.CommandSource;
import openmods.stencil.FramebufferConstants;
import openmods.stencil.StencilPoolManager;
import openmods.stencil.StencilPoolManager.StencilPool;
import openmods.utils.render.RenderUtils;
public final class OpenClientProxy implements IOpenModsProxy {
@Override
public EntityPlayer getThePlayer() {
return FMLClientHandler.instance().getClient().thePlayer;
}
@Override
public boolean isClientPlayer(Entity player) {
return player instanceof EntityPlayerSP;
}
@Override
public long getTicks(World worldObj) {
if (worldObj != null) { return worldObj.getTotalWorldTime(); }
World cWorld = getClientWorld();
if (cWorld != null) return cWorld.getTotalWorldTime();
return 0;
}
@Override
public World getClientWorld() {
return Minecraft.getMinecraft().theWorld;
}
@Override
public World getServerWorld(int id) {
return DimensionManager.getWorld(id);
}
@Override
public File getMinecraftDir() {
return Minecraft.getMinecraft().mcDataDir;
}
@Override
public String getLogFileName() {
return "ForgeModLoader-client-0.log";
}
@Override
public Optional<String> getLanguage() {
return Optional.fromNullable(Minecraft.getMinecraft().gameSettings.language);
}
@Override
public IGuiHandler wrapHandler(IGuiHandler modSpecificHandler) {
return new ClientGuiHandler(modSpecificHandler);
}
@Override
public void preInit() {
ClientCommandHandler.instance.registerCommand(new CommandConfig("om_config_c", false));
ClientCommandHandler.instance.registerCommand(new CommandSource("om_source_c", false, OpenMods.instance.getCollector()));
if (LibConfig.enableCalculatorCommands) {
final ICommandComponent commandRoot = new CommandCalcFactory(new File(getMinecraftDir(), "scripts")).getRoot();
ClientCommandHandler.instance.registerCommand(new CommandCalc(commandRoot, "config"));
ClientCommandHandler.instance.registerCommand(new CommandCalc(commandRoot, "eval", "="));
ClientCommandHandler.instance.registerCommand(new CommandCalc(commandRoot, "fun"));
ClientCommandHandler.instance.registerCommand(new CommandCalc(commandRoot, "let"));
ClientCommandHandler.instance.registerCommand(new CommandCalc(commandRoot, "execute"));
}
RenderUtils.registerFogUpdater();
MinecraftForge.EVENT_BUS.register(new BlockSelectionHandler());
FMLCommonHandler.instance().registerCrashCallable(new ICrashCallable() {
@Override
public String call() throws Exception {
final StencilPool pool = StencilPoolManager.pool();
return String.format("Function set: %s, pool: %s, bits: %s", FramebufferConstants.getMethodSet(), pool.getType(), pool.getSize());
}
@Override
public String getLabel() {
return "Stencil buffer state";
}
});
}
@Override
public void init() {}
@Override
public void postInit() {
if (!PlayerMovementManager.isCallbackInjected()) {
Log.info("EntityPlayerSP movement callback patch not applied, using legacy solution");
FMLCommonHandler.instance().bus().register(new PlayerMovementManager.LegacyTickHandler());
}
}
@Override
public void setNowPlayingTitle(String nowPlaying) {
Minecraft.getMinecraft().ingameGUI.setRecordPlayingMessage(nowPlaying);
}
@Override
public EntityPlayer getPlayerFromHandler(INetHandler handler) {
if (handler instanceof NetHandlerPlayServer) return ((NetHandlerPlayServer)handler).playerEntity;
if (handler instanceof NetHandlerPlayClient) return getThePlayer();
return null;
}
}