/*
* Copyright (c) 2015 NOVA, All rights reserved.
* This library is free software, licensed under GNU Lesser General Public License version 3
*
* This file is part of NOVA.
*
* NOVA is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* NOVA 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with NOVA. If not, see <http://www.gnu.org/licenses/>.
*/
package nova.core.wrapper.mc.forge.v18.launcher;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.particle.EntityFX;
import net.minecraft.client.renderer.ItemMeshDefinition;
import net.minecraft.client.resources.IResource;
import net.minecraft.client.resources.Language;
import net.minecraft.client.resources.model.ModelResourceLocation;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.client.FMLClientHandler;
import net.minecraftforge.fml.client.registry.ClientRegistry;
import net.minecraftforge.fml.client.registry.RenderingRegistry;
import net.minecraftforge.fml.common.ProgressManager;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import nova.core.entity.Entity;
import nova.core.entity.EntityFactory;
import nova.core.language.LanguageManager;
import nova.core.wrapper.mc.forge.v18.NovaMinecraftPreloader;
import nova.core.wrapper.mc.forge.v18.render.RenderUtility;
import nova.core.wrapper.mc.forge.v18.wrapper.block.forward.FWBlock;
import nova.core.wrapper.mc.forge.v18.wrapper.block.forward.FWTile;
import nova.core.wrapper.mc.forge.v18.wrapper.block.forward.FWTileRenderer;
import nova.core.wrapper.mc.forge.v18.wrapper.entity.backward.BWEntityFX;
import nova.core.wrapper.mc.forge.v18.wrapper.entity.forward.FWEntity;
import nova.core.wrapper.mc.forge.v18.wrapper.entity.forward.FWEntityFX;
import nova.core.wrapper.mc.forge.v18.wrapper.entity.forward.FWEntityRenderer;
import nova.core.wrapper.mc.forge.v18.wrapper.item.FWItem;
import nova.internal.core.Game;
import org.apache.commons.math3.geometry.euclidean.threed.Vector3D;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import java.util.SortedSet;
/**
* @author Calclavia
*/
public class ClientProxy extends CommonProxy {
@Override
public void preInit(FMLPreInitializationEvent evt) {
super.preInit(evt);
MinecraftForge.EVENT_BUS.register(RenderUtility.instance);
ClientRegistry.bindTileEntitySpecialRenderer(FWTile.class, FWTileRenderer.instance);
RenderUtility.instance.preInit(evt);
}
@Override
public void init(FMLInitializationEvent evt) {
super.init(evt);
RenderingRegistry.registerEntityRenderingHandler(FWEntity.class, FWEntityRenderer.instance);
}
@Override
@SuppressWarnings({"unchecked", "deprecation"})
public void loadLanguage(LanguageManager languageManager) {
super.loadLanguage(languageManager);
ProgressManager.ProgressBar progressBar = ProgressManager.push("Loading NOVA language files",
NovaMinecraftPreloader.novaResourcePacks.size() + 1);
FMLProgressBar fmlProgressBar = new FMLProgressBar(progressBar);
fmlProgressBar.step("nova");
SortedSet<Language> languages = Minecraft.getMinecraft().getLanguageManager().getLanguages();
languages.stream()
.map(lang -> lang.getLanguageCode().replace('_', '-'))
.forEach(langName -> {
ResourceLocation location = new ResourceLocation("nova", langName + ".lang");
try {
Minecraft.getMinecraft().getResourceManager().getAllResources(location).forEach(resource ->
loadLanguage(languageManager, langName, ((IResource)resource).getInputStream()));
} catch (IOException ex) {
InputStream stream = ClientProxy.class.getResourceAsStream(String.format("assets/%s/%s", location.getResourceDomain(), location.getResourcePath()));
if (stream != null)
loadLanguage(languageManager, langName, stream);
}
});
NovaMinecraftPreloader.novaResourcePacks.forEach(pack -> {
fmlProgressBar.step(pack.getID());
pack.getLanguageFiles().stream().forEach(location -> {
String resourcePath = location.getResourcePath();
String langName = resourcePath.substring(5, resourcePath.length() - 5);
try {
Minecraft.getMinecraft().getResourceManager().getAllResources(location).forEach(resource ->
loadLanguage(languageManager, langName, ((IResource)resource).getInputStream()));
} catch (IOException ex) {
InputStream stream = ClientProxy.class.getResourceAsStream(String.format("assets/%s/%s", location.getResourceDomain(), location.getResourcePath()));
if (stream != null)
loadLanguage(languageManager, langName, stream);
}
});
});
fmlProgressBar.finish();
ProgressManager.pop(progressBar);
}
private void loadLanguage(LanguageManager languageManager, String langName, InputStream stream) {
try {
Properties p = new Properties();
p.load(stream);
p.entrySet().stream().forEach(e -> languageManager.register(langName, e.getKey().toString(), e.getValue().toString()));
} catch (IOException ex) {
}
}
@Override
public void registerItem(FWItem item) {
super.registerItem(item);
//Hacks to inject custom item definition
ModelLoader.setCustomMeshDefinition(item, new ItemMeshDefinition() {
@Override
public ModelResourceLocation getModelLocation(ItemStack stack) {
ResourceLocation itemRL = (ResourceLocation) Item.itemRegistry.getNameForObject(item);
return new ModelResourceLocation(itemRL, "inventory");
}
}
);
}
@Override
public void postRegisterBlock(FWBlock block) {
super.postRegisterBlock(block);
//Hack to inject custom itemblock definition
Item itemFromBlock = Item.getItemFromBlock(block);
ModelLoader.setCustomMeshDefinition(itemFromBlock, new ItemMeshDefinition() {
@Override
public ModelResourceLocation getModelLocation(ItemStack stack) {
ResourceLocation itemRL = (ResourceLocation) Item.itemRegistry.getNameForObject(itemFromBlock);
return new ModelResourceLocation(itemRL, "inventory");
}
}
);
}
@Override
public boolean isPaused() {
if (FMLClientHandler.instance().getClient().isSingleplayer() && !FMLClientHandler.instance().getClient().getIntegratedServer().getPublic()) {
GuiScreen screen = FMLClientHandler.instance().getClient().currentScreen;
if (screen != null) {
if (screen.doesGuiPauseGame()) {
return true;
}
}
}
return false;
}
@Override
public Entity spawnParticle(net.minecraft.world.World world, EntityFactory factory) {
//Backward entity particle unwrapper
Entity build = factory.build();
if (build instanceof BWEntityFX) {
EntityFX entityFX = ((BWEntityFX) build).createEntityFX(world);
FMLClientHandler.instance().getClient().effectRenderer.addEffect(entityFX);
return Game.natives().toNova(entityFX);
} else {
FWEntityFX bwEntityFX = new FWEntityFX(world, factory);
FMLClientHandler.instance().getClient().effectRenderer.addEffect(bwEntityFX);
return bwEntityFX.wrapped;
}
}
@Override
public Entity spawnParticle(net.minecraft.world.World world, Entity entity) {
//Backward entity particle unwrapper
if (entity instanceof BWEntityFX) {
EntityFX entityFX = ((BWEntityFX) entity).createEntityFX(world);
Vector3D position = entity.position();
entityFX.posX = position.getX();
entityFX.posY = position.getY();
entityFX.posZ = position.getZ();
FMLClientHandler.instance().getClient().effectRenderer.addEffect(entityFX);
return Game.natives().toNova(entityFX);
} else {
FWEntityFX bwEntityFX = new FWEntityFX(world, entity);
FMLClientHandler.instance().getClient().effectRenderer.addEffect(bwEntityFX);
return bwEntityFX.wrapped;
}
}
@Override
public EntityPlayer getClientPlayer() {
return Minecraft.getMinecraft().thePlayer;
}
}