package com.bioxx.tfc2;
import java.io.File;
import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.client.renderer.block.statemap.StateMapperBase;
import net.minecraft.client.renderer.color.IBlockColor;
import net.minecraft.client.renderer.entity.Render;
import net.minecraft.client.renderer.entity.RenderManager;
import net.minecraft.client.settings.GameSettings;
import net.minecraft.client.settings.KeyBinding;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.network.Packet;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.*;
import net.minecraftforge.client.GuiIngameForge;
import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.client.model.obj.OBJLoader;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.client.registry.ClientRegistry;
import net.minecraftforge.fml.client.registry.IRenderFactory;
import net.minecraftforge.fml.client.registry.RenderingRegistry;
import net.minecraftforge.fml.common.FMLCommonHandler;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.common.network.NetworkRegistry;
import com.bioxx.jmapgen.IslandMap;
import com.bioxx.jmapgen.IslandParameters.Feature;
import com.bioxx.tfc2.api.Global;
import com.bioxx.tfc2.api.types.WoodType;
import com.bioxx.tfc2.api.util.KeyBindings;
import com.bioxx.tfc2.blocks.BlockLeaves;
import com.bioxx.tfc2.blocks.BlockLeaves2;
import com.bioxx.tfc2.blocks.BlockVegetation;
import com.bioxx.tfc2.blocks.BlockVegetation.VegType;
import com.bioxx.tfc2.core.RegistryItemQueue;
import com.bioxx.tfc2.entity.*;
import com.bioxx.tfc2.handlers.client.*;
import com.bioxx.tfc2.rendering.MeshDef;
import com.bioxx.tfc2.rendering.model.*;
import com.bioxx.tfc2.rendering.tesr.AnvilTESR;
import com.bioxx.tfc2.tileentities.TileAnvil;
import com.bioxx.tfc2.world.WorldGen;
public class ClientProxy extends CommonProxy
{
private static ModelResourceLocation freshwaterLocation = new ModelResourceLocation(Reference.getResID() + "liquids", "freshwater");
private static ModelResourceLocation saltwaterLocation = new ModelResourceLocation(Reference.getResID() + "liquids", "saltwater");
@Override
public void preInit(FMLPreInitializationEvent event)
{
super.preInit(event);
setupBlockMeshes();
//Entities
RenderingRegistry.registerEntityRenderingHandler(EntityCart.class, new IRenderFactory<EntityCart>() {
@Override
public Render<? super EntityCart> createRenderFor(RenderManager manager) {
return new RenderCart(manager);
}
});
RenderingRegistry.registerEntityRenderingHandler(EntityBear.class, new IRenderFactory<EntityBear>() {
@Override
public Render<? super EntityBear> createRenderFor(RenderManager manager) {
return new RenderBear(manager);
}
});
RenderingRegistry.registerEntityRenderingHandler(EntityBearPanda.class, new IRenderFactory<EntityBearPanda>() {
@Override
public Render<? super EntityBearPanda> createRenderFor(RenderManager manager) {
return new RenderBearPanda(manager);
}
});
RenderingRegistry.registerEntityRenderingHandler(EntityLion.class, new IRenderFactory<EntityLion>() {
@Override
public Render<? super EntityLion> createRenderFor(RenderManager manager) {
return new RenderLion(manager);
}
});
RenderingRegistry.registerEntityRenderingHandler(EntityTiger.class, new IRenderFactory<EntityTiger>() {
@Override
public Render<? super EntityTiger> createRenderFor(RenderManager manager) {
return new RenderTiger(manager);
}
});
RenderingRegistry.registerEntityRenderingHandler(EntityRhino.class, new IRenderFactory<EntityRhino>() {
@Override
public Render<? super EntityRhino> createRenderFor(RenderManager manager) {
return new RenderRhino(manager);
}
});
RenderingRegistry.registerEntityRenderingHandler(EntityElephant.class, new IRenderFactory<EntityElephant>() {
@Override
public Render<? super EntityElephant> createRenderFor(RenderManager manager) {
return new RenderElephant(manager);
}
});
RenderingRegistry.registerEntityRenderingHandler(EntityMammoth.class, new IRenderFactory<EntityMammoth>() {
@Override
public Render<? super EntityMammoth> createRenderFor(RenderManager manager) {
return new RenderMammoth(manager);
}
});
RenderingRegistry.registerEntityRenderingHandler(EntityBoar.class, new IRenderFactory<EntityBoar>() {
@Override
public Render<? super EntityBoar> createRenderFor(RenderManager manager) {
return new RenderBoar(manager);
}
});
RenderingRegistry.registerEntityRenderingHandler(EntityBison.class, new IRenderFactory<EntityBison>() {
@Override
public Render<? super EntityBison> createRenderFor(RenderManager manager) {
return new RenderBison(manager);
}
});
RenderingRegistry.registerEntityRenderingHandler(EntityFoxRed.class, new IRenderFactory<EntityFoxRed>() {
@Override
public Render<? super EntityFoxRed> createRenderFor(RenderManager manager) {
return new RenderFoxRed(manager);
}
});
RenderingRegistry.registerEntityRenderingHandler(EntityFoxArctic.class, new IRenderFactory<EntityFoxArctic>() {
@Override
public Render<? super EntityFoxArctic> createRenderFor(RenderManager manager) {
return new RenderFoxArctic(manager);
}
});
RenderingRegistry.registerEntityRenderingHandler(EntityFoxDesert.class, new IRenderFactory<EntityFoxDesert>() {
@Override
public Render<? super EntityFoxDesert> createRenderFor(RenderManager manager) {
return new RenderFoxDesert(manager);
}
});
RenderingRegistry.registerEntityRenderingHandler(EntityHippo.class, new IRenderFactory<EntityHippo>() {
@Override
public Render<? super EntityHippo> createRenderFor(RenderManager manager) {
return new RenderHippo(manager);
}
});
RenderingRegistry.registerEntityRenderingHandler(EntityBigCat.class, new IRenderFactory<EntityBigCat>() {
@Override
public Render<? super EntityBigCat> createRenderFor(RenderManager manager) {
return new RenderBigCat(manager);
}
});
RenderingRegistry.registerEntityRenderingHandler(EntitySabertooth.class, new IRenderFactory<EntitySabertooth>() {
@Override
public Render<? super EntitySabertooth> createRenderFor(RenderManager manager) {
return new RenderSabertooth(manager);
}
});
RenderingRegistry.registerEntityRenderingHandler(EntityElk.class, new IRenderFactory<EntityElk>() {
@Override
public Render<? super EntityElk> createRenderFor(RenderManager manager) {
return new RenderElk(manager);
}
});
//TESR
ClientRegistry.bindTileEntitySpecialRenderer(TileAnvil.class, new AnvilTESR());
}
@Override
public void init(FMLInitializationEvent event)
{
super.init(event);
MinecraftForge.EVENT_BUS.register(new RenderOverlayHandler());
MinecraftForge.EVENT_BUS.register(new ClientRenderHandler());
MinecraftForge.EVENT_BUS.register(new BackgroundMusicHandler());
MinecraftForge.EVENT_BUS.register(new AnvilHighlightHandler());
setupBlockColors();
//Disable vanilla UI elements
GuiIngameForge.renderHealth = false;
GuiIngameForge.renderArmor = false;
GuiIngameForge.renderExperiance = false;
}
@Override
public void postInit(FMLPostInitializationEvent event)
{
super.postInit(event);
MinecraftForge.EVENT_BUS.register(new ModelBakeHandler());
}
private void registerItemMesh(Item i, ModelResourceLocation mrl)
{
ModelLoader.setCustomMeshDefinition(i, new MeshDef(mrl));
}
private void registerItemMesh(Item i, int meta, ModelResourceLocation mrl)
{
ModelLoader.setCustomModelResourceLocation(i, meta, mrl);
}
private void setupBlockColors()
{
Minecraft.getMinecraft().getBlockColors().registerBlockColorHandler(new IBlockColor()
{
@Override
public int colorMultiplier(IBlockState state, IBlockAccess worldIn, BlockPos pos, int tintIndex)
{
if(pos == null || WorldGen.getInstance() == null)
return 0x55ff55;
int x = pos.getX() >> 12;
int z = pos.getZ() >> 12;
IslandMap m = WorldGen.getInstance().getIslandMap(x, z);
double d0 = m.getParams().getIslandTemp().getMapTemp();
double d1 = 0.5;
if(worldIn instanceof ChunkCache)
d1 = Core.getMoistureFromChunk((ChunkCache)worldIn, pos);
if(m.getParams().hasFeature(Feature.Desert))
d1 *= 0.25;
if(d1 < 0.25)
{
if(state.getValue(BlockLeaves.META_PROPERTY) == WoodType.Acacia)
d1 = 0.25;
}
return ColorizerFoliage.getFoliageColor(d0, d1);
}
}, new Block[] { TFCBlocks.Leaves, TFCBlocks.Leaves2});
Minecraft.getMinecraft().getBlockColors().registerBlockColorHandler(new IBlockColor()
{
@Override
public int colorMultiplier(IBlockState state, IBlockAccess worldIn, BlockPos pos, int tintIndex)
{
if(pos == null || WorldGen.getInstance() == null)
return 0x55ff55;
VegType veg = (VegType)worldIn.getBlockState(pos).getValue(BlockVegetation.META_PROPERTY);
if(veg == VegType.DeadBush)
return 0xD8D8D8;
int x = pos.getX() >> 12;
int z = pos.getZ() >> 12;
IslandMap m = WorldGen.getInstance().getIslandMap(x, z);
double d0 = m.getParams().getIslandTemp().getMapTemp();
double d1 = 0.5;
if(worldIn instanceof ChunkCache)
d1 = Core.getMoistureFromChunk((ChunkCache)worldIn, pos);
if(m.getParams().hasFeature(Feature.Desert))
d1 *= 0.25;
return ColorizerGrass.getGrassColor(d0, d1);
}
}, new Block[] { TFCBlocks.Vegetation});
Minecraft.getMinecraft().getBlockColors().registerBlockColorHandler(new IBlockColor()
{
@Override
public int colorMultiplier(IBlockState state, IBlockAccess worldIn, BlockPos pos, int tintIndex)
{
if(pos == null || WorldGen.getInstance() == null)
return 0x55ff55;
int x = pos.getX() >> 12;
int z = pos.getZ() >> 12;
IslandMap m = WorldGen.getInstance().getIslandMap(x, z);
double d0 = m.getParams().getIslandTemp().getMapTemp();
double d1 = 0.5;
if(worldIn instanceof ChunkCache)
d1 = Core.getMoistureFromChunk((ChunkCache)worldIn, pos);
if(m.getParams().hasFeature(Feature.Desert))
d1 *= 0.25;
return ColorizerGrass.getGrassColor(d0, d1);
}
}, new Block[] { TFCBlocks.Grass});
}
@Override
public File getMinecraftDir()
{
return Minecraft.getMinecraft().mcDataDir;
}
@Override
public void registerKeys()
{
//KeyBindings.addKeyBinding(KeyBindingHandler.Key_CombatMode);
//KeyBindings.addIsRepeating(false);
//ClientRegistry.registerKeyBinding(KeyBindingHandler.Key_ToolMode);
//ClientRegistry.registerKeyBinding(KeyBindingHandler.Key_LockTool);
ClientRegistry.registerKeyBinding(KeyBindingHandler.Key_CombatMode);
//uploadKeyBindingsToGame();
}
@Override
public void registerKeyBindingHandler()
{
FMLCommonHandler.instance().bus().register(new KeyBindingHandler());
}
@Override
public void uploadKeyBindingsToGame()
{
GameSettings settings = Minecraft.getMinecraft().gameSettings;
KeyBinding[] tfcKeyBindings = KeyBindings.gatherKeyBindings();
KeyBinding[] allKeys = new KeyBinding[settings.keyBindings.length + tfcKeyBindings.length];
System.arraycopy(settings.keyBindings, 0, allKeys, 0, settings.keyBindings.length);
System.arraycopy(tfcKeyBindings, 0, allKeys, settings.keyBindings.length, tfcKeyBindings.length);
settings.keyBindings = allKeys;
settings.loadOptions();
}
@Override
public boolean isClientSide()
{
return true;
}
@Override
public void registerGuiHandler()
{
NetworkRegistry.INSTANCE.registerGuiHandler(TFC.instance, new GuiHandler());
// Register Gui Event Handler
MinecraftForge.EVENT_BUS.register(new GuiHandler());
}
//Keep at the bottom of the file so its not a nuisence
private void setupBlockMeshes()
{
OBJLoader.INSTANCE.addDomain(Reference.ModID);
ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(TFCBlocks.LooseRocks), 0, new ModelResourceLocation(Reference.ModID + ":loose_rock", "inventory"));
Item anvilItem = Item.getItemFromBlock(TFCBlocks.Anvil);
ModelLoader.setCustomModelResourceLocation(anvilItem, 0, new ModelResourceLocation(Reference.ModID + ":anvil"));
//Change the StateMapper for this block so that it will point to a different file for a specific Property
StateMapperBase ignoreState = new StateMapperBase() {
@Override
protected ModelResourceLocation getModelResourceLocation(IBlockState iBlockState)
{
if(iBlockState.getValue(BlockLeaves2.META_PROPERTY) == WoodType.Palm)
return new ModelResourceLocation("tfc2:leaves_palm");
else return new ModelResourceLocation("tfc2:leaves2");
}
};
ModelLoader.setCustomStateMapper(TFCBlocks.Leaves2, ignoreState);
registerVariantModel(Item.getItemFromBlock(TFCBlocks.Dirt), "Dirt/", Global.STONE_ALL, 0, 16);
registerVariantModel(Item.getItemFromBlock(TFCBlocks.Grass), "Grass/", Global.STONE_ALL, 0, 16);
registerVariantModel(Item.getItemFromBlock(TFCBlocks.Stone), "Stone/", Global.STONE_ALL, 0, 16);
registerVariantModel(Item.getItemFromBlock(TFCBlocks.Rubble), "Rubble/", Global.STONE_ALL, 0, 16);
registerVariantModel(Item.getItemFromBlock(TFCBlocks.Sand), "Sand/", Global.STONE_ALL, 0, 16);
registerVariantModel(Item.getItemFromBlock(TFCBlocks.Gravel), "Gravel/", Global.STONE_ALL, 0, 16);
//registerVariantModel(Item.getItemFromBlock(TFCBlocks.LooseRocks), "LooseRocks/", Global.STONE_ALL, 0, 16);
registerVariantModel(Item.getItemFromBlock(TFCBlocks.Planks), "Wood/Planks/", WoodType.getNamesArray(), 0, 16);
registerVariantModel(Item.getItemFromBlock(TFCBlocks.Sapling), "Wood/Saplings/", WoodType.getNamesArray(), 0, 16);
registerVariantModel(Item.getItemFromBlock(TFCBlocks.LogVertical), "Wood/Logs/", WoodType.getNamesArray(), 0, 16);
registerVariantModel(Item.getItemFromBlock(TFCBlocks.Leaves), "Wood/Leaves/", WoodType.getNamesArray(), 0, 16);
registerVariantModel(Item.getItemFromBlock(TFCBlocks.Planks2), "Wood/Planks/", WoodType.getNamesArray(), 16, 18);
registerVariantModel(Item.getItemFromBlock(TFCBlocks.Sapling2), "Wood/Saplings/", WoodType.getNamesArray(), 16, 19);
registerVariantModel(Item.getItemFromBlock(TFCBlocks.LogVertical2), "Wood/Logs/", WoodType.getNamesArray(), 16, 19);
registerVariantModel(Item.getItemFromBlock(TFCBlocks.Leaves2), "Wood/Leaves/", WoodType.getNamesArray(), 16, 18);
ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(TFCBlocks.Leaves2), 18, new ModelResourceLocation(Reference.ModID + ":leaves_palm", "inventory"));
//registerVariantModel(Item.getItemFromBlock(TFCBlocks.Ore), "Ore/", OreType.getNamesArray(), 0, 13);
registerVariantModel(Item.getItemFromBlock(TFCBlocks.StoneBrick), "StoneBrick/", Global.STONE_ALL, 0, 16);
registerVariantModel(Item.getItemFromBlock(TFCBlocks.StoneSmooth), "StoneSmooth/", Global.STONE_ALL, 0, 16);
registerVariantModel(Item.getItemFromBlock(TFCBlocks.SupportBeam), "Wood/SupportBeams/", WoodType.getNamesArray(), 0, 8);
registerVariantModel(Item.getItemFromBlock(TFCBlocks.SupportBeam2), "Wood/SupportBeams/", WoodType.getNamesArray(), 8, 16);
registerVariantModel(Item.getItemFromBlock(TFCBlocks.SupportBeam3), "Wood/SupportBeams/", WoodType.getNamesArray(), 16, 18);
ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(TFCBlocks.TorchOn),0,new ModelResourceLocation(Reference.ModID + ":torch_on", "inventory"));
ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(TFCBlocks.TorchOff),0,new ModelResourceLocation(Reference.ModID + ":torch_off", "inventory"));
for(Block b : TFCBlocks.stairsList)
{
ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(b),0,new ModelResourceLocation(Reference.ModID + ":Wood/Stairs/"+Core.getUnlocalized(b.getUnlocalizedName()), "inventory"));
}
RegistryItemQueue.getInstance().registerMeshes();
}
private void registerVariantModel(Item item, String path, String[] variantNames, int metaStart, int metaEnd)
{
for(int meta = metaStart; meta < metaEnd; meta++)
{
String vName = Core.textConvert(variantNames[meta]);
ModelResourceLocation itemModelResourceLocation = new ModelResourceLocation(Reference.ModID + ":" + path + vName, "inventory");
ModelLoader.setCustomModelResourceLocation(item, meta, itemModelResourceLocation);
//ModelLoader.setCustomModelResourceLocation(item, meta, new ModelResourceLocation(new ResourceLocation(Reference.ModID, item.getRegistryName().getResourcePath()), vName));
}
}
@Override
@Deprecated
/**
* Should not be used clientside
*/
public void sendToAllNear(World world, BlockPos pos, int range, Packet<?> packet)
{
}
@Override
public EntityPlayer getPlayer()
{
return Minecraft.getMinecraft().thePlayer;
}
}