buildcraft.core.proxy.CoreProxyClient.java Source code

Java tutorial

Introduction

Here is the source code for buildcraft.core.proxy.CoreProxyClient.java

Source

/** Copyright (c) 2011-2015, SpaceToad and the BuildCraft Team http://www.mod-buildcraft.com
 * <p/>
 * BuildCraft is distributed under the terms of the Minecraft Mod Public License 1.0, or MMPL. Please check the contents
 * of the license located in http://www.mod-buildcraft.com/MMPL-1.0.txt */
package buildcraft.core.proxy;

import java.io.IOException;
import java.io.InputStream;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Maps;
import com.google.common.collect.Multimap;

import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState;
import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.WorldClient;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.client.resources.IReloadableResourceManager;
import net.minecraft.client.resources.IResource;
import net.minecraft.client.resources.IResourceManager;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.network.INetHandler;
import net.minecraft.network.NetHandlerPlayServer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World;
import net.minecraft.world.WorldServer;
import net.minecraft.world.chunk.Chunk;
import net.minecraft.world.chunk.Chunk.EnumCreateEntityType;

import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.common.DimensionManager;
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 buildcraft.BuildCraftCore;
import buildcraft.core.EntityLaser;
import buildcraft.core.TileMarker;
import buildcraft.core.TilePathMarker;
import buildcraft.core.client.BuildCraftStateMapper;
import buildcraft.core.client.RenderTickListener;
import buildcraft.core.lib.EntityResizableCuboid;
import buildcraft.core.lib.client.render.RenderResizableCuboid;
import buildcraft.core.lib.engines.RenderEngine;
import buildcraft.core.lib.engines.TileEngineBase;
import buildcraft.core.lib.utils.ICustomStateMapper;
import buildcraft.core.lib.utils.IModelRegister;
import buildcraft.core.lib.utils.Utils;
import buildcraft.core.render.RenderLaser;
import buildcraft.core.render.RenderMarker;
import buildcraft.core.render.RenderPathMarker;
import buildcraft.lib.config.DetailedConfigOption;

public class CoreProxyClient extends CoreProxy {

    /* INSTANCES */
    @Override
    public Object getClient() {
        return FMLClientHandler.instance().getClient();
    }

    @Override
    public World getClientWorld() {
        return FMLClientHandler.instance().getClient().theWorld;
    }

    /* ENTITY HANDLING */
    @Override
    public void removeEntity(Entity entity) {
        super.removeEntity(entity);

        if (entity.worldObj.isRemote) {
            ((WorldClient) entity.worldObj).removeEntityFromWorld(entity.getEntityId());
        }
    }

    /* WRAPPER */
    @Override
    public String getItemDisplayName(ItemStack stack) {
        if (stack.getItem() == null) {
            return "";
        }

        return stack.getDisplayName();
    }

