/*
* This file is part of Matter Overdrive
* Copyright (c) 2015., Simeon Radivoev, All rights reserved.
*
* Matter Overdrive 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.
*
* Matter Overdrive 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 Matter Overdrive. If not, see <http://www.gnu.org/licenses>.
*/
package matteroverdrive.client;
import cpw.mods.fml.client.registry.ClientRegistry;
import cpw.mods.fml.client.registry.RenderingRegistry;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.gameevent.TickEvent;
import matteroverdrive.MatterOverdrive;
import matteroverdrive.api.android.IAndroidStatRenderRegistry;
import matteroverdrive.api.android.IBionicStat;
import matteroverdrive.api.inventory.IBionicPart;
import matteroverdrive.api.renderer.IBionicPartRenderer;
import matteroverdrive.api.renderer.IBioticStatRenderer;
import matteroverdrive.api.starmap.IStarmapRenderRegistry;
import matteroverdrive.client.model.ModelHulkingScientist;
import matteroverdrive.client.model.ModelTritaniumArmor;
import matteroverdrive.client.render.*;
import matteroverdrive.client.render.biostat.BioticStatRendererShield;
import matteroverdrive.client.render.biostat.BioticStatRendererTeleporter;
import matteroverdrive.client.render.block.*;
import matteroverdrive.client.render.entity.*;
import matteroverdrive.client.render.item.*;
import matteroverdrive.client.render.parts.RougeAndroidPartsRender;
import matteroverdrive.client.render.parts.TritaniumSpineRenderer;
import matteroverdrive.client.render.tileentity.*;
import matteroverdrive.client.render.tileentity.starmap.*;
import matteroverdrive.entity.*;
import matteroverdrive.entity.monster.EntityMeleeRougeAndroidMob;
import matteroverdrive.entity.monster.EntityMutantScientist;
import matteroverdrive.entity.monster.EntityRangedRogueAndroidMob;
import matteroverdrive.entity.player.AndroidPlayer;
import matteroverdrive.entity.weapon.PlasmaBolt;
import matteroverdrive.handler.ConfigurationHandler;
import matteroverdrive.init.MatterOverdriveBioticStats;
import matteroverdrive.init.MatterOverdriveItems;
import matteroverdrive.items.android.RougeAndroidParts;
import matteroverdrive.items.android.TritaniumSpine;
import matteroverdrive.machines.fusionReactorController.TileEntityMachineFusionReactorController;
import matteroverdrive.starmap.data.Galaxy;
import matteroverdrive.starmap.data.Planet;
import matteroverdrive.starmap.data.Quadrant;
import matteroverdrive.starmap.data.Star;
import matteroverdrive.tile.*;
import matteroverdrive.util.MOLog;
import net.minecraft.client.Minecraft;
import net.minecraft.client.model.*;
import net.minecraft.client.renderer.texture.TextureManager;
import net.minecraft.item.ItemStack;
import net.minecraft.world.World;
import net.minecraftforge.client.MinecraftForgeClient;
import net.minecraftforge.client.event.RenderPlayerEvent;
import net.minecraftforge.client.event.RenderWorldLastEvent;
import org.apache.logging.log4j.Level;
import org.lwjgl.opengl.GL11;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Random;
/**
* Created by Simeon on 4/17/2015.
*/
public class RenderHandler
{
private Random random = new Random();
private RenderMatterScannerInfoHandler matterScannerInfoHandler;
private RenderParticlesHandler renderParticlesHandler;
private RenderWeaponsBeam renderWeaponsBeam;
private List<IWorldLastRenderer> customRenderers;
private AndroidStatRenderRegistry statRenderRegistry;
private StarmapRenderRegistry starmapRenderRegistry;
private RenderDialogSystem renderDialogSystem;
private AndroidBionicPartRenderRegistry bionicPartRenderRegistry;
private WeaponModuleModelRegistry weaponModuleModelRegistry;
//region Block Renderers
private MOBlockRenderer blockRenderer;
private RendererBlockGravitationalStabilizer rendererBlockGravitationalStabilizer;
private RendererBlockPipe rendererBlockPipe;
private RendererBlockChargingStation rendererBlockChargingStation;
private RendererBlockPatternStorage rendererBlockPatternStorage;
private RendererBlockReplicator rendererBlockReplicator;
private RendererBlockTritaniumCrate rendererBlockTritaniumCrate;
private RendererBlockInscriber rendererBlockInscriber;
private RendererBlockDecorativeVertical rendererBlockDecorativeVertical;
//endregion
//region Biostat Renderers
private BioticStatRendererTeleporter rendererTeleporter;
private BioticStatRendererShield biostatRendererShield;
//endregion
//region Starmap Renderers
private StarMapRendererPlanet starMapRendererPlanet;
private StarMapRendererQuadrant starMapRendererQuadrant;
private StarMapRendererStar starMapRendererStar;
private StarMapRenderGalaxy starMapRenderGalaxy;
private StarMapRenderPlanetStats starMapRenderPlanetStats;
//endregion
//region Item Renderers
private static ItemRendererPhaser rendererPhaser;
private static ItemRendererPhaserRifle rendererPhaserRifle;
private static ItemRendererOmniTool rendererOmniTool;
private static ItemRenderPlasmaShotgun renderPlasmaShotgun;
private static ItemRendererIonSniper rendererIonSniper;
//endregion
//region Entity Renderers
private EntityRendererRougeAndroid rendererRougeAndroid;
public EntityRendererRougeAndroid rendererRougeAndroidHologram;
private EntityRendererMadScientist rendererMadScientist;
private EntityRendererFailedCow rendererFailedCow;
private EntityRendererFailedChicken rendererFailedChicken;
private EntityRendererFailedPig rendererFailedPig;
private EntityRendererFailedSheep rendererFailedSheep;
private EntityRendererPhaserFire rendererPhaserFire;
private EntityRendererRangedRougeAndroid rendererRangedRougeAndroid;
private EntityRendererMutantScientist rendererMutantScientist;
//endregion
//region Tile Entity Renderers
private TileEntityRendererReplicator tileEntityRendererReplicator;
private TileEntityRendererPipe tileEntityRendererPipe;
private TileEntityRendererMatterPipe tileEntityRendererMatterPipe;
private TileEntityRendererNetworkPipe tileEntityRendererNetworkPipe;
private TileEntityRendererPatterStorage tileEntityRendererPatterStorage;
private TileEntityRendererWeaponStation tileEntityRendererWeaponStation;
private TileEntityRendererPatternMonitor tileEntityRendererPatternMonitor;
private TileEntityRendererGravitationalAnomaly tileEntityRendererGravitationalAnomaly;
private TileEntityRendererGravitationalStabilizer tileEntityRendererGravitationalStabilizer;
private TileEntityRendererFusionReactorController tileEntityRendererFusionReactorController;
private TileEntityRendererAndroidStation tileEntityRendererAndroidStation;
private TileEntityRendererStarMap tileEntityRendererStarMap;
private TileEntityRendererChargingStation tileEntityRendererChargingStation;
private TileEntityRendererHoloSign tileEntityRendererHoloSign;
private TileEntityRendererPacketQueue tileEntityRendererPacketQueue;
private TileEntityRendererInscriber tileEntityRendererInscriber;
private TileEntityRendererContractMarket tileEntityRendererContractMarket;
//endregion
//region Models
public ModelTritaniumArmor modelTritaniumArmor;
public ModelTritaniumArmor modelTritaniumArmorFeet;
public ModelBiped modelMeleeRogueAndroidParts;
public ModelBiped modelRangedRogueAndroidParts;
//endregion
public RenderHandler(World world, TextureManager textureManager)
{
customRenderers = new ArrayList<>();
matterScannerInfoHandler = new RenderMatterScannerInfoHandler();
renderParticlesHandler = new RenderParticlesHandler(world, textureManager);
renderWeaponsBeam = new RenderWeaponsBeam();
statRenderRegistry = new AndroidStatRenderRegistry();
starmapRenderRegistry = new StarmapRenderRegistry();
renderDialogSystem = new RenderDialogSystem();
bionicPartRenderRegistry = new AndroidBionicPartRenderRegistry();
weaponModuleModelRegistry = new WeaponModuleModelRegistry();
addCustomRenderer(matterScannerInfoHandler);
addCustomRenderer(renderParticlesHandler);
addCustomRenderer(renderWeaponsBeam);
addCustomRenderer(renderDialogSystem);
}
@SubscribeEvent
public void onRenderWorldLast(RenderWorldLastEvent event)
{
for (IWorldLastRenderer renderer : customRenderers) {
renderer.onRenderWorldLast(this, event);
}
for (IBionicStat stat : MatterOverdrive.statRegistry.getStats())
{
Collection<IBioticStatRenderer> statRendererCollection = statRenderRegistry.getRendererCollection(stat.getClass());
if (statRendererCollection != null)
{
for (IBioticStatRenderer renderer : statRendererCollection)
{
renderer.onWorldRender(stat, AndroidPlayer.get(Minecraft.getMinecraft().thePlayer).getUnlockedLevel(stat), event);
}
}
}
}
//Called when the client ticks.
@SubscribeEvent
public void onClientTick(TickEvent.ClientTickEvent event)
{
renderParticlesHandler.onClientTick(event);
}
public void createTileEntityRenderers(ConfigurationHandler configHandler)
{
tileEntityRendererReplicator = new TileEntityRendererReplicator();
tileEntityRendererPipe = new TileEntityRendererPipe();
tileEntityRendererMatterPipe = new TileEntityRendererMatterPipe();
tileEntityRendererNetworkPipe = new TileEntityRendererNetworkPipe();
tileEntityRendererPatterStorage = new TileEntityRendererPatterStorage();
tileEntityRendererWeaponStation = new TileEntityRendererWeaponStation();
tileEntityRendererPatternMonitor = new TileEntityRendererPatternMonitor();
tileEntityRendererGravitationalAnomaly = new TileEntityRendererGravitationalAnomaly();
tileEntityRendererGravitationalStabilizer = new TileEntityRendererGravitationalStabilizer();
tileEntityRendererFusionReactorController = new TileEntityRendererFusionReactorController();
tileEntityRendererAndroidStation = new TileEntityRendererAndroidStation();
tileEntityRendererStarMap = new TileEntityRendererStarMap();
tileEntityRendererChargingStation = new TileEntityRendererChargingStation();
tileEntityRendererHoloSign = new TileEntityRendererHoloSign();
tileEntityRendererPacketQueue = new TileEntityRendererPacketQueue();
tileEntityRendererInscriber = new TileEntityRendererInscriber();
tileEntityRendererContractMarket = new TileEntityRendererContractMarket();
configHandler.subscribe(tileEntityRendererAndroidStation);
configHandler.subscribe(tileEntityRendererWeaponStation);
}
@SubscribeEvent
public void onPlayerRenderPost(RenderPlayerEvent.Post event)
{
//GL11.glEnable(GL11.GL_LIGHTING);
//GL11.glColor3f(1, 1, 1);
AndroidPlayer androidPlayer = AndroidPlayer.get(event.entityPlayer);
if (androidPlayer != null && androidPlayer.isAndroid() && !event.entityPlayer.isInvisible()) {
for (int i = 0; i < 5; i++)
{
ItemStack part = androidPlayer.getStackInSlot(i);
if (part != null && part.getItem() instanceof IBionicPart)
{
IBionicPartRenderer renderer = bionicPartRenderRegistry.getRenderer(((IBionicPart) part.getItem()).getClass());
if (renderer != null) {
try {
GL11.glPushMatrix();
renderer.renderPart(part, androidPlayer, event.renderer, event.partialRenderTick);
GL11.glPopMatrix();
}
catch (Exception e)
{
MOLog.log(Level.ERROR,e,"An Error occurred while rendering bionic part");
}
}
}
}
}
}
@SubscribeEvent
public void onPlayerRenderPre(RenderPlayerEvent.Pre event)
{
//GL11.glEnable(GL11.GL_LIGHTING);
//GL11.glColor3f(1, 1, 1);
AndroidPlayer androidPlayer = AndroidPlayer.get(event.entityPlayer);
if (androidPlayer != null && androidPlayer.isAndroid() && !event.entityPlayer.isInvisible()) {
for (int i = 0; i < 5; i++)
{
ItemStack part = androidPlayer.getStackInSlot(i);
if (part != null && part.getItem() instanceof IBionicPart)
{
IBionicPartRenderer renderer = bionicPartRenderRegistry.getRenderer(((IBionicPart) part.getItem()).getClass());
if (renderer != null) {
renderer.affectPlayerRenderer(part, androidPlayer, event.renderer, event.partialRenderTick);
}
}
}
}
}
public void createBlockRenderers()
{
blockRenderer = new MOBlockRenderer();
rendererBlockGravitationalStabilizer = new RendererBlockGravitationalStabilizer();
rendererBlockPipe = new RendererBlockPipe();
rendererBlockChargingStation = new RendererBlockChargingStation();
rendererBlockPatternStorage = new RendererBlockPatternStorage();
rendererBlockReplicator = new RendererBlockReplicator();
rendererBlockTritaniumCrate = new RendererBlockTritaniumCrate();
rendererBlockInscriber = new RendererBlockInscriber();
rendererBlockDecorativeVertical = new RendererBlockDecorativeVertical();
}
public void registerBlockRenderers()
{
RenderingRegistry.registerBlockHandler(blockRenderer);
RenderingRegistry.registerBlockHandler(rendererBlockGravitationalStabilizer);
RenderingRegistry.registerBlockHandler(rendererBlockPipe);
RenderingRegistry.registerBlockHandler(rendererBlockChargingStation);
RenderingRegistry.registerBlockHandler(rendererBlockPatternStorage);
RenderingRegistry.registerBlockHandler(rendererBlockReplicator);
RenderingRegistry.registerBlockHandler(rendererBlockTritaniumCrate);
RenderingRegistry.registerBlockHandler(rendererBlockInscriber);
RenderingRegistry.registerBlockHandler(rendererBlockDecorativeVertical);
}
public void registerTileEntitySpecialRenderers()
{
ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineReplicator.class, tileEntityRendererReplicator);
ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachinePatternStorage.class, tileEntityRendererPatterStorage);
ClientRegistry.bindTileEntitySpecialRenderer(TileEntityWeaponStation.class, tileEntityRendererWeaponStation);
ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachinePatternMonitor.class, tileEntityRendererPatternMonitor);
ClientRegistry.bindTileEntitySpecialRenderer(TileEntityGravitationalAnomaly.class, tileEntityRendererGravitationalAnomaly);
ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineGravitationalStabilizer.class, tileEntityRendererGravitationalStabilizer);
ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineFusionReactorController.class, tileEntityRendererFusionReactorController);
ClientRegistry.bindTileEntitySpecialRenderer(TileEntityAndroidStation.class, tileEntityRendererAndroidStation);
ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineStarMap.class, tileEntityRendererStarMap);
ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineChargingStation.class, tileEntityRendererChargingStation);
ClientRegistry.bindTileEntitySpecialRenderer(TileEntityHoloSign.class, tileEntityRendererHoloSign);
ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachinePacketQueue.class, tileEntityRendererPacketQueue);
ClientRegistry.bindTileEntitySpecialRenderer(TileEntityInscriber.class,tileEntityRendererInscriber);
ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineContractMarket.class,tileEntityRendererContractMarket);
}
public void createItemRenderers()
{
rendererPhaser = new ItemRendererPhaser();
rendererPhaserRifle = new ItemRendererPhaserRifle();
rendererOmniTool = new ItemRendererOmniTool();
renderPlasmaShotgun = new ItemRenderPlasmaShotgun();
rendererIonSniper = new ItemRendererIonSniper();
}
public void registerItemRenderers()
{
MinecraftForgeClient.registerItemRenderer(MatterOverdriveItems.phaser, rendererPhaser);
MinecraftForgeClient.registerItemRenderer(MatterOverdriveItems.phaserRifle,rendererPhaserRifle);
MinecraftForgeClient.registerItemRenderer(MatterOverdriveItems.omniTool,rendererOmniTool);
MinecraftForgeClient.registerItemRenderer(MatterOverdriveItems.plasmaShotgun,renderPlasmaShotgun);
MinecraftForgeClient.registerItemRenderer(MatterOverdriveItems.ionSniper,rendererIonSniper);
}
public void createEntityRenderers()
{
rendererRougeAndroid = new EntityRendererRougeAndroid(new ModelBiped(), 0,false);
rendererMadScientist = new EntityRendererMadScientist();
rendererFailedPig = new EntityRendererFailedPig(new ModelPig(),new ModelPig(0.5f), 0.7F);
rendererFailedCow = new EntityRendererFailedCow(new ModelCow(), 0.7f);
rendererFailedChicken = new EntityRendererFailedChicken(new ModelChicken(), 0.3f);
rendererFailedSheep = new EntityRendererFailedSheep(new ModelSheep2(), new ModelSheep1(), 0.7f);
rendererPhaserFire = new EntityRendererPhaserFire();
rendererRangedRougeAndroid = new EntityRendererRangedRougeAndroid(0);
rendererRougeAndroidHologram = new EntityRendererRougeAndroid(new ModelBiped(),0,true);
rendererMutantScientist = new EntityRendererMutantScientist(new ModelHulkingScientist(),0,1);
}
public void registerEntityRenderers()
{
RenderingRegistry.registerEntityRenderingHandler(EntityMeleeRougeAndroidMob.class, rendererRougeAndroid);
RenderingRegistry.registerEntityRenderingHandler(EntityFailedPig.class,rendererFailedPig);
RenderingRegistry.registerEntityRenderingHandler(EntityFailedCow.class, rendererFailedCow);
RenderingRegistry.registerEntityRenderingHandler(EntityFailedChicken.class,rendererFailedChicken);
RenderingRegistry.registerEntityRenderingHandler(EntityFailedSheep.class,rendererFailedSheep);
RenderingRegistry.registerEntityRenderingHandler(EntityVillagerMadScientist.class, rendererMadScientist);
RenderingRegistry.registerEntityRenderingHandler(PlasmaBolt.class, rendererPhaserFire);
RenderingRegistry.registerEntityRenderingHandler(EntityRangedRogueAndroidMob.class,rendererRangedRougeAndroid);
RenderingRegistry.registerEntityRenderingHandler(EntityMutantScientist.class,rendererMutantScientist);
}
public void createBioticStatRenderers()
{
rendererTeleporter = new BioticStatRendererTeleporter();
biostatRendererShield = new BioticStatRendererShield();
}
public void registerBioticStatRenderers()
{
statRenderRegistry.registerRenderer(MatterOverdriveBioticStats.shield.getClass(),biostatRendererShield);
statRenderRegistry.registerRenderer(MatterOverdriveBioticStats.teleport.getClass(),rendererTeleporter);
}
public void registerBionicPartRenderers()
{
bionicPartRenderRegistry.register(TritaniumSpine.class,new TritaniumSpineRenderer());
bionicPartRenderRegistry.register(RougeAndroidParts.class, new RougeAndroidPartsRender());
}
public void registerWeaponModuleModels()
{
weaponModuleModelRegistry.registerModule(MatterOverdriveItems.sniperScope);
}
public void createStarmapRenderers()
{
starMapRendererPlanet = new StarMapRendererPlanet();
starMapRendererQuadrant = new StarMapRendererQuadrant();
starMapRendererStar = new StarMapRendererStar();
starMapRenderGalaxy = new StarMapRenderGalaxy();
starMapRenderPlanetStats = new StarMapRenderPlanetStats();
}
public void registerStarmapRenderers()
{
starmapRenderRegistry.registerRenderer(Planet.class, starMapRendererPlanet);
starmapRenderRegistry.registerRenderer(Quadrant.class, starMapRendererQuadrant);
starmapRenderRegistry.registerRenderer(Star.class, starMapRendererStar);
starmapRenderRegistry.registerRenderer(Galaxy.class, starMapRenderGalaxy);
starmapRenderRegistry.registerRenderer(Planet.class, starMapRenderPlanetStats);
}
public void createModels()
{
modelTritaniumArmor = new ModelTritaniumArmor(0);
modelTritaniumArmorFeet = new ModelTritaniumArmor(0.5f);
modelMeleeRogueAndroidParts = new ModelBiped(0);
modelRangedRogueAndroidParts = new ModelBiped(0,0,96,64);
}
public RenderParticlesHandler getRenderParticlesHandler()
{
return renderParticlesHandler;
}
public TileEntityRendererStarMap getTileEntityRendererStarMap()
{
return tileEntityRendererStarMap;
}
public IAndroidStatRenderRegistry getStatRenderRegistry()
{
return statRenderRegistry;
}
public IStarmapRenderRegistry getStarmapRenderRegistry()
{
return starmapRenderRegistry;
}
public ItemRendererOmniTool getRendererOmniTool(){return rendererOmniTool;}
public AndroidBionicPartRenderRegistry getBionicPartRenderRegistry()
{
return bionicPartRenderRegistry;
}
public WeaponModuleModelRegistry getWeaponModuleModelRegistry(){return weaponModuleModelRegistry;}
public Random getRandom()
{
return random;
}
public void addCustomRenderer(IWorldLastRenderer renderer)
{
customRenderers.add(renderer);
}
}