    @Override
    public void init() {
        MinecraftForge.EVENT_BUS.register(RenderTickListener.INSTANCE);

        IResourceManager resourceManager = Minecraft.getMinecraft().getResourceManager();
        IReloadableResourceManager reloadable = (IReloadableResourceManager) resourceManager;
        reloadable.registerReloadListener(DetailedConfigOption.ReloadListener.INSTANCE);

        ClientRegistry.bindTileEntitySpecialRenderer(TileEngineBase.class, new RenderEngine());
        ClientRegistry.bindTileEntitySpecialRenderer(TilePathMarker.class, new RenderPathMarker());
        ClientRegistry.bindTileEntitySpecialRenderer(TileMarker.class, new RenderMarker());

        RenderingRegistry.registerEntityRenderingHandler(EntityResizableCuboid.class,
                RenderResizableCuboid.INSTANCE);
        RenderingRegistry.registerEntityRenderingHandler(EntityLaser.class, new RenderLaser());

        for (Block block : blocksToRegisterRenderersFor) {
            if (block instanceof IModelRegister) {
                ((IModelRegister) block).registerModels();
                continue;
            }

            IBlockState defaultState = block.getDefaultState();
            Multimap<Integer, IBlockState> metaStateMap = ArrayListMultimap.create();
            Map<IBlockState, String> stateTypeMap = Maps.newHashMap();

            for (IBlockState state : (List<IBlockState>) block.getBlockState().getValidStates()) {
                String type = BuildCraftStateMapper.getPropertyString(state);
                stateTypeMap.put(state, type);
                metaStateMap.put(block.damageDropped(state), state);
            }
            for (Entry<Integer, Collection<IBlockState>> entry : metaStateMap.asMap().entrySet()) {
                Collection<IBlockState> blockStates = entry.getValue();
                if (blockStates.isEmpty())
                    continue;
                if (blockStates.contains(defaultState)) {
                    registerBlockItemModel(defaultState, entry.getKey(), stateTypeMap.get(defaultState));
                } else {
                    IBlockState state = blockStates.iterator().next();
                    registerBlockItemModel(state, entry.getKey(), stateTypeMap.get(state));
                }
            }
        }
        for (Item item : itemsToRegisterRenderersFor) {
            if (item instanceof IModelRegister) {
                ((IModelRegister) item).registerModels();
            }
        }
    }

    private void registerBlockItemModel(IBlockState state, int meta, String type) {
        Block block = state.getBlock();
        ModelResourceLocation location = new ModelResourceLocation(Utils.getNameForBlock(block).replace("|", ""),
                type.toLowerCase());
        Minecraft.getMinecraft().getRenderItem().getItemModelMesher().register(Item.getItemFromBlock(block), meta,
                location);
    }

    /* BUILDCRAFT PLAYER */
    @Override
    public String playerName() {
        return FMLClientHandler.instance().getClient().thePlayer.getDisplayNameString();
    }

    /** This function returns either the player from the handler if it's on the server, or directly from the minecraft
     * instance if it's the client. */
    @Override
    public EntityPlayer getPlayerFromNetHandler(INetHandler handler) {
        if (handler instanceof NetHandlerPlayServer) {
            return super.getPlayerFromNetHandler(handler);
        } else {
            return Minecraft.getMinecraft().thePlayer;
        }
    }

    private LinkedList<Block> blocksToRegisterRenderersFor = new LinkedList<>();
    private LinkedList<Item> itemsToRegisterRenderersFor = new LinkedList<>();

    @Override
    public void postRegisterBlock(Block block) {
        blocksToRegisterRenderersFor.add(block);
        if (block instanceof ICustomStateMapper) {
            ((ICustomStateMapper) block).setCusomStateMappers();
        } else {
            ModelLoader.setCustomStateMapper(block, BuildCraftStateMapper.INSTANCE);
        }
    }

    @Override
    public void postRegisterItem(Item item) {
        itemsToRegisterRenderersFor.add(item);
    }

    @Override
    public EntityPlayer getClientPlayer() {
        return Minecraft.getMinecraft().thePlayer;
    }

    @Override
    public <T extends TileEntity> T getServerTile(T source) {
        if (BuildCraftCore.useServerDataOnClient && Minecraft.getMinecraft().isSingleplayer()
                && source.getWorld().isRemote) {
            WorldServer w = DimensionManager.getWorld(source.getWorld().provider.getDimension());
            if (w != null && w.getChunkProvider() != null) {
                Chunk c = w.getChunkFromBlockCoords(source.getPos());
                if (c != null) {
                    TileEntity t = c.getTileEntity(source.getPos(), EnumCreateEntityType.CHECK);
                    if (t != null && t.getClass().equals(source.getClass())) {
                        return (T) t;
                    }
                }
            }
        }
        return source;
    }

    @Override
    public InputStream getStreamForResource(ResourceLocation location) {
        try {
            IResource resource = Minecraft.getMinecraft().getResourceManager().getResource(location);
            return resource.getInputStream();
        } catch (IOException e) {
            return null;
        }
    }
}