2620 lines
106 KiB
Java
2620 lines
106 KiB
Java
package net.minecraft.client.renderer;
|
|
|
|
import static net.lax1dude.eaglercraft.v1_8.opengl.RealOpenGLEnums.*;
|
|
|
|
import java.util.Collection;
|
|
import java.util.EnumSet;
|
|
import java.util.Iterator;
|
|
import java.util.LinkedList;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
|
|
import net.hoosiertransfer.Alfheim.ILightUpdatesProcessor;
|
|
|
|
import net.lax1dude.eaglercraft.v1_8.EagRuntime;
|
|
import net.lax1dude.eaglercraft.v1_8.EaglercraftRandom;
|
|
import net.lax1dude.eaglercraft.v1_8.HString;
|
|
import net.lax1dude.eaglercraft.v1_8.Keyboard;
|
|
|
|
import java.util.Set;
|
|
import java.util.concurrent.Callable;
|
|
|
|
import com.google.common.collect.Lists;
|
|
import com.google.common.collect.Maps;
|
|
import com.google.common.collect.Sets;
|
|
|
|
import net.lax1dude.eaglercraft.v1_8.log4j.LogManager;
|
|
import net.lax1dude.eaglercraft.v1_8.log4j.Logger;
|
|
import net.lax1dude.eaglercraft.v1_8.minecraft.ChunkUpdateManager;
|
|
import net.lax1dude.eaglercraft.v1_8.minecraft.EaglerTextureAtlasSprite;
|
|
import net.lax1dude.eaglercraft.v1_8.opengl.EaglercraftGPU;
|
|
import net.lax1dude.eaglercraft.v1_8.opengl.GlStateManager;
|
|
import net.lax1dude.eaglercraft.v1_8.opengl.VertexFormat;
|
|
import net.lax1dude.eaglercraft.v1_8.opengl.WorldRenderer;
|
|
import net.lax1dude.eaglercraft.v1_8.opengl.ext.deferred.DeferredStateManager;
|
|
import net.lax1dude.eaglercraft.v1_8.opengl.ext.deferred.DynamicLightManager;
|
|
import net.lax1dude.eaglercraft.v1_8.opengl.ext.deferred.EaglerDeferredConfig;
|
|
import net.lax1dude.eaglercraft.v1_8.opengl.ext.deferred.EaglerDeferredPipeline;
|
|
import net.lax1dude.eaglercraft.v1_8.opengl.ext.deferred.program.SharedPipelineShaders;
|
|
import net.lax1dude.eaglercraft.v1_8.opengl.ext.dynamiclights.DynamicLightsStateManager;
|
|
import net.lax1dude.eaglercraft.v1_8.vector.Vector3f;
|
|
import net.lax1dude.eaglercraft.v1_8.vector.Vector4f;
|
|
import net.minecraft.block.Block;
|
|
import net.minecraft.block.BlockChest;
|
|
import net.minecraft.block.BlockEnderChest;
|
|
import net.minecraft.block.BlockSign;
|
|
import net.minecraft.block.BlockSkull;
|
|
import net.minecraft.block.material.Material;
|
|
import net.minecraft.block.state.IBlockState;
|
|
import net.minecraft.client.Minecraft;
|
|
import net.minecraft.client.audio.ISound;
|
|
import net.minecraft.client.audio.PositionedSoundRecord;
|
|
import net.minecraft.client.audio.SoundCategory;
|
|
import net.minecraft.client.multiplayer.WorldClient;
|
|
import net.minecraft.client.particle.EntityFX;
|
|
import net.minecraft.client.renderer.chunk.CompiledChunk;
|
|
import net.minecraft.client.renderer.chunk.IRenderChunkFactory;
|
|
import net.minecraft.client.renderer.chunk.ListChunkFactory;
|
|
import net.minecraft.client.renderer.chunk.RenderChunk;
|
|
import net.minecraft.client.renderer.chunk.VisGraph;
|
|
import net.minecraft.client.renderer.culling.ClippingHelper;
|
|
import net.minecraft.client.renderer.culling.ClippingHelperImpl;
|
|
import net.minecraft.client.renderer.culling.Frustum;
|
|
import net.minecraft.client.renderer.culling.ICamera;
|
|
import net.minecraft.client.renderer.entity.RenderManager;
|
|
import net.minecraft.client.renderer.texture.TextureManager;
|
|
import net.minecraft.client.renderer.texture.TextureMap;
|
|
import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher;
|
|
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
|
|
import net.minecraft.client.resources.IResourceManager;
|
|
import net.minecraft.client.resources.IResourceManagerReloadListener;
|
|
import net.minecraft.crash.CrashReport;
|
|
import net.minecraft.crash.CrashReportCategory;
|
|
import net.minecraft.entity.Entity;
|
|
import net.minecraft.entity.EntityLivingBase;
|
|
import net.minecraft.entity.player.EntityPlayer;
|
|
import net.minecraft.entity.projectile.EntityWitherSkull;
|
|
import net.minecraft.init.Blocks;
|
|
import net.minecraft.init.Items;
|
|
import net.minecraft.item.Item;
|
|
import net.minecraft.item.ItemDye;
|
|
import net.minecraft.item.ItemRecord;
|
|
import net.minecraft.tileentity.TileEntity;
|
|
import net.minecraft.tileentity.TileEntityChest;
|
|
import net.minecraft.util.AxisAlignedBB;
|
|
import net.minecraft.util.BlockPos;
|
|
import net.minecraft.util.ChatComponentText;
|
|
import net.minecraft.util.ChatComponentTranslation;
|
|
import net.minecraft.util.ClassInheritanceMultiMap;
|
|
import net.minecraft.util.EnumChatFormatting;
|
|
import net.minecraft.util.EnumFacing;
|
|
import net.minecraft.util.EnumParticleTypes;
|
|
import net.minecraft.util.EnumWorldBlockLayer;
|
|
import net.minecraft.util.MathHelper;
|
|
import net.minecraft.util.Matrix4f;
|
|
import net.minecraft.util.MovingObjectPosition;
|
|
import net.minecraft.util.ReportedException;
|
|
import net.minecraft.util.ResourceLocation;
|
|
import net.minecraft.util.Vec3;
|
|
import net.minecraft.util.Vector3d;
|
|
import net.minecraft.world.IWorldAccess;
|
|
import net.minecraft.world.border.WorldBorder;
|
|
import net.minecraft.world.chunk.Chunk;
|
|
|
|
/**
|
|
* +
|
|
* This portion of EaglercraftX contains deobfuscated Minecraft 1.8 source code.
|
|
*
|
|
* Minecraft 1.8.8 bytecode is (c) 2015 Mojang AB. "Do not distribute!"
|
|
* Mod Coder Pack v9.18 deobfuscation configs are (c) Copyright by the MCP Team
|
|
*
|
|
* EaglercraftX 1.8 patch files (c) 2022-2024 lax1dude, hoosiertransfer,
|
|
* ayunami2000. All Rights Reserved.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
* AND
|
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
* DISCLAIMED.
|
|
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY
|
|
* DIRECT,
|
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
* (INCLUDING, BUT
|
|
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
* DATA, OR
|
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
* LIABILITY,
|
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
|
* OTHERWISE)
|
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
* POSSIBILITY OF SUCH DAMAGE.
|
|
*
|
|
*/
|
|
public class RenderGlobal implements IWorldAccess, IResourceManagerReloadListener, ILightUpdatesProcessor {
|
|
private static final Logger logger = LogManager.getLogger();
|
|
private static final ResourceLocation locationMoonPhasesPng = new ResourceLocation(
|
|
"textures/environment/moon_phases.png");
|
|
private static final ResourceLocation locationSunPng = new ResourceLocation("textures/environment/sun.png");
|
|
private static final ResourceLocation locationCloudsPng = new ResourceLocation("textures/environment/clouds.png");
|
|
private static final ResourceLocation locationEndSkyPng = new ResourceLocation("textures/environment/end_sky.png");
|
|
private static final ResourceLocation locationForcefieldPng = new ResourceLocation("textures/misc/forcefield.png");
|
|
private final Minecraft mc;
|
|
private final TextureManager renderEngine;
|
|
private final RenderManager renderManager;
|
|
private WorldClient theWorld;
|
|
private Set<RenderChunk> chunksToUpdate = Sets.newLinkedHashSet();
|
|
/**
|
|
* +
|
|
* List of OpenGL lists for the current render pass
|
|
*/
|
|
private List<RenderGlobal.ContainerLocalRenderInformation> renderInfos = Lists.newArrayListWithCapacity(69696);
|
|
private final Set<TileEntity> field_181024_n = Sets.newHashSet();
|
|
private ViewFrustum viewFrustum;
|
|
/**
|
|
* +
|
|
* The star GL Call list
|
|
*/
|
|
private int starGLCallList = -1;
|
|
/**
|
|
* +
|
|
* OpenGL sky list
|
|
*/
|
|
private int glSkyList = -1;
|
|
/**
|
|
* +
|
|
* OpenGL sky list 2
|
|
*/
|
|
private int glSkyList2 = -1;
|
|
public int cloudTickCounter;
|
|
private final Map<Integer, DestroyBlockProgress> damagedBlocks = Maps.newHashMap();
|
|
private final Map<BlockPos, ISound> mapSoundPositions = Maps.newHashMap();
|
|
private final EaglerTextureAtlasSprite[] destroyBlockIcons = new EaglerTextureAtlasSprite[10];
|
|
private double frustumUpdatePosX = Double.MIN_VALUE;
|
|
private double frustumUpdatePosY = Double.MIN_VALUE;
|
|
private double frustumUpdatePosZ = Double.MIN_VALUE;
|
|
private int frustumUpdatePosChunkX = Integer.MIN_VALUE;
|
|
private int frustumUpdatePosChunkY = Integer.MIN_VALUE;
|
|
private int frustumUpdatePosChunkZ = Integer.MIN_VALUE;
|
|
private double lastViewEntityX = Double.MIN_VALUE;
|
|
private double lastViewEntityY = Double.MIN_VALUE;
|
|
private double lastViewEntityZ = Double.MIN_VALUE;
|
|
private float lastViewProjMatrixFOV = Float.MIN_VALUE;
|
|
private double lastViewEntityPitch = Double.MIN_VALUE;
|
|
private double lastViewEntityYaw = Double.MIN_VALUE;
|
|
private final ChunkUpdateManager renderDispatcher = new ChunkUpdateManager();
|
|
private ChunkRenderContainer renderContainer;
|
|
private int renderDistanceChunks = -1;
|
|
/**
|
|
* +
|
|
* Render entities startup counter (init value=2)
|
|
*/
|
|
private int renderEntitiesStartupCounter = 2;
|
|
private int countEntitiesTotal;
|
|
private int countEntitiesRendered;
|
|
private int countEntitiesHidden;
|
|
private boolean debugFixTerrainFrustum = false;
|
|
private ClippingHelper debugFixedClippingHelper;
|
|
private final Vector4f[] debugTerrainMatrix = new Vector4f[8];
|
|
private final Vector3d debugTerrainFrustumPosition = new Vector3d();
|
|
private boolean vboEnabled = false;
|
|
IRenderChunkFactory renderChunkFactory;
|
|
private double prevRenderSortX;
|
|
private double prevRenderSortY;
|
|
private double prevRenderSortZ;
|
|
private boolean displayListEntitiesDirty = true;
|
|
|
|
private final Set<BlockPos> setLightUpdates = Sets.<BlockPos>newHashSet();
|
|
|
|
public RenderGlobal(Minecraft mcIn) {
|
|
this.mc = mcIn;
|
|
this.renderManager = mcIn.getRenderManager();
|
|
this.renderEngine = mcIn.getTextureManager();
|
|
this.renderEngine.bindTexture(locationForcefieldPng);
|
|
EaglercraftGPU.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
|
|
EaglercraftGPU.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
|
GlStateManager.bindTexture(0);
|
|
this.updateDestroyBlockIcons();
|
|
this.vboEnabled = false;
|
|
this.renderContainer = new RenderList();
|
|
this.renderChunkFactory = new ListChunkFactory();
|
|
this.generateStars();
|
|
this.generateSky();
|
|
this.generateSky2();
|
|
}
|
|
|
|
public void onResourceManagerReload(IResourceManager var1) {
|
|
this.updateDestroyBlockIcons();
|
|
}
|
|
|
|
private void updateDestroyBlockIcons() {
|
|
TextureMap texturemap = this.mc.getTextureMapBlocks();
|
|
|
|
for (int i = 0; i < this.destroyBlockIcons.length; ++i) {
|
|
this.destroyBlockIcons[i] = texturemap.getAtlasSprite("minecraft:blocks/destroy_stage_" + i);
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
* +
|
|
* Creates the entity outline shader to be stored in
|
|
* RenderGlobal.entityOutlineShader
|
|
*/
|
|
public void makeEntityOutlineShader() {
|
|
|
|
}
|
|
|
|
public void renderEntityOutlineFramebuffer() {
|
|
|
|
}
|
|
|
|
protected boolean isRenderEntityOutlines() {
|
|
return false;
|
|
}
|
|
|
|
private void generateSky2() {
|
|
Tessellator tessellator = Tessellator.getInstance();
|
|
WorldRenderer worldrenderer = tessellator.getWorldRenderer();
|
|
|
|
if (this.glSkyList2 >= 0) {
|
|
GLAllocation.deleteDisplayLists(this.glSkyList2);
|
|
this.glSkyList2 = -1;
|
|
}
|
|
|
|
this.glSkyList2 = GLAllocation.generateDisplayLists();
|
|
EaglercraftGPU.glNewList(this.glSkyList2, GL_COMPILE);
|
|
this.renderSky(worldrenderer, -16.0F, true);
|
|
tessellator.draw();
|
|
EaglercraftGPU.glEndList();
|
|
|
|
}
|
|
|
|
private void generateSky() {
|
|
Tessellator tessellator = Tessellator.getInstance();
|
|
WorldRenderer worldrenderer = tessellator.getWorldRenderer();
|
|
|
|
if (this.glSkyList >= 0) {
|
|
GLAllocation.deleteDisplayLists(this.glSkyList);
|
|
this.glSkyList = -1;
|
|
}
|
|
|
|
this.glSkyList = GLAllocation.generateDisplayLists();
|
|
EaglercraftGPU.glNewList(this.glSkyList, GL_COMPILE);
|
|
this.renderSky(worldrenderer, 16.0F, false);
|
|
tessellator.draw();
|
|
EaglercraftGPU.glEndList();
|
|
|
|
}
|
|
|
|
private void renderSky(WorldRenderer worldRendererIn, float parFloat1, boolean parFlag) {
|
|
boolean flag = true;
|
|
boolean flag1 = true;
|
|
worldRendererIn.begin(7, DefaultVertexFormats.POSITION);
|
|
|
|
for (int i = -384; i <= 384; i += 64) {
|
|
for (int j = -384; j <= 384; j += 64) {
|
|
float f = (float) i;
|
|
float f1 = (float) (i + 64);
|
|
if (parFlag) {
|
|
f1 = (float) i;
|
|
f = (float) (i + 64);
|
|
}
|
|
|
|
worldRendererIn.pos((double) f, (double) parFloat1, (double) j).endVertex();
|
|
worldRendererIn.pos((double) f1, (double) parFloat1, (double) j).endVertex();
|
|
worldRendererIn.pos((double) f1, (double) parFloat1, (double) (j + 64)).endVertex();
|
|
worldRendererIn.pos((double) f, (double) parFloat1, (double) (j + 64)).endVertex();
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
private void generateStars() {
|
|
Tessellator tessellator = Tessellator.getInstance();
|
|
WorldRenderer worldrenderer = tessellator.getWorldRenderer();
|
|
|
|
if (this.starGLCallList >= 0) {
|
|
GLAllocation.deleteDisplayLists(this.starGLCallList);
|
|
this.starGLCallList = -1;
|
|
}
|
|
|
|
this.starGLCallList = GLAllocation.generateDisplayLists();
|
|
GlStateManager.pushMatrix();
|
|
EaglercraftGPU.glNewList(this.starGLCallList, GL_COMPILE);
|
|
this.renderStars(worldrenderer);
|
|
tessellator.draw();
|
|
EaglercraftGPU.glEndList();
|
|
GlStateManager.popMatrix();
|
|
|
|
}
|
|
|
|
private void renderStars(WorldRenderer worldRendererIn) {
|
|
EaglercraftRandom random = new EaglercraftRandom(10842L);
|
|
worldRendererIn.begin(7, DefaultVertexFormats.POSITION);
|
|
|
|
for (int i = 0; i < 1500; ++i) {
|
|
double d0 = (double) (random.nextFloat() * 2.0F - 1.0F);
|
|
double d1 = (double) (random.nextFloat() * 2.0F - 1.0F);
|
|
double d2 = (double) (random.nextFloat() * 2.0F - 1.0F);
|
|
double d3 = (double) (0.15F + random.nextFloat() * 0.1F);
|
|
double d4 = d0 * d0 + d1 * d1 + d2 * d2;
|
|
if (d4 < 1.0D && d4 > 0.01D) {
|
|
d4 = 1.0D / Math.sqrt(d4);
|
|
d0 = d0 * d4;
|
|
d1 = d1 * d4;
|
|
d2 = d2 * d4;
|
|
double d5 = d0 * 100.0D;
|
|
double d6 = d1 * 100.0D;
|
|
double d7 = d2 * 100.0D;
|
|
double d8 = Math.atan2(d0, d2);
|
|
double d9 = Math.sin(d8);
|
|
double d10 = Math.cos(d8);
|
|
double d11 = Math.atan2(Math.sqrt(d0 * d0 + d2 * d2), d1);
|
|
double d12 = Math.sin(d11);
|
|
double d13 = Math.cos(d11);
|
|
double d14 = random.nextDouble() * 3.141592653589793D * 2.0D;
|
|
double d15 = Math.sin(d14);
|
|
double d16 = Math.cos(d14);
|
|
|
|
for (int j = 0; j < 4; ++j) {
|
|
double d17 = 0.0D;
|
|
double d18 = (double) ((j & 2) - 1) * d3;
|
|
double d19 = (double) ((j + 1 & 2) - 1) * d3;
|
|
double d20 = 0.0D;
|
|
double d21 = d18 * d16 - d19 * d15;
|
|
double d22 = d19 * d16 + d18 * d15;
|
|
double d23 = d21 * d12 + 0.0D * d13;
|
|
double d24 = 0.0D * d12 - d21 * d13;
|
|
double d25 = d24 * d9 - d22 * d10;
|
|
double d26 = d22 * d9 + d24 * d10;
|
|
worldRendererIn.pos(d5 + d25, d6 + d23, d7 + d26).endVertex();
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
* +
|
|
* set null to clear
|
|
*/
|
|
public void setWorldAndLoadRenderers(WorldClient worldClientIn) {
|
|
if (this.theWorld != null) {
|
|
this.theWorld.removeWorldAccess(this);
|
|
}
|
|
|
|
this.frustumUpdatePosX = Double.MIN_VALUE;
|
|
this.frustumUpdatePosY = Double.MIN_VALUE;
|
|
this.frustumUpdatePosZ = Double.MIN_VALUE;
|
|
this.frustumUpdatePosChunkX = Integer.MIN_VALUE;
|
|
this.frustumUpdatePosChunkY = Integer.MIN_VALUE;
|
|
this.frustumUpdatePosChunkZ = Integer.MIN_VALUE;
|
|
this.renderManager.set(worldClientIn);
|
|
this.theWorld = worldClientIn;
|
|
if (worldClientIn != null) {
|
|
worldClientIn.addWorldAccess(this);
|
|
this.loadRenderers();
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
* +
|
|
* Loads all the renderers and sets up the basic settings usage
|
|
*/
|
|
public void loadRenderers() {
|
|
if (this.theWorld != null) {
|
|
this.displayListEntitiesDirty = true;
|
|
|
|
if (mc.gameSettings.shaders) {
|
|
if (!EaglerDeferredPipeline.isSupported()) {
|
|
mc.gameSettings.shaders = false;
|
|
}
|
|
}
|
|
|
|
Blocks.leaves.setGraphicsLevel(mc.gameSettings.shaders || mc.gameSettings.fancyGraphics);
|
|
Blocks.leaves2.setGraphicsLevel(mc.gameSettings.shaders || mc.gameSettings.fancyGraphics);
|
|
this.renderDistanceChunks = this.mc.gameSettings.renderDistanceChunks;
|
|
|
|
if (this.viewFrustum != null) {
|
|
this.viewFrustum.deleteGlResources();
|
|
}
|
|
|
|
this.stopChunkUpdates();
|
|
synchronized (this.field_181024_n) {
|
|
this.field_181024_n.clear();
|
|
}
|
|
|
|
this.viewFrustum = new ViewFrustum(this.theWorld, this.mc.gameSettings.renderDistanceChunks, this,
|
|
this.renderChunkFactory);
|
|
if (this.theWorld != null) {
|
|
Entity entity = this.mc.getRenderViewEntity();
|
|
if (entity != null) {
|
|
this.viewFrustum.updateChunkPositions(entity.posX, entity.posZ);
|
|
}
|
|
}
|
|
|
|
this.renderEntitiesStartupCounter = 2;
|
|
|
|
if (mc.gameSettings.shaders) {
|
|
EaglerDeferredConfig dfc = mc.gameSettings.deferredShaderConf;
|
|
dfc.updateConfig();
|
|
if (theWorld.provider.getHasNoSky()) {
|
|
dfc.is_rendering_shadowsSun_clamped = 0;
|
|
dfc.is_rendering_lightShafts = false;
|
|
} else {
|
|
int maxDist = renderDistanceChunks << 4;
|
|
int ss = dfc.is_rendering_shadowsSun;
|
|
while (ss > 1 && (1 << (ss + 3)) > maxDist) {
|
|
--ss;
|
|
}
|
|
dfc.is_rendering_shadowsSun_clamped = ss;
|
|
dfc.is_rendering_lightShafts = dfc.lightShafts;
|
|
}
|
|
boolean flag = false;
|
|
if (EaglerDeferredPipeline.instance == null) {
|
|
EaglerDeferredPipeline.instance = new EaglerDeferredPipeline(mc);
|
|
flag = true;
|
|
}
|
|
try {
|
|
SharedPipelineShaders.init();
|
|
EaglerDeferredPipeline.instance.rebuild(dfc);
|
|
EaglerDeferredPipeline.isSuspended = false;
|
|
} catch (Throwable ex) {
|
|
logger.error("Could not enable shaders!");
|
|
logger.error(ex);
|
|
EaglerDeferredPipeline.isSuspended = true;
|
|
}
|
|
if (flag && !EaglerDeferredPipeline.isSuspended) {
|
|
ChatComponentText shaderF4Msg = new ChatComponentText("[EaglercraftX] ");
|
|
shaderF4Msg.getChatStyle().setColor(EnumChatFormatting.GOLD);
|
|
ChatComponentTranslation shaderF4Msg2 = new ChatComponentTranslation("shaders.debugMenuTip",
|
|
Keyboard.getKeyName(mc.gameSettings.keyBindFunction.getKeyCode()));
|
|
shaderF4Msg2.getChatStyle().setColor(EnumChatFormatting.AQUA);
|
|
shaderF4Msg.appendSibling(shaderF4Msg2);
|
|
mc.ingameGUI.getChatGUI().printChatMessage(shaderF4Msg);
|
|
}
|
|
}
|
|
|
|
mc.gameSettings.shadersAODisable = mc.gameSettings.shaders
|
|
&& mc.gameSettings.deferredShaderConf.is_rendering_ssao;
|
|
|
|
if (!mc.gameSettings.shaders || EaglerDeferredPipeline.isSuspended) {
|
|
try {
|
|
if (EaglerDeferredPipeline.instance != null) {
|
|
EaglerDeferredPipeline.instance.destroy();
|
|
EaglerDeferredPipeline.instance = null;
|
|
}
|
|
} catch (Throwable ex) {
|
|
logger.error("Could not safely disable shaders!");
|
|
logger.error(ex);
|
|
}
|
|
SharedPipelineShaders.free();
|
|
}
|
|
|
|
if (DeferredStateManager.isDeferredRenderer()) {
|
|
DynamicLightsStateManager.disableDynamicLightsRender(false);
|
|
} else {
|
|
if (mc.gameSettings.enableDynamicLights) {
|
|
DynamicLightsStateManager.enableDynamicLightsRender();
|
|
} else {
|
|
DynamicLightsStateManager.disableDynamicLightsRender(true);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
protected void stopChunkUpdates() {
|
|
this.chunksToUpdate.clear();
|
|
this.renderDispatcher.stopChunkUpdates();
|
|
}
|
|
|
|
public void createBindEntityOutlineFbs(int parInt1, int parInt2) {
|
|
|
|
}
|
|
|
|
public void renderEntities(Entity renderViewEntity, ICamera camera, float partialTicks) {
|
|
if (this.renderEntitiesStartupCounter > 0) {
|
|
--this.renderEntitiesStartupCounter;
|
|
} else {
|
|
boolean light = DynamicLightManager.isRenderingLights();
|
|
double d0 = renderViewEntity.prevPosX
|
|
+ (renderViewEntity.posX - renderViewEntity.prevPosX) * (double) partialTicks;
|
|
double d1 = renderViewEntity.prevPosY
|
|
+ (renderViewEntity.posY - renderViewEntity.prevPosY) * (double) partialTicks;
|
|
double d2 = renderViewEntity.prevPosZ
|
|
+ (renderViewEntity.posZ - renderViewEntity.prevPosZ) * (double) partialTicks;
|
|
TileEntityRendererDispatcher.instance.cacheActiveRenderInfo(this.theWorld, this.mc.getTextureManager(),
|
|
this.mc.fontRendererObj, this.mc.getRenderViewEntity(), partialTicks);
|
|
this.renderManager.cacheActiveRenderInfo(this.theWorld, this.mc.fontRendererObj,
|
|
this.mc.getRenderViewEntity(), this.mc.pointedEntity, this.mc.gameSettings, partialTicks);
|
|
this.countEntitiesTotal = 0;
|
|
this.countEntitiesRendered = 0;
|
|
this.countEntitiesHidden = 0;
|
|
Entity entity = this.mc.getRenderViewEntity();
|
|
double d3 = entity.lastTickPosX + (entity.posX - entity.lastTickPosX) * (double) partialTicks;
|
|
double d4 = entity.lastTickPosY + (entity.posY - entity.lastTickPosY) * (double) partialTicks;
|
|
double d5 = entity.lastTickPosZ + (entity.posZ - entity.lastTickPosZ) * (double) partialTicks;
|
|
TileEntityRendererDispatcher.staticPlayerX = d3;
|
|
TileEntityRendererDispatcher.staticPlayerY = d4;
|
|
TileEntityRendererDispatcher.staticPlayerZ = d5;
|
|
this.renderManager.setRenderPosition(d3, d4, d5);
|
|
this.mc.entityRenderer.enableLightmap();
|
|
List list = this.theWorld.getLoadedEntityList();
|
|
this.countEntitiesTotal = list.size();
|
|
|
|
if (!DeferredStateManager.isDeferredRenderer()) {
|
|
for (int i = 0; i < this.theWorld.weatherEffects.size(); ++i) {
|
|
Entity entity1 = (Entity) this.theWorld.weatherEffects.get(i);
|
|
++this.countEntitiesRendered;
|
|
if (entity1.isInRangeToRender3d(d0, d1, d2)) {
|
|
if (light) {
|
|
entity1.renderDynamicLightsEagler(partialTicks, true);
|
|
}
|
|
this.renderManager.renderEntitySimple(entity1, partialTicks);
|
|
}
|
|
}
|
|
}
|
|
|
|
label738: for (int ii = 0, ll = this.renderInfos.size(); ii < ll; ++ii) {
|
|
RenderGlobal.ContainerLocalRenderInformation renderglobal$containerlocalrenderinformation = this.renderInfos
|
|
.get(ii);
|
|
Chunk chunk = this.theWorld.getChunkFromBlockCoords(
|
|
renderglobal$containerlocalrenderinformation.renderChunk.getPosition());
|
|
ClassInheritanceMultiMap classinheritancemultimap = chunk
|
|
.getEntityLists()[renderglobal$containerlocalrenderinformation.renderChunk.getPosition().getY()
|
|
/ 16];
|
|
if (!classinheritancemultimap.isEmpty()) {
|
|
Iterator iterator = classinheritancemultimap.iterator();
|
|
|
|
while (true) {
|
|
Entity entity2;
|
|
boolean flag2;
|
|
while (true) {
|
|
if (!iterator.hasNext()) {
|
|
continue label738;
|
|
}
|
|
|
|
entity2 = (Entity) iterator.next();
|
|
flag2 = this.renderManager.shouldRender(entity2, camera, d0, d1, d2)
|
|
|| entity2.riddenByEntity == this.mc.thePlayer;
|
|
if (light) {
|
|
entity2.renderDynamicLightsEagler(partialTicks, flag2);
|
|
}
|
|
if (!flag2) {
|
|
break;
|
|
}
|
|
|
|
boolean flag3 = this.mc.getRenderViewEntity() instanceof EntityLivingBase
|
|
? ((EntityLivingBase) this.mc.getRenderViewEntity()).isPlayerSleeping()
|
|
: false;
|
|
if ((entity2 != this.mc.getRenderViewEntity() || this.mc.gameSettings.thirdPersonView != 0
|
|
|| flag3)
|
|
&& (entity2.posY < 0.0D || entity2.posY >= 256.0D
|
|
|| this.theWorld.isBlockLoaded(new BlockPos(entity2)))) {
|
|
++this.countEntitiesRendered;
|
|
this.renderManager.renderEntitySimple(entity2, partialTicks);
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!flag2 && entity2 instanceof EntityWitherSkull) {
|
|
this.mc.getRenderManager().renderWitherSkull(entity2, partialTicks);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
RenderHelper.enableStandardItemLighting();
|
|
|
|
for (int ii = 0, ll = this.renderInfos.size(); ii < ll; ++ii) {
|
|
RenderGlobal.ContainerLocalRenderInformation renderglobal$containerlocalrenderinformation1 = this.renderInfos
|
|
.get(ii);
|
|
List list1 = renderglobal$containerlocalrenderinformation1.renderChunk.getCompiledChunk()
|
|
.getTileEntities();
|
|
if (!list1.isEmpty()) {
|
|
for (int m = 0, n = list1.size(); m < n; ++m) {
|
|
TileEntityRendererDispatcher.instance.renderTileEntity((TileEntity) list1.get(m), partialTicks,
|
|
-1);
|
|
}
|
|
}
|
|
}
|
|
|
|
synchronized (this.field_181024_n) {
|
|
for (TileEntity tileentity : this.field_181024_n) {
|
|
TileEntityRendererDispatcher.instance.renderTileEntity(tileentity, partialTicks, -1);
|
|
}
|
|
}
|
|
|
|
this.preRenderDamagedBlocks();
|
|
|
|
for (DestroyBlockProgress destroyblockprogress : this.damagedBlocks.values()) {
|
|
BlockPos blockpos = destroyblockprogress.getPosition();
|
|
TileEntity tileentity1 = this.theWorld.getTileEntity(blockpos);
|
|
if (tileentity1 instanceof TileEntityChest) {
|
|
TileEntityChest tileentitychest = (TileEntityChest) tileentity1;
|
|
if (tileentitychest.adjacentChestXNeg != null) {
|
|
blockpos = blockpos.offset(EnumFacing.WEST);
|
|
tileentity1 = this.theWorld.getTileEntity(blockpos);
|
|
} else if (tileentitychest.adjacentChestZNeg != null) {
|
|
blockpos = blockpos.offset(EnumFacing.NORTH);
|
|
tileentity1 = this.theWorld.getTileEntity(blockpos);
|
|
}
|
|
}
|
|
|
|
Block block = this.theWorld.getBlockState(blockpos).getBlock();
|
|
if (tileentity1 != null && (block instanceof BlockChest || block instanceof BlockEnderChest
|
|
|| block instanceof BlockSign || block instanceof BlockSkull)) {
|
|
TileEntityRendererDispatcher.instance.renderTileEntity(tileentity1, partialTicks,
|
|
destroyblockprogress.getPartialBlockDamage());
|
|
}
|
|
}
|
|
|
|
this.postRenderDamagedBlocks();
|
|
this.mc.entityRenderer.disableLightmap();
|
|
}
|
|
}
|
|
|
|
public static interface EntityChunkCullAdapter {
|
|
boolean shouldCull(RenderChunk renderChunk);
|
|
}
|
|
|
|
public static interface EntityObjectCullAdapter {
|
|
boolean shouldCull(RenderChunk renderChunk, RenderManager renderManager, Entity entity);
|
|
}
|
|
|
|
public void renderShadowLODEntities(Entity renderViewEntity, float partialTicks,
|
|
EntityChunkCullAdapter entityChunkCull, EntityObjectCullAdapter entityObjectCull) { // TODO
|
|
if (renderEntitiesStartupCounter <= 0) {
|
|
TileEntityRendererDispatcher.instance.cacheActiveRenderInfo(theWorld, mc.getTextureManager(),
|
|
mc.fontRendererObj, renderViewEntity, partialTicks);
|
|
renderManager.cacheActiveRenderInfo(theWorld, mc.fontRendererObj, renderViewEntity, mc.pointedEntity,
|
|
mc.gameSettings, partialTicks);
|
|
|
|
double d3 = renderViewEntity.lastTickPosX
|
|
+ (renderViewEntity.posX - renderViewEntity.lastTickPosX) * (double) partialTicks;
|
|
double d4 = renderViewEntity.lastTickPosY
|
|
+ (renderViewEntity.posY - renderViewEntity.lastTickPosY) * (double) partialTicks;
|
|
double d5 = renderViewEntity.lastTickPosZ
|
|
+ (renderViewEntity.posZ - renderViewEntity.lastTickPosZ) * (double) partialTicks;
|
|
TileEntityRendererDispatcher.staticPlayerX = d3;
|
|
TileEntityRendererDispatcher.staticPlayerY = d4;
|
|
TileEntityRendererDispatcher.staticPlayerZ = d5;
|
|
renderManager.setRenderPosition(d3, d4, d5);
|
|
|
|
for (RenderGlobal.ContainerLocalRenderInformation containerlocalrenderinformation : this.renderInfos) {
|
|
RenderChunk currentRenderChunk = containerlocalrenderinformation.renderChunk;
|
|
|
|
if (!entityChunkCull.shouldCull(currentRenderChunk)) {
|
|
Chunk chunk = this.theWorld
|
|
.getChunkFromBlockCoords(containerlocalrenderinformation.renderChunk.getPosition());
|
|
ClassInheritanceMultiMap<Entity> classinheritancemultimap = chunk
|
|
.getEntityLists()[containerlocalrenderinformation.renderChunk.getPosition().getY() / 16];
|
|
if (!classinheritancemultimap.isEmpty()) {
|
|
Iterator<Entity> iterator = classinheritancemultimap.iterator();
|
|
while (iterator.hasNext()) {
|
|
Entity entity2 = iterator.next();
|
|
if (!entityObjectCull.shouldCull(currentRenderChunk, renderManager, entity2)
|
|
|| entity2.riddenByEntity == this.mc.thePlayer) {
|
|
if (entity2.posY < 0.0D || entity2.posY >= 256.0D
|
|
|| this.theWorld.isBlockLoaded(new BlockPos(entity2))) {
|
|
++this.countEntitiesRendered;
|
|
this.renderManager.renderEntitySimple(entity2, partialTicks);
|
|
mc.entityRenderer.disableLightmap();
|
|
GlStateManager.disableShaderBlendAdd();
|
|
GlStateManager.disableBlend();
|
|
GlStateManager.depthMask(true);
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
// TODO: why?
|
|
// if (!flag2 && entity2 instanceof EntityWitherSkull) {
|
|
// this.mc.getRenderManager().renderWitherSkull(entity2, partialTicks);
|
|
// }
|
|
}
|
|
|
|
List<TileEntity> tileEntities = currentRenderChunk.compiledChunk.getTileEntities();
|
|
for (int i = 0, l = tileEntities.size(); i < l; ++i) {
|
|
TileEntityRendererDispatcher.instance.renderTileEntity(tileEntities.get(i), partialTicks, -1);
|
|
mc.entityRenderer.disableLightmap();
|
|
GlStateManager.disableShaderBlendAdd();
|
|
GlStateManager.disableBlend();
|
|
GlStateManager.depthMask(true);
|
|
}
|
|
}
|
|
}
|
|
|
|
synchronized (this.field_181024_n) {
|
|
for (TileEntity tileentity : this.field_181024_n) {
|
|
TileEntityRendererDispatcher.instance.renderTileEntity(tileentity, partialTicks, -1);
|
|
mc.entityRenderer.disableLightmap();
|
|
GlStateManager.disableShaderBlendAdd();
|
|
GlStateManager.disableBlend();
|
|
GlStateManager.depthMask(true);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public void renderParaboloidTileEntities(Entity renderViewEntity, float partialTicks, int up) {
|
|
if (renderEntitiesStartupCounter <= 0) {
|
|
TileEntityRendererDispatcher.instance.cacheActiveRenderInfo(theWorld, mc.getTextureManager(),
|
|
mc.fontRendererObj, renderViewEntity, partialTicks);
|
|
renderManager.cacheActiveRenderInfo(theWorld, mc.fontRendererObj, renderViewEntity, mc.pointedEntity,
|
|
mc.gameSettings, partialTicks);
|
|
|
|
double d3 = renderViewEntity.lastTickPosX
|
|
+ (renderViewEntity.posX - renderViewEntity.lastTickPosX) * (double) partialTicks;
|
|
double d4 = renderViewEntity.lastTickPosY
|
|
+ (renderViewEntity.posY - renderViewEntity.lastTickPosY) * (double) partialTicks;
|
|
double d5 = renderViewEntity.lastTickPosZ
|
|
+ (renderViewEntity.posZ - renderViewEntity.lastTickPosZ) * (double) partialTicks;
|
|
TileEntityRendererDispatcher.staticPlayerX = d3;
|
|
TileEntityRendererDispatcher.staticPlayerY = d4;
|
|
TileEntityRendererDispatcher.staticPlayerZ = d5;
|
|
renderManager.setRenderPosition(d3, d4, d5);
|
|
|
|
double rad = 8.0;
|
|
|
|
int minX = (int) (d3 - rad);
|
|
int minY = (int) d4;
|
|
if (up == -1) {
|
|
minY -= rad;
|
|
}
|
|
int minZ = (int) (d5 - rad);
|
|
|
|
int maxX = (int) (d3 + rad);
|
|
int maxY = (int) d4;
|
|
if (up == 1) {
|
|
maxY += rad;
|
|
}
|
|
int maxZ = (int) (d5 + rad);
|
|
|
|
BlockPos tmp = new BlockPos(0, 0, 0);
|
|
minX = MathHelper.floor_double(minX / 16.0) * 16;
|
|
minY = MathHelper.floor_double(minY / 16.0) * 16;
|
|
minZ = MathHelper.floor_double(minZ / 16.0) * 16;
|
|
maxX = MathHelper.floor_double(maxX / 16.0) * 16;
|
|
maxY = MathHelper.floor_double(maxY / 16.0) * 16;
|
|
maxZ = MathHelper.floor_double(maxZ / 16.0) * 16;
|
|
|
|
for (int cx = minX; cx <= maxX; cx += 16) {
|
|
for (int cz = minZ; cz <= maxZ; cz += 16) {
|
|
for (int cy = minY; cy <= maxY; cy += 16) {
|
|
tmp.x = cx;
|
|
tmp.y = cy;
|
|
tmp.z = cz;
|
|
RenderChunk ch = viewFrustum.getRenderChunk(tmp);
|
|
CompiledChunk cch;
|
|
if (ch != null && (cch = ch.compiledChunk) != null) {
|
|
List<TileEntity> tileEntities = cch.getTileEntities();
|
|
for (int i = 0, l = tileEntities.size(); i < l; ++i) {
|
|
mc.entityRenderer.enableLightmap();
|
|
TileEntityRendererDispatcher.instance.renderTileEntity(tileEntities.get(i),
|
|
partialTicks, -1);
|
|
GlStateManager.disableShaderBlendAdd();
|
|
GlStateManager.disableBlend();
|
|
GlStateManager.depthMask(true);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
mc.entityRenderer.disableLightmap();
|
|
}
|
|
}
|
|
|
|
private boolean isOutlineActive(Entity p_184383_1_, Entity p_184383_2_, ICamera p_184383_3_) {
|
|
boolean flag = p_184383_2_ instanceof EntityLivingBase && ((EntityLivingBase) p_184383_2_).isPlayerSleeping();
|
|
return p_184383_1_ == p_184383_2_ && this.mc.gameSettings.thirdPersonView == 0 && !flag ? false
|
|
: (p_184383_1_.isGlowing() ? true
|
|
: (this.mc.thePlayer.isSpectator() && false
|
|
// : (this.mc.thePlayer.isSpectator() &&
|
|
// this.mc.gameSettings.keyBindSpectatorOutlines.isKeyDown() // TODO: add this
|
|
&& p_184383_1_ instanceof EntityPlayer
|
|
? p_184383_1_.ignoreFrustumCheck
|
|
|| p_184383_3_
|
|
.isBoundingBoxInFrustum(p_184383_1_.getEntityBoundingBox())
|
|
|| p_184383_1_.riddenByEntity == this.mc.thePlayer
|
|
: false));
|
|
}
|
|
|
|
/**
|
|
* +
|
|
* Gets the render info for use on the Debug screen
|
|
*/
|
|
public String getDebugInfoRenders() {
|
|
int i = this.viewFrustum.renderChunks.length;
|
|
int j = 0;
|
|
|
|
for (int ii = 0, ll = this.renderInfos.size(); ii < ll; ++ii) {
|
|
RenderGlobal.ContainerLocalRenderInformation renderglobal$containerlocalrenderinformation = this.renderInfos
|
|
.get(ii);
|
|
CompiledChunk compiledchunk = renderglobal$containerlocalrenderinformation.renderChunk.compiledChunk;
|
|
if (compiledchunk != CompiledChunk.DUMMY && !compiledchunk.isEmpty()) {
|
|
++j;
|
|
}
|
|
}
|
|
|
|
return HString.format("C: %d/%d %sD: %d, %s",
|
|
new Object[] { Integer.valueOf(j), Integer.valueOf(i), this.mc.renderChunksMany ? "(s) " : "",
|
|
Integer.valueOf(this.renderDistanceChunks), this.renderDispatcher.getDebugInfo() });
|
|
}
|
|
|
|
/**
|
|
* +
|
|
* Gets the entities info for use on the Debug screen
|
|
*/
|
|
public String getDebugInfoEntities() {
|
|
return "E: " + this.countEntitiesRendered + "/" + this.countEntitiesTotal + ", B: " + this.countEntitiesHidden
|
|
+ ", I: " + (this.countEntitiesTotal - this.countEntitiesHidden - this.countEntitiesRendered);
|
|
}
|
|
|
|
public void setupTerrain(Entity viewEntity, double partialTicks, ICamera camera, int frameCount,
|
|
boolean playerSpectator) {
|
|
if (this.mc.gameSettings.renderDistanceChunks != this.renderDistanceChunks) {
|
|
this.loadRenderers();
|
|
}
|
|
|
|
double d0 = viewEntity.posX - this.frustumUpdatePosX;
|
|
double d1 = viewEntity.posY - this.frustumUpdatePosY;
|
|
double d2 = viewEntity.posZ - this.frustumUpdatePosZ;
|
|
if (this.frustumUpdatePosChunkX != viewEntity.chunkCoordX
|
|
|| this.frustumUpdatePosChunkY != viewEntity.chunkCoordY
|
|
|| this.frustumUpdatePosChunkZ != viewEntity.chunkCoordZ || d0 * d0 + d1 * d1 + d2 * d2 > 16.0D) {
|
|
this.frustumUpdatePosX = viewEntity.posX;
|
|
this.frustumUpdatePosY = viewEntity.posY;
|
|
this.frustumUpdatePosZ = viewEntity.posZ;
|
|
this.frustumUpdatePosChunkX = viewEntity.chunkCoordX;
|
|
this.frustumUpdatePosChunkY = viewEntity.chunkCoordY;
|
|
this.frustumUpdatePosChunkZ = viewEntity.chunkCoordZ;
|
|
this.viewFrustum.updateChunkPositions(viewEntity.posX, viewEntity.posZ);
|
|
}
|
|
|
|
double d3 = viewEntity.lastTickPosX + (viewEntity.posX - viewEntity.lastTickPosX) * partialTicks;
|
|
double d4 = viewEntity.lastTickPosY + (viewEntity.posY - viewEntity.lastTickPosY) * partialTicks;
|
|
double d5 = viewEntity.lastTickPosZ + (viewEntity.posZ - viewEntity.lastTickPosZ) * partialTicks;
|
|
this.renderContainer.initialize(d3, d4, d5);
|
|
if (this.debugFixedClippingHelper != null) {
|
|
Frustum frustum = new Frustum(this.debugFixedClippingHelper);
|
|
frustum.setPosition(this.debugTerrainFrustumPosition.field_181059_a,
|
|
this.debugTerrainFrustumPosition.field_181060_b, this.debugTerrainFrustumPosition.field_181061_c);
|
|
camera = frustum;
|
|
}
|
|
|
|
BlockPos blockpos1 = new BlockPos(d3, d4 + (double) viewEntity.getEyeHeight(), d5);
|
|
RenderChunk renderchunk = this.viewFrustum.getRenderChunk(blockpos1);
|
|
BlockPos blockpos = new BlockPos(MathHelper.floor_double(d3 / 16.0D) * 16,
|
|
MathHelper.floor_double(d4 / 16.0D) * 16, MathHelper.floor_double(d5 / 16.0D) * 16);
|
|
this.displayListEntitiesDirty = this.displayListEntitiesDirty || !this.chunksToUpdate.isEmpty()
|
|
|| viewEntity.posX != this.lastViewEntityX || viewEntity.posY != this.lastViewEntityY
|
|
|| viewEntity.posZ != this.lastViewEntityZ
|
|
|| (double) viewEntity.rotationPitch != this.lastViewEntityPitch
|
|
|| (double) viewEntity.rotationYaw != this.lastViewEntityYaw
|
|
|| this.mc.entityRenderer.currentProjMatrixFOV != this.lastViewProjMatrixFOV;
|
|
this.lastViewEntityX = viewEntity.posX;
|
|
this.lastViewEntityY = viewEntity.posY;
|
|
this.lastViewEntityZ = viewEntity.posZ;
|
|
this.lastViewEntityPitch = (double) viewEntity.rotationPitch;
|
|
this.lastViewEntityYaw = (double) viewEntity.rotationYaw;
|
|
this.lastViewProjMatrixFOV = this.mc.entityRenderer.currentProjMatrixFOV;
|
|
boolean flag = this.debugFixedClippingHelper != null;
|
|
if (!flag && this.displayListEntitiesDirty) {
|
|
this.displayListEntitiesDirty = false;
|
|
this.renderInfos = Lists.newArrayList();
|
|
LinkedList linkedlist = Lists.newLinkedList();
|
|
boolean flag1 = this.mc.renderChunksMany;
|
|
if (renderchunk != null) {
|
|
boolean flag2 = false;
|
|
RenderGlobal.ContainerLocalRenderInformation renderglobal$containerlocalrenderinformation3 = new RenderGlobal.ContainerLocalRenderInformation(
|
|
renderchunk, (EnumFacing) null, 0);
|
|
Set set1 = this.getVisibleFacings(blockpos1);
|
|
// if (set1.size() == 1) {
|
|
// Vector3f vector3f = this.getViewVector(viewEntity, partialTicks);
|
|
// EnumFacing enumfacing = EnumFacing.getFacingFromVector(vector3f.x,
|
|
// vector3f.y, vector3f.z)
|
|
// .getOpposite();
|
|
// set1.remove(enumfacing);
|
|
// }
|
|
|
|
if (set1.isEmpty()) {
|
|
flag2 = true;
|
|
}
|
|
|
|
if (flag2 && !playerSpectator) {
|
|
this.renderInfos.add(renderglobal$containerlocalrenderinformation3);
|
|
} else {
|
|
if (playerSpectator && this.theWorld.getBlockState(blockpos1).getBlock().isOpaqueCube()) {
|
|
flag1 = false;
|
|
}
|
|
|
|
renderchunk.setFrameIndex(frameCount);
|
|
linkedlist.add(renderglobal$containerlocalrenderinformation3);
|
|
}
|
|
} else {
|
|
int i = blockpos1.getY() > 0 ? 248 : 8;
|
|
|
|
for (int j = -this.renderDistanceChunks; j <= this.renderDistanceChunks; ++j) {
|
|
for (int k = -this.renderDistanceChunks; k <= this.renderDistanceChunks; ++k) {
|
|
RenderChunk renderchunk1 = this.viewFrustum
|
|
.getRenderChunk(new BlockPos((j << 4) + 8, i, (k << 4) + 8));
|
|
if (renderchunk1 != null
|
|
&& ((ICamera) camera).isBoundingBoxInFrustum(renderchunk1.boundingBox)) {
|
|
renderchunk1.setFrameIndex(frameCount);
|
|
linkedlist.add(new RenderGlobal.ContainerLocalRenderInformation(renderchunk1,
|
|
(EnumFacing) null, 0));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
while (!linkedlist.isEmpty()) {
|
|
RenderGlobal.ContainerLocalRenderInformation renderglobal$containerlocalrenderinformation1 = (RenderGlobal.ContainerLocalRenderInformation) linkedlist
|
|
.poll();
|
|
RenderChunk renderchunk3 = renderglobal$containerlocalrenderinformation1.renderChunk;
|
|
EnumFacing enumfacing2 = renderglobal$containerlocalrenderinformation1.facing;
|
|
BlockPos blockpos2 = renderchunk3.getPosition();
|
|
this.renderInfos.add(renderglobal$containerlocalrenderinformation1);
|
|
EnumFacing[] facings = EnumFacing._VALUES;
|
|
for (int i = 0; i < facings.length; ++i) {
|
|
EnumFacing enumfacing1 = facings[i];
|
|
RenderChunk renderchunk2 = this.func_181562_a(blockpos, renderchunk3, enumfacing1);
|
|
if ((!flag1 || !renderglobal$containerlocalrenderinformation1.setFacing // TODO:
|
|
.contains(enumfacing1.getOpposite()))
|
|
&& (!flag1 || enumfacing2 == null
|
|
|| renderchunk3.getCompiledChunk().isVisible(enumfacing2.getOpposite(),
|
|
enumfacing1))
|
|
&& renderchunk2 != null && renderchunk2.setFrameIndex(frameCount)
|
|
&& ((ICamera) camera).isBoundingBoxInFrustum(renderchunk2.boundingBox)) {
|
|
RenderGlobal.ContainerLocalRenderInformation renderglobal$containerlocalrenderinformation = new RenderGlobal.ContainerLocalRenderInformation(
|
|
renderchunk2, enumfacing1, renderglobal$containerlocalrenderinformation1.counter + 1);
|
|
renderglobal$containerlocalrenderinformation.setFacing
|
|
.addAll(renderglobal$containerlocalrenderinformation1.setFacing);
|
|
renderglobal$containerlocalrenderinformation.setFacing.add(enumfacing1);
|
|
linkedlist.add(renderglobal$containerlocalrenderinformation);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (this.debugFixTerrainFrustum) {
|
|
this.fixTerrainFrustum(d3, d4, d5);
|
|
this.debugFixTerrainFrustum = false;
|
|
}
|
|
|
|
Set set = this.chunksToUpdate;
|
|
this.chunksToUpdate = Sets.newLinkedHashSet();
|
|
|
|
for (int ii = 0, ll = this.renderInfos.size(); ii < ll; ++ii) {
|
|
RenderGlobal.ContainerLocalRenderInformation renderglobal$containerlocalrenderinformation2 = this.renderInfos
|
|
.get(ii);
|
|
RenderChunk renderchunk4 = renderglobal$containerlocalrenderinformation2.renderChunk;
|
|
if (renderchunk4.isNeedsUpdate() || set.contains(renderchunk4)) {
|
|
this.displayListEntitiesDirty = true;
|
|
if (this.mc.gameSettings.chunkFix ? this.isPositionInRenderChunkHack(blockpos1, renderchunk4)
|
|
: this.isPositionInRenderChunk(blockpos, renderchunk4)) {
|
|
this.renderDispatcher.updateChunkNow(renderchunk4);
|
|
renderchunk4.setNeedsUpdate(false);
|
|
} else {
|
|
this.chunksToUpdate.add(renderchunk4);
|
|
}
|
|
}
|
|
}
|
|
|
|
this.chunksToUpdate.addAll(set);
|
|
}
|
|
|
|
private boolean isPositionInRenderChunk(BlockPos pos, RenderChunk renderChunkIn) {
|
|
BlockPos blockpos = renderChunkIn.getPosition();
|
|
return MathHelper.abs_int(pos.getX() - blockpos.getX()) > 16 ? false
|
|
: (MathHelper.abs_int(pos.getY() - blockpos.getY()) > 16 ? false
|
|
: MathHelper.abs_int(pos.getZ() - blockpos.getZ()) <= 16);
|
|
}
|
|
|
|
/**
|
|
* WARNING: use only in the above "build near" logic
|
|
*/
|
|
private boolean isPositionInRenderChunkHack(BlockPos pos, RenderChunk renderChunkIn) {
|
|
BlockPos blockpos = renderChunkIn.getPosition();
|
|
return MathHelper.abs_int(pos.getX() - blockpos.getX() - 8) > 11 ? false
|
|
: (MathHelper.abs_int(pos.getY() - blockpos.getY() - 8) > 11 ? false
|
|
: MathHelper.abs_int(pos.getZ() - blockpos.getZ() - 8) <= 11);
|
|
}
|
|
|
|
private Set<EnumFacing> getVisibleFacings(BlockPos pos) {
|
|
VisGraph visgraph = new VisGraph();
|
|
visgraph.setLimitScan(true);
|
|
BlockPos blockpos = new BlockPos(pos.getX() >> 4 << 4, pos.getY() >> 4 << 4, pos.getZ() >> 4 << 4);
|
|
Chunk chunk = this.theWorld.getChunkFromBlockCoords(blockpos);
|
|
|
|
for (BlockPos.MutableBlockPos blockpos$mutableblockpos : BlockPos.getAllInBoxMutable(blockpos,
|
|
blockpos.add(15, 15, 15))) {
|
|
if (chunk.getBlock(blockpos$mutableblockpos).isOpaqueCube()) {
|
|
visgraph.func_178606_a(blockpos$mutableblockpos);
|
|
}
|
|
}
|
|
|
|
return visgraph.func_178609_b(pos);
|
|
}
|
|
|
|
private RenderChunk func_181562_a(BlockPos parBlockPos, RenderChunk parRenderChunk, EnumFacing parEnumFacing) {
|
|
BlockPos blockpos = parRenderChunk.func_181701_a(parEnumFacing);
|
|
return MathHelper
|
|
.abs_int(parBlockPos.getX() - blockpos.getX()) > this.renderDistanceChunks * 16
|
|
? null
|
|
: (blockpos.getY() >= 0 && blockpos.getY() < 256
|
|
? (MathHelper.abs_int(parBlockPos.getZ() - blockpos.getZ()) > this.renderDistanceChunks
|
|
* 16 ? null : this.viewFrustum.getRenderChunk(blockpos))
|
|
: null);
|
|
}
|
|
|
|
private void fixTerrainFrustum(double x, double y, double z) {
|
|
this.debugFixedClippingHelper = new ClippingHelperImpl();
|
|
((ClippingHelperImpl) this.debugFixedClippingHelper).init();
|
|
((ClippingHelperImpl) this.debugFixedClippingHelper).destroy();
|
|
Matrix4f matrix4f = new Matrix4f(this.debugFixedClippingHelper.modelviewMatrix);
|
|
matrix4f.transpose();
|
|
Matrix4f matrix4f1 = new Matrix4f(this.debugFixedClippingHelper.projectionMatrix);
|
|
matrix4f1.transpose();
|
|
Matrix4f matrix4f2 = new Matrix4f();
|
|
Matrix4f.mul(matrix4f1, matrix4f, matrix4f2);
|
|
matrix4f2.invert();
|
|
this.debugTerrainFrustumPosition.field_181059_a = x;
|
|
this.debugTerrainFrustumPosition.field_181060_b = y;
|
|
this.debugTerrainFrustumPosition.field_181061_c = z;
|
|
this.debugTerrainMatrix[0] = new Vector4f(-1.0F, -1.0F, -1.0F, 1.0F);
|
|
this.debugTerrainMatrix[1] = new Vector4f(1.0F, -1.0F, -1.0F, 1.0F);
|
|
this.debugTerrainMatrix[2] = new Vector4f(1.0F, 1.0F, -1.0F, 1.0F);
|
|
this.debugTerrainMatrix[3] = new Vector4f(-1.0F, 1.0F, -1.0F, 1.0F);
|
|
this.debugTerrainMatrix[4] = new Vector4f(-1.0F, -1.0F, 1.0F, 1.0F);
|
|
this.debugTerrainMatrix[5] = new Vector4f(1.0F, -1.0F, 1.0F, 1.0F);
|
|
this.debugTerrainMatrix[6] = new Vector4f(1.0F, 1.0F, 1.0F, 1.0F);
|
|
this.debugTerrainMatrix[7] = new Vector4f(-1.0F, 1.0F, 1.0F, 1.0F);
|
|
|
|
for (int i = 0; i < 8; ++i) {
|
|
Matrix4f.transform(matrix4f2, this.debugTerrainMatrix[i], this.debugTerrainMatrix[i]);
|
|
this.debugTerrainMatrix[i].x /= this.debugTerrainMatrix[i].w;
|
|
this.debugTerrainMatrix[i].y /= this.debugTerrainMatrix[i].w;
|
|
this.debugTerrainMatrix[i].z /= this.debugTerrainMatrix[i].w;
|
|
this.debugTerrainMatrix[i].w = 1.0F;
|
|
}
|
|
|
|
}
|
|
|
|
protected Vector3f getViewVector(Entity entityIn, double partialTicks) {
|
|
float f = (float) ((double) entityIn.prevRotationPitch
|
|
+ (double) (entityIn.rotationPitch - entityIn.prevRotationPitch) * partialTicks);
|
|
float f1 = (float) ((double) entityIn.prevRotationYaw
|
|
+ (double) (entityIn.rotationYaw - entityIn.prevRotationYaw) * partialTicks);
|
|
if (Minecraft.getMinecraft().gameSettings.thirdPersonView == 2) {
|
|
f += 180.0F;
|
|
}
|
|
|
|
float f2 = MathHelper.cos(-f1 * 0.017453292F - 3.1415927F);
|
|
float f3 = MathHelper.sin(-f1 * 0.017453292F - 3.1415927F);
|
|
float f4 = -MathHelper.cos(-f * 0.017453292F);
|
|
float f5 = MathHelper.sin(-f * 0.017453292F);
|
|
return new Vector3f(f3 * f4, f5, f2 * f4);
|
|
}
|
|
|
|
public int renderBlockLayer(EnumWorldBlockLayer blockLayerIn, double partialTicks, int pass, Entity entityIn) {
|
|
RenderHelper.disableStandardItemLighting();
|
|
if (blockLayerIn == EnumWorldBlockLayer.TRANSLUCENT) {
|
|
double d0 = entityIn.posX - this.prevRenderSortX;
|
|
double d1 = entityIn.posY - this.prevRenderSortY;
|
|
double d2 = entityIn.posZ - this.prevRenderSortZ;
|
|
if (d0 * d0 + d1 * d1 + d2 * d2 > 1.0D) {
|
|
this.prevRenderSortX = entityIn.posX;
|
|
this.prevRenderSortY = entityIn.posY;
|
|
this.prevRenderSortZ = entityIn.posZ;
|
|
int k = 0;
|
|
|
|
for (int ii = 0, ll = this.renderInfos.size(); ii < ll; ++ii) {
|
|
RenderGlobal.ContainerLocalRenderInformation renderglobal$containerlocalrenderinformation = this.renderInfos
|
|
.get(ii);
|
|
if (renderglobal$containerlocalrenderinformation.renderChunk.compiledChunk
|
|
.isLayerStarted(blockLayerIn) && k++ < 15) {
|
|
this.renderDispatcher
|
|
.updateTransparencyLater(renderglobal$containerlocalrenderinformation.renderChunk);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
int l = 0;
|
|
boolean flag = blockLayerIn == EnumWorldBlockLayer.TRANSLUCENT;
|
|
int i1 = flag ? this.renderInfos.size() - 1 : 0;
|
|
int i = flag ? -1 : this.renderInfos.size();
|
|
int j1 = flag ? -1 : 1;
|
|
|
|
for (int j = i1; j != i; j += j1) {
|
|
RenderChunk renderchunk = ((RenderGlobal.ContainerLocalRenderInformation) this.renderInfos
|
|
.get(j)).renderChunk;
|
|
if (!renderchunk.getCompiledChunk().isLayerEmpty(blockLayerIn)) {
|
|
++l;
|
|
this.renderContainer.addRenderChunk(renderchunk, blockLayerIn);
|
|
}
|
|
}
|
|
|
|
this.renderBlockLayer(blockLayerIn);
|
|
return l;
|
|
}
|
|
|
|
public static interface ChunkCullAdapter {
|
|
boolean shouldCull(RenderChunk chunk);
|
|
}
|
|
|
|
public int renderBlockLayerShadow(EnumWorldBlockLayer blockLayerIn, AxisAlignedBB boundingBox,
|
|
ChunkCullAdapter cullAdapter) {
|
|
int i = 0;
|
|
BlockPos tmp = new BlockPos(0, 0, 0);
|
|
int minXChunk = MathHelper.floor_double(boundingBox.minX / 16.0) * 16;
|
|
int minYChunk = MathHelper.floor_double(boundingBox.minY / 16.0) * 16;
|
|
int minZChunk = MathHelper.floor_double(boundingBox.minZ / 16.0) * 16;
|
|
int maxXChunk = MathHelper.floor_double(boundingBox.maxX / 16.0) * 16;
|
|
int maxYChunk = MathHelper.floor_double(boundingBox.maxY / 16.0) * 16;
|
|
int maxZChunk = MathHelper.floor_double(boundingBox.maxZ / 16.0) * 16;
|
|
for (int cx = minXChunk; cx <= maxXChunk; cx += 16) {
|
|
for (int cz = minZChunk; cz <= maxZChunk; cz += 16) {
|
|
for (int cy = minYChunk; cy <= maxYChunk; cy += 16) {
|
|
tmp.x = cx;
|
|
tmp.y = cy;
|
|
tmp.z = cz;
|
|
RenderChunk ch = viewFrustum.getRenderChunk(tmp);
|
|
CompiledChunk cch;
|
|
if (ch != null && (cch = ch.getCompiledChunk()) != null && !cch.isLayerEmpty(blockLayerIn)
|
|
&& !cullAdapter.shouldCull(ch)) {
|
|
this.renderContainer.addRenderChunk(ch, blockLayerIn);
|
|
++i;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (i > 0) {
|
|
this.renderContainer.renderChunkLayer(blockLayerIn);
|
|
}
|
|
return i;
|
|
}
|
|
|
|
private void renderBlockLayer(EnumWorldBlockLayer blockLayerIn) {
|
|
this.mc.entityRenderer.enableLightmap();
|
|
this.renderContainer.renderChunkLayer(blockLayerIn);
|
|
this.mc.entityRenderer.disableLightmap();
|
|
}
|
|
|
|
public int renderParaboloidBlockLayer(EnumWorldBlockLayer blockLayerIn, double partialTicks, int up,
|
|
Entity entityIn) {
|
|
double rad = 8.0;
|
|
|
|
int minX = (int) (entityIn.posX - rad);
|
|
int minY = (int) entityIn.posY;
|
|
if (up == -1) {
|
|
minY -= rad * 0.75;
|
|
} else {
|
|
minY += 1.0;
|
|
}
|
|
int minZ = (int) (entityIn.posZ - rad);
|
|
|
|
int maxX = (int) (entityIn.posX + rad);
|
|
int maxY = (int) entityIn.posY;
|
|
if (up == 1) {
|
|
maxY += rad;
|
|
} else {
|
|
maxY += 2.0;
|
|
}
|
|
int maxZ = (int) (entityIn.posZ + rad);
|
|
|
|
BlockPos tmp = new BlockPos(0, 0, 0);
|
|
minX = MathHelper.floor_double(minX / 16.0) * 16;
|
|
minY = MathHelper.floor_double(minY / 16.0) * 16;
|
|
minZ = MathHelper.floor_double(minZ / 16.0) * 16;
|
|
maxX = MathHelper.floor_double(maxX / 16.0) * 16;
|
|
maxY = MathHelper.floor_double(maxY / 16.0) * 16;
|
|
maxZ = MathHelper.floor_double(maxZ / 16.0) * 16;
|
|
|
|
int i = 0;
|
|
for (int cx = minX; cx <= maxX; cx += 16) {
|
|
for (int cz = minZ; cz <= maxZ; cz += 16) {
|
|
for (int cy = minY; cy <= maxY; cy += 16) {
|
|
tmp.x = cx;
|
|
tmp.y = cy;
|
|
tmp.z = cz;
|
|
RenderChunk ch = viewFrustum.getRenderChunk(tmp);
|
|
CompiledChunk cch;
|
|
if (ch != null && (cch = ch.getCompiledChunk()) != null && !cch.isLayerEmpty(blockLayerIn)) {
|
|
this.renderContainer.addRenderChunk(ch, blockLayerIn);
|
|
++i;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (i > 0) {
|
|
this.mc.entityRenderer.enableLightmap();
|
|
this.renderContainer.renderChunkLayer(blockLayerIn);
|
|
this.mc.entityRenderer.disableLightmap();
|
|
}
|
|
return i;
|
|
}
|
|
|
|
private void cleanupDamagedBlocks(Iterator<DestroyBlockProgress> iteratorIn) {
|
|
while (iteratorIn.hasNext()) {
|
|
DestroyBlockProgress destroyblockprogress = (DestroyBlockProgress) iteratorIn.next();
|
|
int i = destroyblockprogress.getCreationCloudUpdateTick();
|
|
if (this.cloudTickCounter - i > 400) {
|
|
iteratorIn.remove();
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
public void updateClouds() {
|
|
++this.cloudTickCounter;
|
|
if (this.cloudTickCounter % 20 == 0) {
|
|
this.cleanupDamagedBlocks(this.damagedBlocks.values().iterator());
|
|
}
|
|
|
|
}
|
|
|
|
private void renderSkyEnd() {
|
|
GlStateManager.disableFog();
|
|
GlStateManager.disableAlpha();
|
|
GlStateManager.enableBlend();
|
|
GlStateManager.tryBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 1, 0);
|
|
RenderHelper.disableStandardItemLighting();
|
|
GlStateManager.depthMask(false);
|
|
this.renderEngine.bindTexture(locationEndSkyPng);
|
|
Tessellator tessellator = Tessellator.getInstance();
|
|
WorldRenderer worldrenderer = tessellator.getWorldRenderer();
|
|
|
|
for (int i = 0; i < 6; ++i) {
|
|
GlStateManager.pushMatrix();
|
|
if (i == 1) {
|
|
GlStateManager.rotate(90.0F, 1.0F, 0.0F, 0.0F);
|
|
}
|
|
|
|
if (i == 2) {
|
|
GlStateManager.rotate(-90.0F, 1.0F, 0.0F, 0.0F);
|
|
}
|
|
|
|
if (i == 3) {
|
|
GlStateManager.rotate(180.0F, 1.0F, 0.0F, 0.0F);
|
|
}
|
|
|
|
if (i == 4) {
|
|
GlStateManager.rotate(90.0F, 0.0F, 0.0F, 1.0F);
|
|
}
|
|
|
|
if (i == 5) {
|
|
GlStateManager.rotate(-90.0F, 0.0F, 0.0F, 1.0F);
|
|
}
|
|
|
|
worldrenderer.begin(7, DefaultVertexFormats.POSITION_TEX_COLOR);
|
|
worldrenderer.pos(-100.0D, -100.0D, -100.0D).tex(0.0D, 0.0D).color(40, 40, 40, 255).endVertex();
|
|
worldrenderer.pos(-100.0D, -100.0D, 100.0D).tex(0.0D, 16.0D).color(40, 40, 40, 255).endVertex();
|
|
worldrenderer.pos(100.0D, -100.0D, 100.0D).tex(16.0D, 16.0D).color(40, 40, 40, 255).endVertex();
|
|
worldrenderer.pos(100.0D, -100.0D, -100.0D).tex(16.0D, 0.0D).color(40, 40, 40, 255).endVertex();
|
|
tessellator.draw();
|
|
GlStateManager.popMatrix();
|
|
}
|
|
|
|
GlStateManager.depthMask(true);
|
|
GlStateManager.enableTexture2D();
|
|
GlStateManager.enableAlpha();
|
|
}
|
|
|
|
public void renderSky(float partialTicks, int pass) {
|
|
if (this.mc.theWorld.provider.getDimensionId() == 1) {
|
|
this.renderSkyEnd();
|
|
} else if (this.mc.theWorld.provider.isSurfaceWorld()) {
|
|
GlStateManager.disableTexture2D();
|
|
Vec3 vec3 = this.theWorld.getSkyColor(this.mc.getRenderViewEntity(), partialTicks);
|
|
float f = (float) vec3.xCoord;
|
|
float f1 = (float) vec3.yCoord;
|
|
float f2 = (float) vec3.zCoord;
|
|
if (pass != 2) {
|
|
float f3 = (f * 30.0F + f1 * 59.0F + f2 * 11.0F) / 100.0F;
|
|
float f4 = (f * 30.0F + f1 * 70.0F) / 100.0F;
|
|
float f5 = (f * 30.0F + f2 * 70.0F) / 100.0F;
|
|
f = f3;
|
|
f1 = f4;
|
|
f2 = f5;
|
|
}
|
|
|
|
GlStateManager.color(f, f1, f2);
|
|
Tessellator tessellator = Tessellator.getInstance();
|
|
WorldRenderer worldrenderer = tessellator.getWorldRenderer();
|
|
GlStateManager.depthMask(false);
|
|
GlStateManager.enableFog();
|
|
GlStateManager.color(f, f1, f2);
|
|
GlStateManager.callList(this.glSkyList);
|
|
|
|
GlStateManager.disableFog();
|
|
GlStateManager.disableAlpha();
|
|
GlStateManager.enableBlend();
|
|
GlStateManager.tryBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 1, 0);
|
|
RenderHelper.disableStandardItemLighting();
|
|
float[] afloat = this.theWorld.provider
|
|
.calcSunriseSunsetColors(this.theWorld.getCelestialAngle(partialTicks), partialTicks);
|
|
if (afloat != null) {
|
|
GlStateManager.disableTexture2D();
|
|
GlStateManager.shadeModel(GL_SMOOTH);
|
|
GlStateManager.pushMatrix();
|
|
GlStateManager.rotate(90.0F, 1.0F, 0.0F, 0.0F);
|
|
GlStateManager.rotate(
|
|
MathHelper.sin(this.theWorld.getCelestialAngleRadians(partialTicks)) < 0.0F ? 180.0F : 0.0F,
|
|
0.0F, 0.0F, 1.0F);
|
|
GlStateManager.rotate(90.0F, 0.0F, 0.0F, 1.0F);
|
|
float f6 = afloat[0];
|
|
float f7 = afloat[1];
|
|
float f8 = afloat[2];
|
|
if (pass != 2) {
|
|
float f9 = (f6 * 30.0F + f7 * 59.0F + f8 * 11.0F) / 100.0F;
|
|
float f10 = (f6 * 30.0F + f7 * 70.0F) / 100.0F;
|
|
float f11 = (f6 * 30.0F + f8 * 70.0F) / 100.0F;
|
|
f6 = f9;
|
|
f7 = f10;
|
|
f8 = f11;
|
|
}
|
|
|
|
worldrenderer.begin(6, DefaultVertexFormats.POSITION_COLOR);
|
|
worldrenderer.pos(0.0D, 100.0D, 0.0D).color(f6, f7, f8, afloat[3]).endVertex();
|
|
boolean flag = true;
|
|
|
|
for (int k = 0; k <= 16; ++k) {
|
|
float f21 = (float) k * 3.1415927F * 2.0F / 16.0F;
|
|
float f12 = MathHelper.sin(f21);
|
|
float f13 = MathHelper.cos(f21);
|
|
worldrenderer
|
|
.pos((double) (f12 * 120.0F), (double) (f13 * 120.0F), (double) (f13 * 40.0F * afloat[3]))
|
|
.color(afloat[0], afloat[1], afloat[2], 0.0F).endVertex();
|
|
}
|
|
|
|
tessellator.draw();
|
|
GlStateManager.popMatrix();
|
|
GlStateManager.shadeModel(GL_FLAT);
|
|
}
|
|
|
|
GlStateManager.enableTexture2D();
|
|
GlStateManager.tryBlendFuncSeparate(GL_SRC_ALPHA, 1, 1, 0);
|
|
GlStateManager.pushMatrix();
|
|
float f16 = 1.0F - this.theWorld.getRainStrength(partialTicks);
|
|
GlStateManager.color(1.0F, 1.0F, 1.0F, f16);
|
|
GlStateManager.rotate(-90.0F, 0.0F, 1.0F, 0.0F);
|
|
GlStateManager.rotate(this.theWorld.getCelestialAngle(partialTicks) * 360.0F, 1.0F, 0.0F, 0.0F);
|
|
float f17 = 30.0F;
|
|
this.renderEngine.bindTexture(locationSunPng);
|
|
worldrenderer.begin(7, DefaultVertexFormats.POSITION_TEX);
|
|
worldrenderer.pos((double) (-f17), 100.0D, (double) (-f17)).tex(0.0D, 0.0D).endVertex();
|
|
worldrenderer.pos((double) f17, 100.0D, (double) (-f17)).tex(1.0D, 0.0D).endVertex();
|
|
worldrenderer.pos((double) f17, 100.0D, (double) f17).tex(1.0D, 1.0D).endVertex();
|
|
worldrenderer.pos((double) (-f17), 100.0D, (double) f17).tex(0.0D, 1.0D).endVertex();
|
|
tessellator.draw();
|
|
f17 = 20.0F;
|
|
this.renderEngine.bindTexture(locationMoonPhasesPng);
|
|
int i = this.theWorld.getMoonPhase();
|
|
int j = i % 4;
|
|
int l = i / 4 % 2;
|
|
float f22 = (float) (j + 0) / 4.0F;
|
|
float f23 = (float) (l + 0) / 2.0F;
|
|
float f24 = (float) (j + 1) / 4.0F;
|
|
float f14 = (float) (l + 1) / 2.0F;
|
|
worldrenderer.begin(7, DefaultVertexFormats.POSITION_TEX);
|
|
worldrenderer.pos((double) (-f17), -100.0D, (double) f17).tex((double) f24, (double) f14).endVertex();
|
|
worldrenderer.pos((double) f17, -100.0D, (double) f17).tex((double) f22, (double) f14).endVertex();
|
|
worldrenderer.pos((double) f17, -100.0D, (double) (-f17)).tex((double) f22, (double) f23).endVertex();
|
|
worldrenderer.pos((double) (-f17), -100.0D, (double) (-f17)).tex((double) f24, (double) f23).endVertex();
|
|
tessellator.draw();
|
|
GlStateManager.disableTexture2D();
|
|
float f15 = this.theWorld.getStarBrightness(partialTicks) * f16;
|
|
if (f15 > 0.0F) {
|
|
GlStateManager.color(f15, f15, f15, f15);
|
|
GlStateManager.callList(this.starGLCallList);
|
|
}
|
|
|
|
GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
|
|
GlStateManager.disableBlend();
|
|
GlStateManager.enableAlpha();
|
|
GlStateManager.enableFog();
|
|
GlStateManager.popMatrix();
|
|
GlStateManager.disableTexture2D();
|
|
GlStateManager.color(0.0F, 0.0F, 0.0F);
|
|
double d0 = this.mc.thePlayer.getPositionEyes(partialTicks).yCoord - this.theWorld.getHorizon();
|
|
if (d0 < 0.0D) {
|
|
GlStateManager.pushMatrix();
|
|
GlStateManager.translate(0.0F, 12.0F, 0.0F);
|
|
GlStateManager.callList(this.glSkyList2);
|
|
|
|
GlStateManager.popMatrix();
|
|
float f18 = 1.0F;
|
|
float f19 = -((float) (d0 + 65.0D));
|
|
float f20 = -1.0F;
|
|
worldrenderer.begin(7, DefaultVertexFormats.POSITION_COLOR);
|
|
worldrenderer.pos(-1.0D, (double) f19, 1.0D).color(0, 0, 0, 255).endVertex();
|
|
worldrenderer.pos(1.0D, (double) f19, 1.0D).color(0, 0, 0, 255).endVertex();
|
|
worldrenderer.pos(1.0D, -1.0D, 1.0D).color(0, 0, 0, 255).endVertex();
|
|
worldrenderer.pos(-1.0D, -1.0D, 1.0D).color(0, 0, 0, 255).endVertex();
|
|
worldrenderer.pos(-1.0D, -1.0D, -1.0D).color(0, 0, 0, 255).endVertex();
|
|
worldrenderer.pos(1.0D, -1.0D, -1.0D).color(0, 0, 0, 255).endVertex();
|
|
worldrenderer.pos(1.0D, (double) f19, -1.0D).color(0, 0, 0, 255).endVertex();
|
|
worldrenderer.pos(-1.0D, (double) f19, -1.0D).color(0, 0, 0, 255).endVertex();
|
|
worldrenderer.pos(1.0D, -1.0D, -1.0D).color(0, 0, 0, 255).endVertex();
|
|
worldrenderer.pos(1.0D, -1.0D, 1.0D).color(0, 0, 0, 255).endVertex();
|
|
worldrenderer.pos(1.0D, (double) f19, 1.0D).color(0, 0, 0, 255).endVertex();
|
|
worldrenderer.pos(1.0D, (double) f19, -1.0D).color(0, 0, 0, 255).endVertex();
|
|
worldrenderer.pos(-1.0D, (double) f19, -1.0D).color(0, 0, 0, 255).endVertex();
|
|
worldrenderer.pos(-1.0D, (double) f19, 1.0D).color(0, 0, 0, 255).endVertex();
|
|
worldrenderer.pos(-1.0D, -1.0D, 1.0D).color(0, 0, 0, 255).endVertex();
|
|
worldrenderer.pos(-1.0D, -1.0D, -1.0D).color(0, 0, 0, 255).endVertex();
|
|
worldrenderer.pos(-1.0D, -1.0D, -1.0D).color(0, 0, 0, 255).endVertex();
|
|
worldrenderer.pos(-1.0D, -1.0D, 1.0D).color(0, 0, 0, 255).endVertex();
|
|
worldrenderer.pos(1.0D, -1.0D, 1.0D).color(0, 0, 0, 255).endVertex();
|
|
worldrenderer.pos(1.0D, -1.0D, -1.0D).color(0, 0, 0, 255).endVertex();
|
|
tessellator.draw();
|
|
}
|
|
|
|
if (this.theWorld.provider.isSkyColored()) {
|
|
GlStateManager.color(f * 0.2F + 0.04F, f1 * 0.2F + 0.04F, f2 * 0.6F + 0.1F);
|
|
} else {
|
|
GlStateManager.color(f, f1, f2);
|
|
}
|
|
|
|
GlStateManager.pushMatrix();
|
|
GlStateManager.translate(0.0F, -((float) (d0 - 16.0D)), 0.0F);
|
|
GlStateManager.callList(this.glSkyList2);
|
|
GlStateManager.popMatrix();
|
|
GlStateManager.enableTexture2D();
|
|
GlStateManager.depthMask(true);
|
|
}
|
|
}
|
|
|
|
public void renderClouds(float partialTicks, int pass) {
|
|
if (this.mc.theWorld.provider.isSurfaceWorld()) {
|
|
if (this.mc.gameSettings.func_181147_e() == 2) {
|
|
this.renderCloudsFancy(partialTicks, pass);
|
|
} else {
|
|
GlStateManager.disableCull();
|
|
float f = (float) (this.mc.getRenderViewEntity().lastTickPosY
|
|
+ (this.mc.getRenderViewEntity().posY - this.mc.getRenderViewEntity().lastTickPosY)
|
|
* (double) partialTicks);
|
|
boolean flag = true;
|
|
boolean flag1 = true;
|
|
Tessellator tessellator = Tessellator.getInstance();
|
|
WorldRenderer worldrenderer = tessellator.getWorldRenderer();
|
|
this.renderEngine.bindTexture(locationCloudsPng);
|
|
GlStateManager.enableBlend();
|
|
GlStateManager.tryBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 1, 0);
|
|
Vec3 vec3 = this.theWorld.getCloudColour(partialTicks);
|
|
float f1 = (float) vec3.xCoord;
|
|
float f2 = (float) vec3.yCoord;
|
|
float f3 = (float) vec3.zCoord;
|
|
if (pass != 2) {
|
|
float f4 = (f1 * 30.0F + f2 * 59.0F + f3 * 11.0F) / 100.0F;
|
|
float f5 = (f1 * 30.0F + f2 * 70.0F) / 100.0F;
|
|
float f6 = (f1 * 30.0F + f3 * 70.0F) / 100.0F;
|
|
f1 = f4;
|
|
f2 = f5;
|
|
f3 = f6;
|
|
}
|
|
|
|
float f10 = 4.8828125E-4F;
|
|
double d2 = (double) ((float) this.cloudTickCounter + partialTicks);
|
|
double d0 = this.mc.getRenderViewEntity().prevPosX
|
|
+ (this.mc.getRenderViewEntity().posX - this.mc.getRenderViewEntity().prevPosX)
|
|
* (double) partialTicks
|
|
+ d2 * 0.029999999329447746D;
|
|
double d1 = this.mc.getRenderViewEntity().prevPosZ
|
|
+ (this.mc.getRenderViewEntity().posZ - this.mc.getRenderViewEntity().prevPosZ)
|
|
* (double) partialTicks;
|
|
int i = MathHelper.floor_double(d0 / 2048.0D);
|
|
int j = MathHelper.floor_double(d1 / 2048.0D);
|
|
d0 = d0 - (double) (i * 2048);
|
|
d1 = d1 - (double) (j * 2048);
|
|
float f7 = this.theWorld.provider.getCloudHeight() - f + 0.33F;
|
|
float f8 = (float) (d0 * 4.8828125E-4D);
|
|
float f9 = (float) (d1 * 4.8828125E-4D);
|
|
worldrenderer.begin(7, DefaultVertexFormats.POSITION_TEX_COLOR);
|
|
|
|
for (int k = -256; k < 256; k += 32) {
|
|
for (int l = -256; l < 256; l += 32) {
|
|
worldrenderer.pos((double) (k + 0), (double) f7, (double) (l + 32))
|
|
.tex((double) ((float) (k + 0) * 4.8828125E-4F + f8),
|
|
(double) ((float) (l + 32) * 4.8828125E-4F + f9))
|
|
.color(f1, f2, f3, 0.8F).endVertex();
|
|
worldrenderer.pos((double) (k + 32), (double) f7, (double) (l + 32))
|
|
.tex((double) ((float) (k + 32) * 4.8828125E-4F + f8),
|
|
(double) ((float) (l + 32) * 4.8828125E-4F + f9))
|
|
.color(f1, f2, f3, 0.8F).endVertex();
|
|
worldrenderer.pos((double) (k + 32), (double) f7, (double) (l + 0))
|
|
.tex((double) ((float) (k + 32) * 4.8828125E-4F + f8),
|
|
(double) ((float) (l + 0) * 4.8828125E-4F + f9))
|
|
.color(f1, f2, f3, 0.8F).endVertex();
|
|
worldrenderer.pos((double) (k + 0), (double) f7, (double) (l + 0))
|
|
.tex((double) ((float) (k + 0) * 4.8828125E-4F + f8),
|
|
(double) ((float) (l + 0) * 4.8828125E-4F + f9))
|
|
.color(f1, f2, f3, 0.8F).endVertex();
|
|
}
|
|
}
|
|
|
|
tessellator.draw();
|
|
GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
|
|
GlStateManager.disableBlend();
|
|
GlStateManager.enableCull();
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* +
|
|
* Checks if the given position is to be rendered with cloud fog
|
|
*/
|
|
public boolean hasCloudFog(double x, double y, double z, float partialTicks) {
|
|
return false;
|
|
}
|
|
|
|
private void renderCloudsFancy(float partialTicks, int pass) {
|
|
GlStateManager.disableCull();
|
|
float f = (float) (this.mc.getRenderViewEntity().lastTickPosY
|
|
+ (this.mc.getRenderViewEntity().posY - this.mc.getRenderViewEntity().lastTickPosY)
|
|
* (double) partialTicks);
|
|
Tessellator tessellator = Tessellator.getInstance();
|
|
WorldRenderer worldrenderer = tessellator.getWorldRenderer();
|
|
float f1 = 12.0F;
|
|
float f2 = 4.0F;
|
|
double d0 = (double) ((float) this.cloudTickCounter + partialTicks);
|
|
double d1 = (this.mc.getRenderViewEntity().prevPosX
|
|
+ (this.mc.getRenderViewEntity().posX - this.mc.getRenderViewEntity().prevPosX) * (double) partialTicks
|
|
+ d0 * 0.029999999329447746D) / 12.0D;
|
|
double d2 = (this.mc.getRenderViewEntity().prevPosZ
|
|
+ (this.mc.getRenderViewEntity().posZ - this.mc.getRenderViewEntity().prevPosZ) * (double) partialTicks)
|
|
/ 12.0D + 0.33000001311302185D;
|
|
float f3 = this.theWorld.provider.getCloudHeight() - f + 0.33F;
|
|
int i = MathHelper.floor_double(d1 / 2048.0D);
|
|
int j = MathHelper.floor_double(d2 / 2048.0D);
|
|
d1 = d1 - (double) (i * 2048);
|
|
d2 = d2 - (double) (j * 2048);
|
|
this.renderEngine.bindTexture(locationCloudsPng);
|
|
GlStateManager.enableBlend();
|
|
GlStateManager.tryBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 1, 0);
|
|
Vec3 vec3 = this.theWorld.getCloudColour(partialTicks);
|
|
float f4 = (float) vec3.xCoord;
|
|
float f5 = (float) vec3.yCoord;
|
|
float f6 = (float) vec3.zCoord;
|
|
if (pass != 2) {
|
|
float f7 = (f4 * 30.0F + f5 * 59.0F + f6 * 11.0F) / 100.0F;
|
|
float f8 = (f4 * 30.0F + f5 * 70.0F) / 100.0F;
|
|
float f9 = (f4 * 30.0F + f6 * 70.0F) / 100.0F;
|
|
f4 = f7;
|
|
f5 = f8;
|
|
f6 = f9;
|
|
}
|
|
|
|
float f26 = f4 * 0.9F;
|
|
float f27 = f5 * 0.9F;
|
|
float f28 = f6 * 0.9F;
|
|
float f10 = f4 * 0.7F;
|
|
float f11 = f5 * 0.7F;
|
|
float f12 = f6 * 0.7F;
|
|
float f13 = f4 * 0.8F;
|
|
float f14 = f5 * 0.8F;
|
|
float f15 = f6 * 0.8F;
|
|
float f16 = 0.00390625F;
|
|
float f17 = (float) MathHelper.floor_double(d1) * 0.00390625F;
|
|
float f18 = (float) MathHelper.floor_double(d2) * 0.00390625F;
|
|
float f19 = (float) (d1 - (double) MathHelper.floor_double(d1));
|
|
float f20 = (float) (d2 - (double) MathHelper.floor_double(d2));
|
|
boolean flag = true;
|
|
boolean flag1 = true;
|
|
float f21 = 9.765625E-4F;
|
|
GlStateManager.scale(12.0F, 1.0F, 12.0F);
|
|
|
|
for (int k = 0; k < 2; ++k) {
|
|
if (k == 0) {
|
|
GlStateManager.colorMask(false, false, false, false);
|
|
} else {
|
|
switch (pass) {
|
|
case 0:
|
|
GlStateManager.colorMask(false, true, true, true);
|
|
break;
|
|
case 1:
|
|
GlStateManager.colorMask(true, false, false, true);
|
|
break;
|
|
case 2:
|
|
GlStateManager.colorMask(true, true, true, true);
|
|
}
|
|
}
|
|
|
|
for (int l = -3; l <= 4; ++l) {
|
|
for (int i1 = -3; i1 <= 4; ++i1) {
|
|
worldrenderer.begin(7, DefaultVertexFormats.POSITION_TEX_COLOR_NORMAL);
|
|
float f22 = (float) (l * 8);
|
|
float f23 = (float) (i1 * 8);
|
|
float f24 = f22 - f19;
|
|
float f25 = f23 - f20;
|
|
if (f3 > -5.0F) {
|
|
worldrenderer.pos((double) (f24 + 0.0F), (double) (f3 + 0.0F), (double) (f25 + 8.0F))
|
|
.tex((double) ((f22 + 0.0F) * 0.00390625F + f17),
|
|
(double) ((f23 + 8.0F) * 0.00390625F + f18))
|
|
.color(f10, f11, f12, 0.8F).normal(0.0F, -1.0F, 0.0F).endVertex();
|
|
worldrenderer.pos((double) (f24 + 8.0F), (double) (f3 + 0.0F), (double) (f25 + 8.0F))
|
|
.tex((double) ((f22 + 8.0F) * 0.00390625F + f17),
|
|
(double) ((f23 + 8.0F) * 0.00390625F + f18))
|
|
.color(f10, f11, f12, 0.8F).normal(0.0F, -1.0F, 0.0F).endVertex();
|
|
worldrenderer.pos((double) (f24 + 8.0F), (double) (f3 + 0.0F), (double) (f25 + 0.0F))
|
|
.tex((double) ((f22 + 8.0F) * 0.00390625F + f17),
|
|
(double) ((f23 + 0.0F) * 0.00390625F + f18))
|
|
.color(f10, f11, f12, 0.8F).normal(0.0F, -1.0F, 0.0F).endVertex();
|
|
worldrenderer.pos((double) (f24 + 0.0F), (double) (f3 + 0.0F), (double) (f25 + 0.0F))
|
|
.tex((double) ((f22 + 0.0F) * 0.00390625F + f17),
|
|
(double) ((f23 + 0.0F) * 0.00390625F + f18))
|
|
.color(f10, f11, f12, 0.8F).normal(0.0F, -1.0F, 0.0F).endVertex();
|
|
}
|
|
|
|
if (f3 <= 5.0F) {
|
|
worldrenderer
|
|
.pos((double) (f24 + 0.0F), (double) (f3 + 4.0F - 9.765625E-4F), (double) (f25 + 8.0F))
|
|
.tex((double) ((f22 + 0.0F) * 0.00390625F + f17),
|
|
(double) ((f23 + 8.0F) * 0.00390625F + f18))
|
|
.color(f4, f5, f6, 0.8F).normal(0.0F, 1.0F, 0.0F).endVertex();
|
|
worldrenderer
|
|
.pos((double) (f24 + 8.0F), (double) (f3 + 4.0F - 9.765625E-4F), (double) (f25 + 8.0F))
|
|
.tex((double) ((f22 + 8.0F) * 0.00390625F + f17),
|
|
(double) ((f23 + 8.0F) * 0.00390625F + f18))
|
|
.color(f4, f5, f6, 0.8F).normal(0.0F, 1.0F, 0.0F).endVertex();
|
|
worldrenderer
|
|
.pos((double) (f24 + 8.0F), (double) (f3 + 4.0F - 9.765625E-4F), (double) (f25 + 0.0F))
|
|
.tex((double) ((f22 + 8.0F) * 0.00390625F + f17),
|
|
(double) ((f23 + 0.0F) * 0.00390625F + f18))
|
|
.color(f4, f5, f6, 0.8F).normal(0.0F, 1.0F, 0.0F).endVertex();
|
|
worldrenderer
|
|
.pos((double) (f24 + 0.0F), (double) (f3 + 4.0F - 9.765625E-4F), (double) (f25 + 0.0F))
|
|
.tex((double) ((f22 + 0.0F) * 0.00390625F + f17),
|
|
(double) ((f23 + 0.0F) * 0.00390625F + f18))
|
|
.color(f4, f5, f6, 0.8F).normal(0.0F, 1.0F, 0.0F).endVertex();
|
|
}
|
|
|
|
if (l > -1) {
|
|
for (int j1 = 0; j1 < 8; ++j1) {
|
|
worldrenderer
|
|
.pos((double) (f24 + (float) j1 + 0.0F), (double) (f3 + 0.0F),
|
|
(double) (f25 + 8.0F))
|
|
.tex((double) ((f22 + (float) j1 + 0.5F) * 0.00390625F + f17),
|
|
(double) ((f23 + 8.0F) * 0.00390625F + f18))
|
|
.color(f26, f27, f28, 0.8F).normal(-1.0F, 0.0F, 0.0F).endVertex();
|
|
worldrenderer
|
|
.pos((double) (f24 + (float) j1 + 0.0F), (double) (f3 + 4.0F),
|
|
(double) (f25 + 8.0F))
|
|
.tex((double) ((f22 + (float) j1 + 0.5F) * 0.00390625F + f17),
|
|
(double) ((f23 + 8.0F) * 0.00390625F + f18))
|
|
.color(f26, f27, f28, 0.8F).normal(-1.0F, 0.0F, 0.0F).endVertex();
|
|
worldrenderer
|
|
.pos((double) (f24 + (float) j1 + 0.0F), (double) (f3 + 4.0F),
|
|
(double) (f25 + 0.0F))
|
|
.tex((double) ((f22 + (float) j1 + 0.5F) * 0.00390625F + f17),
|
|
(double) ((f23 + 0.0F) * 0.00390625F + f18))
|
|
.color(f26, f27, f28, 0.8F).normal(-1.0F, 0.0F, 0.0F).endVertex();
|
|
worldrenderer
|
|
.pos((double) (f24 + (float) j1 + 0.0F), (double) (f3 + 0.0F),
|
|
(double) (f25 + 0.0F))
|
|
.tex((double) ((f22 + (float) j1 + 0.5F) * 0.00390625F + f17),
|
|
(double) ((f23 + 0.0F) * 0.00390625F + f18))
|
|
.color(f26, f27, f28, 0.8F).normal(-1.0F, 0.0F, 0.0F).endVertex();
|
|
}
|
|
}
|
|
|
|
if (l <= 1) {
|
|
for (int k1 = 0; k1 < 8; ++k1) {
|
|
worldrenderer
|
|
.pos((double) (f24 + (float) k1 + 1.0F - 9.765625E-4F), (double) (f3 + 0.0F),
|
|
(double) (f25 + 8.0F))
|
|
.tex((double) ((f22 + (float) k1 + 0.5F) * 0.00390625F + f17),
|
|
(double) ((f23 + 8.0F) * 0.00390625F + f18))
|
|
.color(f26, f27, f28, 0.8F).normal(1.0F, 0.0F, 0.0F).endVertex();
|
|
worldrenderer
|
|
.pos((double) (f24 + (float) k1 + 1.0F - 9.765625E-4F), (double) (f3 + 4.0F),
|
|
(double) (f25 + 8.0F))
|
|
.tex((double) ((f22 + (float) k1 + 0.5F) * 0.00390625F + f17),
|
|
(double) ((f23 + 8.0F) * 0.00390625F + f18))
|
|
.color(f26, f27, f28, 0.8F).normal(1.0F, 0.0F, 0.0F).endVertex();
|
|
worldrenderer
|
|
.pos((double) (f24 + (float) k1 + 1.0F - 9.765625E-4F), (double) (f3 + 4.0F),
|
|
(double) (f25 + 0.0F))
|
|
.tex((double) ((f22 + (float) k1 + 0.5F) * 0.00390625F + f17),
|
|
(double) ((f23 + 0.0F) * 0.00390625F + f18))
|
|
.color(f26, f27, f28, 0.8F).normal(1.0F, 0.0F, 0.0F).endVertex();
|
|
worldrenderer
|
|
.pos((double) (f24 + (float) k1 + 1.0F - 9.765625E-4F), (double) (f3 + 0.0F),
|
|
(double) (f25 + 0.0F))
|
|
.tex((double) ((f22 + (float) k1 + 0.5F) * 0.00390625F + f17),
|
|
(double) ((f23 + 0.0F) * 0.00390625F + f18))
|
|
.color(f26, f27, f28, 0.8F).normal(1.0F, 0.0F, 0.0F).endVertex();
|
|
}
|
|
}
|
|
|
|
if (i1 > -1) {
|
|
for (int l1 = 0; l1 < 8; ++l1) {
|
|
worldrenderer
|
|
.pos((double) (f24 + 0.0F), (double) (f3 + 4.0F),
|
|
(double) (f25 + (float) l1 + 0.0F))
|
|
.tex((double) ((f22 + 0.0F) * 0.00390625F + f17),
|
|
(double) ((f23 + (float) l1 + 0.5F) * 0.00390625F + f18))
|
|
.color(f13, f14, f15, 0.8F).normal(0.0F, 0.0F, -1.0F).endVertex();
|
|
worldrenderer
|
|
.pos((double) (f24 + 8.0F), (double) (f3 + 4.0F),
|
|
(double) (f25 + (float) l1 + 0.0F))
|
|
.tex((double) ((f22 + 8.0F) * 0.00390625F + f17),
|
|
(double) ((f23 + (float) l1 + 0.5F) * 0.00390625F + f18))
|
|
.color(f13, f14, f15, 0.8F).normal(0.0F, 0.0F, -1.0F).endVertex();
|
|
worldrenderer
|
|
.pos((double) (f24 + 8.0F), (double) (f3 + 0.0F),
|
|
(double) (f25 + (float) l1 + 0.0F))
|
|
.tex((double) ((f22 + 8.0F) * 0.00390625F + f17),
|
|
(double) ((f23 + (float) l1 + 0.5F) * 0.00390625F + f18))
|
|
.color(f13, f14, f15, 0.8F).normal(0.0F, 0.0F, -1.0F).endVertex();
|
|
worldrenderer
|
|
.pos((double) (f24 + 0.0F), (double) (f3 + 0.0F),
|
|
(double) (f25 + (float) l1 + 0.0F))
|
|
.tex((double) ((f22 + 0.0F) * 0.00390625F + f17),
|
|
(double) ((f23 + (float) l1 + 0.5F) * 0.00390625F + f18))
|
|
.color(f13, f14, f15, 0.8F).normal(0.0F, 0.0F, -1.0F).endVertex();
|
|
}
|
|
}
|
|
|
|
if (i1 <= 1) {
|
|
for (int i2 = 0; i2 < 8; ++i2) {
|
|
worldrenderer
|
|
.pos((double) (f24 + 0.0F), (double) (f3 + 4.0F),
|
|
(double) (f25 + (float) i2 + 1.0F - 9.765625E-4F))
|
|
.tex((double) ((f22 + 0.0F) * 0.00390625F + f17),
|
|
(double) ((f23 + (float) i2 + 0.5F) * 0.00390625F + f18))
|
|
.color(f13, f14, f15, 0.8F).normal(0.0F, 0.0F, 1.0F).endVertex();
|
|
worldrenderer
|
|
.pos((double) (f24 + 8.0F), (double) (f3 + 4.0F),
|
|
(double) (f25 + (float) i2 + 1.0F - 9.765625E-4F))
|
|
.tex((double) ((f22 + 8.0F) * 0.00390625F + f17),
|
|
(double) ((f23 + (float) i2 + 0.5F) * 0.00390625F + f18))
|
|
.color(f13, f14, f15, 0.8F).normal(0.0F, 0.0F, 1.0F).endVertex();
|
|
worldrenderer
|
|
.pos((double) (f24 + 8.0F), (double) (f3 + 0.0F),
|
|
(double) (f25 + (float) i2 + 1.0F - 9.765625E-4F))
|
|
.tex((double) ((f22 + 8.0F) * 0.00390625F + f17),
|
|
(double) ((f23 + (float) i2 + 0.5F) * 0.00390625F + f18))
|
|
.color(f13, f14, f15, 0.8F).normal(0.0F, 0.0F, 1.0F).endVertex();
|
|
worldrenderer
|
|
.pos((double) (f24 + 0.0F), (double) (f3 + 0.0F),
|
|
(double) (f25 + (float) i2 + 1.0F - 9.765625E-4F))
|
|
.tex((double) ((f22 + 0.0F) * 0.00390625F + f17),
|
|
(double) ((f23 + (float) i2 + 0.5F) * 0.00390625F + f18))
|
|
.color(f13, f14, f15, 0.8F).normal(0.0F, 0.0F, 1.0F).endVertex();
|
|
}
|
|
}
|
|
|
|
tessellator.draw();
|
|
}
|
|
}
|
|
}
|
|
|
|
GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
|
|
GlStateManager.disableBlend();
|
|
GlStateManager.enableCull();
|
|
}
|
|
|
|
public void updateChunks(long finishTimeNano) {
|
|
this.displayListEntitiesDirty |= this.renderDispatcher.updateChunks(finishTimeNano);
|
|
if (!this.chunksToUpdate.isEmpty()) {
|
|
Iterator iterator = this.chunksToUpdate.iterator();
|
|
|
|
while (iterator.hasNext()) {
|
|
RenderChunk renderchunk = (RenderChunk) iterator.next();
|
|
if (!this.renderDispatcher.updateChunkLater(renderchunk)) {
|
|
break;
|
|
}
|
|
|
|
renderchunk.setNeedsUpdate(false);
|
|
iterator.remove();
|
|
long i = finishTimeNano - EagRuntime.nanoTime();
|
|
if (i < 0L) {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public void renderWorldBorder(Entity partialTicks, float parFloat1) {
|
|
Tessellator tessellator = Tessellator.getInstance();
|
|
WorldRenderer worldrenderer = tessellator.getWorldRenderer();
|
|
WorldBorder worldborder = this.theWorld.getWorldBorder();
|
|
double d0 = (double) (this.mc.gameSettings.renderDistanceChunks * 16);
|
|
if (partialTicks.posX >= worldborder.maxX() - d0 || partialTicks.posX <= worldborder.minX() + d0
|
|
|| partialTicks.posZ >= worldborder.maxZ() - d0 || partialTicks.posZ <= worldborder.minZ() + d0) {
|
|
double d1 = 1.0D - worldborder.getClosestDistance(partialTicks) / d0;
|
|
d1 = Math.pow(d1, 4.0D);
|
|
double d2 = partialTicks.lastTickPosX
|
|
+ (partialTicks.posX - partialTicks.lastTickPosX) * (double) parFloat1;
|
|
double d3 = partialTicks.lastTickPosY
|
|
+ (partialTicks.posY - partialTicks.lastTickPosY) * (double) parFloat1;
|
|
double d4 = partialTicks.lastTickPosZ
|
|
+ (partialTicks.posZ - partialTicks.lastTickPosZ) * (double) parFloat1;
|
|
GlStateManager.enableBlend();
|
|
GlStateManager.tryBlendFuncSeparate(GL_SRC_ALPHA, 1, 1, 0);
|
|
this.renderEngine.bindTexture(locationForcefieldPng);
|
|
GlStateManager.depthMask(false);
|
|
GlStateManager.pushMatrix();
|
|
int i = worldborder.getStatus().getID();
|
|
float f = (float) (i >> 16 & 255) / 255.0F;
|
|
float f1 = (float) (i >> 8 & 255) / 255.0F;
|
|
float f2 = (float) (i & 255) / 255.0F;
|
|
GlStateManager.color(f, f1, f2, (float) d1);
|
|
GlStateManager.doPolygonOffset(-3.0F, -3.0F);
|
|
GlStateManager.enablePolygonOffset();
|
|
GlStateManager.alphaFunc(GL_GREATER, 0.1F);
|
|
GlStateManager.enableAlpha();
|
|
GlStateManager.disableCull();
|
|
float f3 = (float) (Minecraft.getSystemTime() % 3000L) / 3000.0F;
|
|
float f4 = 0.0F;
|
|
float f5 = 0.0F;
|
|
float f6 = 128.0F;
|
|
worldrenderer.begin(7, DefaultVertexFormats.POSITION_TEX);
|
|
worldrenderer.setTranslation(-d2, -d3, -d4);
|
|
double d5 = Math.max((double) MathHelper.floor_double(d4 - d0), worldborder.minZ());
|
|
double d6 = Math.min((double) MathHelper.ceiling_double_int(d4 + d0), worldborder.maxZ());
|
|
if (d2 > worldborder.maxX() - d0) {
|
|
float f7 = 0.0F;
|
|
|
|
for (double d7 = d5; d7 < d6; f7 += 0.5F) {
|
|
double d8 = Math.min(1.0D, d6 - d7);
|
|
float f8 = (float) d8 * 0.5F;
|
|
worldrenderer.pos(worldborder.maxX(), 256.0D, d7).tex((double) (f3 + f7), (double) (f3 + 0.0F))
|
|
.endVertex();
|
|
worldrenderer.pos(worldborder.maxX(), 256.0D, d7 + d8)
|
|
.tex((double) (f3 + f8 + f7), (double) (f3 + 0.0F)).endVertex();
|
|
worldrenderer.pos(worldborder.maxX(), 0.0D, d7 + d8)
|
|
.tex((double) (f3 + f8 + f7), (double) (f3 + 128.0F)).endVertex();
|
|
worldrenderer.pos(worldborder.maxX(), 0.0D, d7).tex((double) (f3 + f7), (double) (f3 + 128.0F))
|
|
.endVertex();
|
|
++d7;
|
|
}
|
|
}
|
|
|
|
if (d2 < worldborder.minX() + d0) {
|
|
float f9 = 0.0F;
|
|
|
|
for (double d9 = d5; d9 < d6; f9 += 0.5F) {
|
|
double d12 = Math.min(1.0D, d6 - d9);
|
|
float f12 = (float) d12 * 0.5F;
|
|
worldrenderer.pos(worldborder.minX(), 256.0D, d9).tex((double) (f3 + f9), (double) (f3 + 0.0F))
|
|
.endVertex();
|
|
worldrenderer.pos(worldborder.minX(), 256.0D, d9 + d12)
|
|
.tex((double) (f3 + f12 + f9), (double) (f3 + 0.0F)).endVertex();
|
|
worldrenderer.pos(worldborder.minX(), 0.0D, d9 + d12)
|
|
.tex((double) (f3 + f12 + f9), (double) (f3 + 128.0F)).endVertex();
|
|
worldrenderer.pos(worldborder.minX(), 0.0D, d9).tex((double) (f3 + f9), (double) (f3 + 128.0F))
|
|
.endVertex();
|
|
++d9;
|
|
}
|
|
}
|
|
|
|
d5 = Math.max((double) MathHelper.floor_double(d2 - d0), worldborder.minX());
|
|
d6 = Math.min((double) MathHelper.ceiling_double_int(d2 + d0), worldborder.maxX());
|
|
if (d4 > worldborder.maxZ() - d0) {
|
|
float f10 = 0.0F;
|
|
|
|
for (double d10 = d5; d10 < d6; f10 += 0.5F) {
|
|
double d13 = Math.min(1.0D, d6 - d10);
|
|
float f13 = (float) d13 * 0.5F;
|
|
worldrenderer.pos(d10, 256.0D, worldborder.maxZ()).tex((double) (f3 + f10), (double) (f3 + 0.0F))
|
|
.endVertex();
|
|
worldrenderer.pos(d10 + d13, 256.0D, worldborder.maxZ())
|
|
.tex((double) (f3 + f13 + f10), (double) (f3 + 0.0F)).endVertex();
|
|
worldrenderer.pos(d10 + d13, 0.0D, worldborder.maxZ())
|
|
.tex((double) (f3 + f13 + f10), (double) (f3 + 128.0F)).endVertex();
|
|
worldrenderer.pos(d10, 0.0D, worldborder.maxZ()).tex((double) (f3 + f10), (double) (f3 + 128.0F))
|
|
.endVertex();
|
|
++d10;
|
|
}
|
|
}
|
|
|
|
if (d4 < worldborder.minZ() + d0) {
|
|
float f11 = 0.0F;
|
|
|
|
for (double d11 = d5; d11 < d6; f11 += 0.5F) {
|
|
double d14 = Math.min(1.0D, d6 - d11);
|
|
float f14 = (float) d14 * 0.5F;
|
|
worldrenderer.pos(d11, 256.0D, worldborder.minZ()).tex((double) (f3 + f11), (double) (f3 + 0.0F))
|
|
.endVertex();
|
|
worldrenderer.pos(d11 + d14, 256.0D, worldborder.minZ())
|
|
.tex((double) (f3 + f14 + f11), (double) (f3 + 0.0F)).endVertex();
|
|
worldrenderer.pos(d11 + d14, 0.0D, worldborder.minZ())
|
|
.tex((double) (f3 + f14 + f11), (double) (f3 + 128.0F)).endVertex();
|
|
worldrenderer.pos(d11, 0.0D, worldborder.minZ()).tex((double) (f3 + f11), (double) (f3 + 128.0F))
|
|
.endVertex();
|
|
++d11;
|
|
}
|
|
}
|
|
|
|
tessellator.draw();
|
|
worldrenderer.setTranslation(0.0D, 0.0D, 0.0D);
|
|
GlStateManager.enableCull();
|
|
GlStateManager.disableAlpha();
|
|
GlStateManager.doPolygonOffset(0.0F, 0.0F);
|
|
GlStateManager.disablePolygonOffset();
|
|
GlStateManager.enableAlpha();
|
|
GlStateManager.disableBlend();
|
|
GlStateManager.popMatrix();
|
|
GlStateManager.depthMask(true);
|
|
}
|
|
}
|
|
|
|
private void preRenderDamagedBlocks() {
|
|
GlStateManager.tryBlendFuncSeparate(GL_DST_COLOR, GL_SRC_COLOR, 1, 0);
|
|
GlStateManager.enableBlend();
|
|
GlStateManager.color(1.0F, 1.0F, 1.0F, 0.5F);
|
|
GlStateManager.doPolygonOffset(-3.0F, -3.0F);
|
|
GlStateManager.enablePolygonOffset();
|
|
GlStateManager.alphaFunc(GL_GREATER, 0.1F);
|
|
GlStateManager.enableAlpha();
|
|
GlStateManager.pushMatrix();
|
|
}
|
|
|
|
private void postRenderDamagedBlocks() {
|
|
GlStateManager.disableAlpha();
|
|
GlStateManager.doPolygonOffset(0.0F, 0.0F);
|
|
GlStateManager.disablePolygonOffset();
|
|
GlStateManager.enableAlpha();
|
|
GlStateManager.depthMask(true);
|
|
GlStateManager.popMatrix();
|
|
}
|
|
|
|
public void drawBlockDamageTexture(Tessellator tessellatorIn, WorldRenderer worldRendererIn, Entity entityIn,
|
|
float partialTicks) {
|
|
double d0 = entityIn.lastTickPosX + (entityIn.posX - entityIn.lastTickPosX) * (double) partialTicks;
|
|
double d1 = entityIn.lastTickPosY + (entityIn.posY - entityIn.lastTickPosY) * (double) partialTicks;
|
|
double d2 = entityIn.lastTickPosZ + (entityIn.posZ - entityIn.lastTickPosZ) * (double) partialTicks;
|
|
if (!this.damagedBlocks.isEmpty()) {
|
|
this.renderEngine.bindTexture(TextureMap.locationBlocksTexture);
|
|
this.preRenderDamagedBlocks();
|
|
worldRendererIn.begin(7,
|
|
(DeferredStateManager.isDeferredRenderer() || DynamicLightsStateManager.isDynamicLightsRender())
|
|
? VertexFormat.BLOCK_SHADERS
|
|
: DefaultVertexFormats.BLOCK);
|
|
worldRendererIn.setTranslation(-d0, -d1, -d2);
|
|
worldRendererIn.markDirty();
|
|
Iterator iterator = this.damagedBlocks.values().iterator();
|
|
|
|
while (iterator.hasNext()) {
|
|
DestroyBlockProgress destroyblockprogress = (DestroyBlockProgress) iterator.next();
|
|
BlockPos blockpos = destroyblockprogress.getPosition();
|
|
double d3 = (double) blockpos.getX() - d0;
|
|
double d4 = (double) blockpos.getY() - d1;
|
|
double d5 = (double) blockpos.getZ() - d2;
|
|
Block block = this.theWorld.getBlockState(blockpos).getBlock();
|
|
if (!(block instanceof BlockChest) && !(block instanceof BlockEnderChest)
|
|
&& !(block instanceof BlockSign) && !(block instanceof BlockSkull)) {
|
|
if (d3 * d3 + d4 * d4 + d5 * d5 > 1024.0D) {
|
|
iterator.remove();
|
|
} else {
|
|
IBlockState iblockstate = this.theWorld.getBlockState(blockpos);
|
|
if (iblockstate.getBlock().getMaterial() != Material.air) {
|
|
int i = destroyblockprogress.getPartialBlockDamage();
|
|
EaglerTextureAtlasSprite textureatlassprite = this.destroyBlockIcons[i];
|
|
BlockRendererDispatcher blockrendererdispatcher = this.mc.getBlockRendererDispatcher();
|
|
if (DynamicLightsStateManager.isInDynamicLightsPass()) {
|
|
DynamicLightsStateManager.reportForwardRenderObjectPosition2(blockpos.x, blockpos.y,
|
|
blockpos.z);
|
|
}
|
|
blockrendererdispatcher.renderBlockDamage(iblockstate, blockpos, textureatlassprite,
|
|
this.theWorld);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
tessellatorIn.draw();
|
|
worldRendererIn.setTranslation(0.0D, 0.0D, 0.0D);
|
|
this.postRenderDamagedBlocks();
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
* +
|
|
* Draws the selection box for the player. Args: entityPlayer,
|
|
* rayTraceHit, i, itemStack, partialTickTime
|
|
*/
|
|
public void drawSelectionBox(EntityPlayer player, MovingObjectPosition movingObjectPositionIn, int partialTicks,
|
|
float parFloat1) {
|
|
if (partialTicks == 0 && movingObjectPositionIn != null
|
|
&& movingObjectPositionIn.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) {
|
|
GlStateManager.enableBlend();
|
|
GlStateManager.tryBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 1, 0);
|
|
GlStateManager.color(0.0F, 0.0F, 0.0F, 0.4F);
|
|
EaglercraftGPU.glLineWidth(2.0F);
|
|
GlStateManager.disableTexture2D();
|
|
GlStateManager.depthMask(false);
|
|
float f = 0.002F;
|
|
BlockPos blockpos = movingObjectPositionIn.getBlockPos();
|
|
Block block = this.theWorld.getBlockState(blockpos).getBlock();
|
|
if (block.getMaterial() != Material.air && this.theWorld.getWorldBorder().contains(blockpos)) {
|
|
block.setBlockBoundsBasedOnState(this.theWorld, blockpos);
|
|
double d0 = player.lastTickPosX + (player.posX - player.lastTickPosX) * (double) parFloat1;
|
|
double d1 = player.lastTickPosY + (player.posY - player.lastTickPosY) * (double) parFloat1;
|
|
double d2 = player.lastTickPosZ + (player.posZ - player.lastTickPosZ) * (double) parFloat1;
|
|
func_181561_a(block.getSelectedBoundingBox(this.theWorld, blockpos)
|
|
.expand(0.0020000000949949026D, 0.0020000000949949026D, 0.0020000000949949026D)
|
|
.offset(-d0, -d1, -d2));
|
|
}
|
|
|
|
GlStateManager.depthMask(true);
|
|
GlStateManager.enableTexture2D();
|
|
GlStateManager.disableBlend();
|
|
}
|
|
|
|
}
|
|
|
|
public static void func_181561_a(AxisAlignedBB parAxisAlignedBB) {
|
|
Tessellator tessellator = Tessellator.getInstance();
|
|
WorldRenderer worldrenderer = tessellator.getWorldRenderer();
|
|
worldrenderer.begin(3, DefaultVertexFormats.POSITION);
|
|
worldrenderer.pos(parAxisAlignedBB.minX, parAxisAlignedBB.minY, parAxisAlignedBB.minZ).endVertex();
|
|
worldrenderer.pos(parAxisAlignedBB.maxX, parAxisAlignedBB.minY, parAxisAlignedBB.minZ).endVertex();
|
|
worldrenderer.pos(parAxisAlignedBB.maxX, parAxisAlignedBB.minY, parAxisAlignedBB.maxZ).endVertex();
|
|
worldrenderer.pos(parAxisAlignedBB.minX, parAxisAlignedBB.minY, parAxisAlignedBB.maxZ).endVertex();
|
|
worldrenderer.pos(parAxisAlignedBB.minX, parAxisAlignedBB.minY, parAxisAlignedBB.minZ).endVertex();
|
|
tessellator.draw();
|
|
worldrenderer.begin(3, DefaultVertexFormats.POSITION);
|
|
worldrenderer.pos(parAxisAlignedBB.minX, parAxisAlignedBB.maxY, parAxisAlignedBB.minZ).endVertex();
|
|
worldrenderer.pos(parAxisAlignedBB.maxX, parAxisAlignedBB.maxY, parAxisAlignedBB.minZ).endVertex();
|
|
worldrenderer.pos(parAxisAlignedBB.maxX, parAxisAlignedBB.maxY, parAxisAlignedBB.maxZ).endVertex();
|
|
worldrenderer.pos(parAxisAlignedBB.minX, parAxisAlignedBB.maxY, parAxisAlignedBB.maxZ).endVertex();
|
|
worldrenderer.pos(parAxisAlignedBB.minX, parAxisAlignedBB.maxY, parAxisAlignedBB.minZ).endVertex();
|
|
tessellator.draw();
|
|
worldrenderer.begin(1, DefaultVertexFormats.POSITION);
|
|
worldrenderer.pos(parAxisAlignedBB.minX, parAxisAlignedBB.minY, parAxisAlignedBB.minZ).endVertex();
|
|
worldrenderer.pos(parAxisAlignedBB.minX, parAxisAlignedBB.maxY, parAxisAlignedBB.minZ).endVertex();
|
|
worldrenderer.pos(parAxisAlignedBB.maxX, parAxisAlignedBB.minY, parAxisAlignedBB.minZ).endVertex();
|
|
worldrenderer.pos(parAxisAlignedBB.maxX, parAxisAlignedBB.maxY, parAxisAlignedBB.minZ).endVertex();
|
|
worldrenderer.pos(parAxisAlignedBB.maxX, parAxisAlignedBB.minY, parAxisAlignedBB.maxZ).endVertex();
|
|
worldrenderer.pos(parAxisAlignedBB.maxX, parAxisAlignedBB.maxY, parAxisAlignedBB.maxZ).endVertex();
|
|
worldrenderer.pos(parAxisAlignedBB.minX, parAxisAlignedBB.minY, parAxisAlignedBB.maxZ).endVertex();
|
|
worldrenderer.pos(parAxisAlignedBB.minX, parAxisAlignedBB.maxY, parAxisAlignedBB.maxZ).endVertex();
|
|
tessellator.draw();
|
|
}
|
|
|
|
public static void func_181563_a(AxisAlignedBB parAxisAlignedBB, int parInt1, int parInt2, int parInt3,
|
|
int parInt4) {
|
|
Tessellator tessellator = Tessellator.getInstance();
|
|
WorldRenderer worldrenderer = tessellator.getWorldRenderer();
|
|
worldrenderer.begin(3, DefaultVertexFormats.POSITION_COLOR);
|
|
worldrenderer.pos(parAxisAlignedBB.minX, parAxisAlignedBB.minY, parAxisAlignedBB.minZ)
|
|
.color(parInt1, parInt2, parInt3, parInt4).endVertex();
|
|
worldrenderer.pos(parAxisAlignedBB.maxX, parAxisAlignedBB.minY, parAxisAlignedBB.minZ)
|
|
.color(parInt1, parInt2, parInt3, parInt4).endVertex();
|
|
worldrenderer.pos(parAxisAlignedBB.maxX, parAxisAlignedBB.minY, parAxisAlignedBB.maxZ)
|
|
.color(parInt1, parInt2, parInt3, parInt4).endVertex();
|
|
worldrenderer.pos(parAxisAlignedBB.minX, parAxisAlignedBB.minY, parAxisAlignedBB.maxZ)
|
|
.color(parInt1, parInt2, parInt3, parInt4).endVertex();
|
|
worldrenderer.pos(parAxisAlignedBB.minX, parAxisAlignedBB.minY, parAxisAlignedBB.minZ)
|
|
.color(parInt1, parInt2, parInt3, parInt4).endVertex();
|
|
tessellator.draw();
|
|
worldrenderer.begin(3, DefaultVertexFormats.POSITION_COLOR);
|
|
worldrenderer.pos(parAxisAlignedBB.minX, parAxisAlignedBB.maxY, parAxisAlignedBB.minZ)
|
|
.color(parInt1, parInt2, parInt3, parInt4).endVertex();
|
|
worldrenderer.pos(parAxisAlignedBB.maxX, parAxisAlignedBB.maxY, parAxisAlignedBB.minZ)
|
|
.color(parInt1, parInt2, parInt3, parInt4).endVertex();
|
|
worldrenderer.pos(parAxisAlignedBB.maxX, parAxisAlignedBB.maxY, parAxisAlignedBB.maxZ)
|
|
.color(parInt1, parInt2, parInt3, parInt4).endVertex();
|
|
worldrenderer.pos(parAxisAlignedBB.minX, parAxisAlignedBB.maxY, parAxisAlignedBB.maxZ)
|
|
.color(parInt1, parInt2, parInt3, parInt4).endVertex();
|
|
worldrenderer.pos(parAxisAlignedBB.minX, parAxisAlignedBB.maxY, parAxisAlignedBB.minZ)
|
|
.color(parInt1, parInt2, parInt3, parInt4).endVertex();
|
|
tessellator.draw();
|
|
worldrenderer.begin(1, DefaultVertexFormats.POSITION_COLOR);
|
|
worldrenderer.pos(parAxisAlignedBB.minX, parAxisAlignedBB.minY, parAxisAlignedBB.minZ)
|
|
.color(parInt1, parInt2, parInt3, parInt4).endVertex();
|
|
worldrenderer.pos(parAxisAlignedBB.minX, parAxisAlignedBB.maxY, parAxisAlignedBB.minZ)
|
|
.color(parInt1, parInt2, parInt3, parInt4).endVertex();
|
|
worldrenderer.pos(parAxisAlignedBB.maxX, parAxisAlignedBB.minY, parAxisAlignedBB.minZ)
|
|
.color(parInt1, parInt2, parInt3, parInt4).endVertex();
|
|
worldrenderer.pos(parAxisAlignedBB.maxX, parAxisAlignedBB.maxY, parAxisAlignedBB.minZ)
|
|
.color(parInt1, parInt2, parInt3, parInt4).endVertex();
|
|
worldrenderer.pos(parAxisAlignedBB.maxX, parAxisAlignedBB.minY, parAxisAlignedBB.maxZ)
|
|
.color(parInt1, parInt2, parInt3, parInt4).endVertex();
|
|
worldrenderer.pos(parAxisAlignedBB.maxX, parAxisAlignedBB.maxY, parAxisAlignedBB.maxZ)
|
|
.color(parInt1, parInt2, parInt3, parInt4).endVertex();
|
|
worldrenderer.pos(parAxisAlignedBB.minX, parAxisAlignedBB.minY, parAxisAlignedBB.maxZ)
|
|
.color(parInt1, parInt2, parInt3, parInt4).endVertex();
|
|
worldrenderer.pos(parAxisAlignedBB.minX, parAxisAlignedBB.maxY, parAxisAlignedBB.maxZ)
|
|
.color(parInt1, parInt2, parInt3, parInt4).endVertex();
|
|
tessellator.draw();
|
|
}
|
|
|
|
/**
|
|
* +
|
|
* Marks the blocks in the given range for update
|
|
*/
|
|
private void markBlocksForUpdate(int x1, int y1, int z1, int x2, int y2, int z2) {
|
|
this.viewFrustum.markBlocksForUpdate(x1, y1, z1, x2, y2, z2);
|
|
}
|
|
|
|
public void markBlockForUpdate(BlockPos blockpos) {
|
|
int i = blockpos.getX();
|
|
int j = blockpos.getY();
|
|
int k = blockpos.getZ();
|
|
this.markBlocksForUpdate(i - 1, j - 1, k - 1, i + 1, j + 1, k + 1);
|
|
}
|
|
|
|
public void notifyLightSet(BlockPos blockpos) {
|
|
this.setLightUpdates.add(blockpos.toImmutable());
|
|
int i = blockpos.getX();
|
|
int j = blockpos.getY();
|
|
int k = blockpos.getZ();
|
|
this.markBlocksForUpdate(i - 1, j - 1, k - 1, i + 1, j + 1, k + 1);
|
|
}
|
|
|
|
/**
|
|
* +
|
|
* On the client, re-renders all blocks in this range,
|
|
* inclusive. On the server, does nothing. Args: min x, min y,
|
|
* min z, max x, max y, max z
|
|
*/
|
|
public void markBlockRangeForRenderUpdate(int i, int j, int k, int l, int i1, int j1) {
|
|
this.markBlocksForUpdate(i - 1, j - 1, k - 1, l + 1, i1 + 1, j1 + 1);
|
|
}
|
|
|
|
public void playRecord(String s, BlockPos blockpos) {
|
|
ISound isound = (ISound) this.mapSoundPositions.get(blockpos);
|
|
if (isound != null) {
|
|
this.mc.getSoundHandler().stopSound(isound);
|
|
this.mapSoundPositions.remove(blockpos);
|
|
}
|
|
|
|
if (s != null) {
|
|
ItemRecord itemrecord = ItemRecord.getRecord(s);
|
|
if (itemrecord != null) {
|
|
this.mc.ingameGUI.setRecordPlayingMessage(itemrecord.getRecordNameLocal());
|
|
}
|
|
|
|
PositionedSoundRecord positionedsoundrecord = PositionedSoundRecord.create(new ResourceLocation(s),
|
|
(float) blockpos.getX(), (float) blockpos.getY(), (float) blockpos.getZ());
|
|
this.mapSoundPositions.put(blockpos, positionedsoundrecord);
|
|
this.mc.getSoundHandler().playSound(positionedsoundrecord);
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
* +
|
|
* Plays the specified sound. Arg: soundName, x, y, z, volume,
|
|
* pitch
|
|
*/
|
|
public void playSound(String var1, double var2, double var4, double var6, float var8, float var9) {
|
|
}
|
|
|
|
/**
|
|
* +
|
|
* Plays sound to all near players except the player reference
|
|
* given
|
|
*/
|
|
public void playSoundToNearExcept(EntityPlayer var1, String var2, double var3, double var5, double var7, float var9,
|
|
float var10) {
|
|
}
|
|
|
|
public void spawnParticle(int i, boolean flag, final double d0, final double d1, final double d2, double d3,
|
|
double d4, double d5, int... aint) {
|
|
try {
|
|
this.spawnEntityFX(i, flag, d0, d1, d2, d3, d4, d5, aint);
|
|
} catch (Throwable throwable) {
|
|
CrashReport crashreport = CrashReport.makeCrashReport(throwable, "Exception while adding particle");
|
|
CrashReportCategory crashreportcategory = crashreport.makeCategory("Particle being added");
|
|
crashreportcategory.addCrashSection("ID", Integer.valueOf(i));
|
|
if (aint != null) {
|
|
crashreportcategory.addCrashSection("Parameters", aint);
|
|
}
|
|
|
|
crashreportcategory.addCrashSectionCallable("Position", new Callable<String>() {
|
|
public String call() throws Exception {
|
|
return CrashReportCategory.getCoordinateInfo(d0, d1, d2);
|
|
}
|
|
});
|
|
throw new ReportedException(crashreport);
|
|
}
|
|
}
|
|
|
|
private void spawnParticle(EnumParticleTypes particleIn, double parDouble1, double parDouble2, double parDouble3,
|
|
double parDouble4, double parDouble5, double parDouble6, int... parArrayOfInt) {
|
|
this.spawnParticle(particleIn.getParticleID(), particleIn.getShouldIgnoreRange(), parDouble1, parDouble2,
|
|
parDouble3, parDouble4, parDouble5, parDouble6, parArrayOfInt);
|
|
}
|
|
|
|
private EntityFX spawnEntityFX(int ignoreRange, boolean parFlag, double parDouble1, double parDouble2,
|
|
double parDouble3, double parDouble4, double parDouble5, double parDouble6, int... parArrayOfInt) {
|
|
if (this.mc != null && this.mc.getRenderViewEntity() != null && this.mc.effectRenderer != null) {
|
|
int i = this.mc.gameSettings.particleSetting;
|
|
if (i == 1 && this.theWorld.rand.nextInt(3) == 0) {
|
|
i = 2;
|
|
}
|
|
|
|
double d0 = this.mc.getRenderViewEntity().posX - parDouble1;
|
|
double d1 = this.mc.getRenderViewEntity().posY - parDouble2;
|
|
double d2 = this.mc.getRenderViewEntity().posZ - parDouble3;
|
|
if (parFlag) {
|
|
return this.mc.effectRenderer.spawnEffectParticle(ignoreRange, parDouble1, parDouble2, parDouble3,
|
|
parDouble4, parDouble5, parDouble6, parArrayOfInt);
|
|
} else {
|
|
double d3 = 16.0D;
|
|
return d0 * d0 + d1 * d1 + d2 * d2 > 256.0D ? null
|
|
: (i > 1 ? null
|
|
: this.mc.effectRenderer.spawnEffectParticle(ignoreRange, parDouble1, parDouble2,
|
|
parDouble3, parDouble4, parDouble5, parDouble6, parArrayOfInt));
|
|
}
|
|
} else {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* +
|
|
* Called on all IWorldAccesses when an entity is created or
|
|
* loaded. On client worlds, starts downloading any necessary
|
|
* textures. On server worlds, adds the entity to the entity
|
|
* tracker.
|
|
*/
|
|
public void onEntityAdded(Entity var1) {
|
|
}
|
|
|
|
/**
|
|
* +
|
|
* Called on all IWorldAccesses when an entity is unloaded or
|
|
* destroyed. On client worlds, releases any downloaded
|
|
* textures. On server worlds, removes the entity from the
|
|
* entity tracker.
|
|
*/
|
|
public void onEntityRemoved(Entity var1) {
|
|
}
|
|
|
|
/**
|
|
* +
|
|
* Deletes all display lists
|
|
*/
|
|
public void deleteAllDisplayLists() {
|
|
}
|
|
|
|
public void broadcastSound(int i, BlockPos blockpos, int var3) {
|
|
switch (i) {
|
|
case 1013:
|
|
case 1018:
|
|
if (this.mc.getRenderViewEntity() != null) {
|
|
double d0 = (double) blockpos.getX() - this.mc.getRenderViewEntity().posX;
|
|
double d1 = (double) blockpos.getY() - this.mc.getRenderViewEntity().posY;
|
|
double d2 = (double) blockpos.getZ() - this.mc.getRenderViewEntity().posZ;
|
|
double d3 = Math.sqrt(d0 * d0 + d1 * d1 + d2 * d2);
|
|
double d4 = this.mc.getRenderViewEntity().posX;
|
|
double d5 = this.mc.getRenderViewEntity().posY;
|
|
double d6 = this.mc.getRenderViewEntity().posZ;
|
|
if (d3 > 0.0D) {
|
|
d4 += d0 / d3 * 2.0D;
|
|
d5 += d1 / d3 * 2.0D;
|
|
d6 += d2 / d3 * 2.0D;
|
|
}
|
|
|
|
if (i == 1013) {
|
|
this.theWorld.playSound(d4, d5, d6, "mob.wither.spawn", 1.0F, 1.0F, false);
|
|
} else {
|
|
this.theWorld.playSound(d4, d5, d6, "mob.enderdragon.end", 5.0F, 1.0F, false);
|
|
}
|
|
}
|
|
default:
|
|
}
|
|
}
|
|
|
|
public void playAuxSFX(EntityPlayer var1, int i, BlockPos blockpos, int j) {
|
|
EaglercraftRandom random = this.theWorld.rand;
|
|
switch (i) {
|
|
case 1000:
|
|
this.theWorld.playSoundAtPos(blockpos, "random.click", 1.0F, 1.0F, false);
|
|
break;
|
|
case 1001:
|
|
this.theWorld.playSoundAtPos(blockpos, "random.click", 1.0F, 1.2F, false);
|
|
break;
|
|
case 1002:
|
|
this.theWorld.playSoundAtPos(blockpos, "random.bow", 1.0F, 1.2F, false);
|
|
break;
|
|
case 1003:
|
|
this.theWorld.playSoundAtPos(blockpos, "random.door_open", 1.0F,
|
|
this.theWorld.rand.nextFloat() * 0.1F + 0.9F, false);
|
|
break;
|
|
case 1004:
|
|
this.theWorld.playSoundAtPos(blockpos, "random.fizz", 0.5F,
|
|
2.6F + (random.nextFloat() - random.nextFloat()) * 0.8F, false);
|
|
break;
|
|
case 1005:
|
|
if (Item.getItemById(j) instanceof ItemRecord) {
|
|
this.theWorld.playRecord(blockpos, "records." + ((ItemRecord) Item.getItemById(j)).recordName);
|
|
} else {
|
|
this.theWorld.playRecord(blockpos, (String) null);
|
|
}
|
|
break;
|
|
case 1006:
|
|
this.theWorld.playSoundAtPos(blockpos, "random.door_close", 1.0F,
|
|
this.theWorld.rand.nextFloat() * 0.1F + 0.9F, false);
|
|
break;
|
|
case 1007:
|
|
this.theWorld.playSoundAtPos(blockpos, "mob.ghast.charge", 10.0F,
|
|
(random.nextFloat() - random.nextFloat()) * 0.2F + 1.0F, false);
|
|
break;
|
|
case 1008:
|
|
this.theWorld.playSoundAtPos(blockpos, "mob.ghast.fireball", 10.0F,
|
|
(random.nextFloat() - random.nextFloat()) * 0.2F + 1.0F, false);
|
|
break;
|
|
case 1009:
|
|
this.theWorld.playSoundAtPos(blockpos, "mob.ghast.fireball", 2.0F,
|
|
(random.nextFloat() - random.nextFloat()) * 0.2F + 1.0F, false);
|
|
break;
|
|
case 1010:
|
|
this.theWorld.playSoundAtPos(blockpos, "mob.zombie.wood", 2.0F,
|
|
(random.nextFloat() - random.nextFloat()) * 0.2F + 1.0F, false);
|
|
break;
|
|
case 1011:
|
|
this.theWorld.playSoundAtPos(blockpos, "mob.zombie.metal", 2.0F,
|
|
(random.nextFloat() - random.nextFloat()) * 0.2F + 1.0F, false);
|
|
break;
|
|
case 1012:
|
|
this.theWorld.playSoundAtPos(blockpos, "mob.zombie.woodbreak", 2.0F,
|
|
(random.nextFloat() - random.nextFloat()) * 0.2F + 1.0F, false);
|
|
break;
|
|
case 1014:
|
|
this.theWorld.playSoundAtPos(blockpos, "mob.wither.shoot", 2.0F,
|
|
(random.nextFloat() - random.nextFloat()) * 0.2F + 1.0F, false);
|
|
break;
|
|
case 1015:
|
|
this.theWorld.playSoundAtPos(blockpos, "mob.bat.takeoff", 0.05F,
|
|
(random.nextFloat() - random.nextFloat()) * 0.2F + 1.0F, false);
|
|
break;
|
|
case 1016:
|
|
this.theWorld.playSoundAtPos(blockpos, "mob.zombie.infect", 2.0F,
|
|
(random.nextFloat() - random.nextFloat()) * 0.2F + 1.0F, false);
|
|
break;
|
|
case 1017:
|
|
this.theWorld.playSoundAtPos(blockpos, "mob.zombie.unfect", 2.0F,
|
|
(random.nextFloat() - random.nextFloat()) * 0.2F + 1.0F, false);
|
|
break;
|
|
case 1020:
|
|
this.theWorld.playSoundAtPos(blockpos, "random.anvil_break", 1.0F,
|
|
this.theWorld.rand.nextFloat() * 0.1F + 0.9F, false);
|
|
break;
|
|
case 1021:
|
|
this.theWorld.playSoundAtPos(blockpos, "random.anvil_use", 1.0F,
|
|
this.theWorld.rand.nextFloat() * 0.1F + 0.9F, false);
|
|
break;
|
|
case 1022:
|
|
this.theWorld.playSoundAtPos(blockpos, "random.anvil_land", 0.3F,
|
|
this.theWorld.rand.nextFloat() * 0.1F + 0.9F, false);
|
|
break;
|
|
case 1033:
|
|
this.theWorld.playSoundAtPos(blockpos, "block.chorus_flower.grow", 1.0F, 1.0F, false);
|
|
break;
|
|
case 1034:
|
|
this.theWorld.playSoundAtPos(blockpos, "block.chorus_flower.death", 1.0F, 1.0F, false);
|
|
break;
|
|
case 2000:
|
|
int j1 = j % 3 - 1;
|
|
int k = j / 3 % 3 - 1;
|
|
double d15 = (double) blockpos.getX() + (double) j1 * 0.6D + 0.5D;
|
|
double d17 = (double) blockpos.getY() + 0.5D;
|
|
double d19 = (double) blockpos.getZ() + (double) k * 0.6D + 0.5D;
|
|
|
|
for (int i2 = 0; i2 < 10; ++i2) {
|
|
double d20 = random.nextDouble() * 0.2D + 0.01D;
|
|
double d21 = d15 + (double) j1 * 0.01D + (random.nextDouble() - 0.5D) * (double) k * 0.5D;
|
|
double d4 = d17 + (random.nextDouble() - 0.5D) * 0.5D;
|
|
double d6 = d19 + (double) k * 0.01D + (random.nextDouble() - 0.5D) * (double) j1 * 0.5D;
|
|
double d8 = (double) j1 * d20 + random.nextGaussian() * 0.01D;
|
|
double d10 = -0.03D + random.nextGaussian() * 0.01D;
|
|
double d12 = (double) k * d20 + random.nextGaussian() * 0.01D;
|
|
this.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, d21, d4, d6, d8, d10, d12, new int[0]);
|
|
}
|
|
|
|
return;
|
|
case 2001:
|
|
Block block = Block.getBlockById(j & 4095);
|
|
if (block.getMaterial() != Material.air) {
|
|
this.mc.getSoundHandler()
|
|
.playSound(new PositionedSoundRecord(new ResourceLocation(block.stepSound.getBreakSound()),
|
|
(block.stepSound.getVolume() + 1.0F) / 2.0F, block.stepSound.getFrequency() * 0.8F,
|
|
(float) blockpos.getX() + 0.5F, (float) blockpos.getY() + 0.5F,
|
|
(float) blockpos.getZ() + 0.5F));
|
|
}
|
|
|
|
this.mc.effectRenderer.addBlockDestroyEffects(blockpos, block.getStateFromMeta(j >> 12 & 255));
|
|
break;
|
|
case 2002:
|
|
double d13 = (double) blockpos.getX();
|
|
double d14 = (double) blockpos.getY();
|
|
double d16 = (double) blockpos.getZ();
|
|
|
|
for (int k1 = 0; k1 < 8; ++k1) {
|
|
this.spawnParticle(EnumParticleTypes.ITEM_CRACK, d13, d14, d16, random.nextGaussian() * 0.15D,
|
|
random.nextDouble() * 0.2D, random.nextGaussian() * 0.15D,
|
|
new int[] { Item.getIdFromItem(Items.potionitem), j });
|
|
}
|
|
|
|
int l1 = Items.potionitem.getColorFromDamage(j);
|
|
float f = (float) (l1 >> 16 & 255) / 255.0F;
|
|
float f1 = (float) (l1 >> 8 & 255) / 255.0F;
|
|
float f2 = (float) (l1 >> 0 & 255) / 255.0F;
|
|
EnumParticleTypes enumparticletypes = EnumParticleTypes.SPELL;
|
|
if (Items.potionitem.isEffectInstant(j)) {
|
|
enumparticletypes = EnumParticleTypes.SPELL_INSTANT;
|
|
}
|
|
|
|
for (int j2 = 0; j2 < 100; ++j2) {
|
|
double d22 = random.nextDouble() * 4.0D;
|
|
double d23 = random.nextDouble() * 3.141592653589793D * 2.0D;
|
|
double d24 = Math.cos(d23) * d22;
|
|
double d9 = 0.01D + random.nextDouble() * 0.5D;
|
|
double d11 = Math.sin(d23) * d22;
|
|
EntityFX entityfx = this.spawnEntityFX(enumparticletypes.getParticleID(),
|
|
enumparticletypes.getShouldIgnoreRange(), d13 + d24 * 0.1D, d14 + 0.3D, d16 + d11 * 0.1D,
|
|
d24,
|
|
d9, d11, new int[0]);
|
|
if (entityfx != null) {
|
|
float f3 = 0.75F + random.nextFloat() * 0.25F;
|
|
entityfx.setRBGColorF(f * f3, f1 * f3, f2 * f3);
|
|
entityfx.multiplyVelocity((float) d22);
|
|
}
|
|
}
|
|
|
|
this.theWorld.playSoundAtPos(blockpos, "game.potion.smash", 1.0F,
|
|
this.theWorld.rand.nextFloat() * 0.1F + 0.9F, false);
|
|
break;
|
|
case 2003:
|
|
double d0 = (double) blockpos.getX() + 0.5D;
|
|
double d1 = (double) blockpos.getY();
|
|
double d2 = (double) blockpos.getZ() + 0.5D;
|
|
|
|
for (int l = 0; l < 8; ++l) {
|
|
this.spawnParticle(EnumParticleTypes.ITEM_CRACK, d0, d1, d2, random.nextGaussian() * 0.15D,
|
|
random.nextDouble() * 0.2D, random.nextGaussian() * 0.15D,
|
|
new int[] { Item.getIdFromItem(Items.ender_eye) });
|
|
}
|
|
|
|
for (double d18 = 0.0D; d18 < 6.283185307179586D; d18 += 0.15707963267948966D) {
|
|
this.spawnParticle(EnumParticleTypes.PORTAL, d0 + Math.cos(d18) * 5.0D, d1 - 0.4D,
|
|
d2 + Math.sin(d18) * 5.0D, Math.cos(d18) * -5.0D, 0.0D, Math.sin(d18) * -5.0D, new int[0]);
|
|
this.spawnParticle(EnumParticleTypes.PORTAL, d0 + Math.cos(d18) * 5.0D, d1 - 0.4D,
|
|
d2 + Math.sin(d18) * 5.0D, Math.cos(d18) * -7.0D, 0.0D, Math.sin(d18) * -7.0D, new int[0]);
|
|
}
|
|
|
|
return;
|
|
case 2004:
|
|
for (int i1 = 0; i1 < 20; ++i1) {
|
|
double d3 = (double) blockpos.getX() + 0.5D
|
|
+ ((double) this.theWorld.rand.nextFloat() - 0.5D) * 2.0D;
|
|
double d5 = (double) blockpos.getY() + 0.5D
|
|
+ ((double) this.theWorld.rand.nextFloat() - 0.5D) * 2.0D;
|
|
double d7 = (double) blockpos.getZ() + 0.5D
|
|
+ ((double) this.theWorld.rand.nextFloat() - 0.5D) * 2.0D;
|
|
this.theWorld.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, d3, d5, d7, 0.0D, 0.0D, 0.0D,
|
|
new int[0]);
|
|
this.theWorld.spawnParticle(EnumParticleTypes.FLAME, d3, d5, d7, 0.0D, 0.0D, 0.0D, new int[0]);
|
|
}
|
|
|
|
return;
|
|
case 2005:
|
|
ItemDye.spawnBonemealParticles(this.theWorld, blockpos, j);
|
|
}
|
|
|
|
}
|
|
|
|
public void sendBlockBreakProgress(int i, BlockPos blockpos, int j) {
|
|
if (j >= 0 && j < 10) {
|
|
DestroyBlockProgress destroyblockprogress = (DestroyBlockProgress) this.damagedBlocks
|
|
.get(Integer.valueOf(i));
|
|
if (destroyblockprogress == null || destroyblockprogress.getPosition().getX() != blockpos.getX()
|
|
|| destroyblockprogress.getPosition().getY() != blockpos.getY()
|
|
|| destroyblockprogress.getPosition().getZ() != blockpos.getZ()) {
|
|
destroyblockprogress = new DestroyBlockProgress(i, blockpos);
|
|
this.damagedBlocks.put(Integer.valueOf(i), destroyblockprogress);
|
|
}
|
|
|
|
destroyblockprogress.setPartialBlockDamage(j);
|
|
destroyblockprogress.setCloudUpdateTick(this.cloudTickCounter);
|
|
} else {
|
|
this.damagedBlocks.remove(Integer.valueOf(i));
|
|
}
|
|
|
|
}
|
|
|
|
public void setDisplayListEntitiesDirty() {
|
|
this.displayListEntitiesDirty = true;
|
|
}
|
|
|
|
public void func_181023_a(Collection<TileEntity> parCollection, Collection<TileEntity> parCollection2) {
|
|
synchronized (this.field_181024_n) {
|
|
this.field_181024_n.removeAll(parCollection);
|
|
this.field_181024_n.addAll(parCollection2);
|
|
}
|
|
}
|
|
|
|
class ContainerLocalRenderInformation {
|
|
final RenderChunk renderChunk;
|
|
final EnumFacing facing;
|
|
final Set<EnumFacing> setFacing;
|
|
final int counter;
|
|
|
|
private ContainerLocalRenderInformation(RenderChunk renderChunkIn, EnumFacing facingIn, int counterIn) {
|
|
this.setFacing = EnumSet.noneOf(EnumFacing.class);
|
|
this.renderChunk = renderChunkIn;
|
|
this.facing = facingIn;
|
|
this.counter = counterIn;
|
|
}
|
|
}
|
|
|
|
public String getDebugInfoShort() {
|
|
int i = this.viewFrustum.renderChunks.length;
|
|
int j = 0;
|
|
int k = 0;
|
|
|
|
for (int ii = 0, ll = this.renderInfos.size(); ii < ll; ++ii) {
|
|
RenderGlobal.ContainerLocalRenderInformation renderglobal$containerlocalrenderinformation = this.renderInfos
|
|
.get(ii);
|
|
CompiledChunk compiledchunk = renderglobal$containerlocalrenderinformation.renderChunk.compiledChunk;
|
|
if (compiledchunk != CompiledChunk.DUMMY && !compiledchunk.isEmpty()) {
|
|
++j;
|
|
k += compiledchunk.getTileEntities().size();
|
|
}
|
|
}
|
|
|
|
return "" + Minecraft.getDebugFPS() + "fps | C: " + j + "/" + i + ", E: " + this.countEntitiesRendered + "+" + k
|
|
+ ", " + renderDispatcher.getDebugInfo();
|
|
}
|
|
|
|
public void alfheim$processLightUpdates() {
|
|
if (setLightUpdates.isEmpty())
|
|
return;
|
|
|
|
final Iterator<BlockPos> iterator = setLightUpdates.iterator();
|
|
final float lightUpdateLimit = 2048 + ((float) setLightUpdates.size() / 4); // Todo: Rework this once again,
|
|
// this is currently pretty dumb.
|
|
// It fixed the issue where the FPS
|
|
// on lower end hardware would
|
|
// plummet for a few seconds.
|
|
// But it also reduced how smooth
|
|
// the frame rate was on higher end
|
|
// hardware.
|
|
// Updating blocks is costly and
|
|
// will take a long time, this is
|
|
// why lower end hardware plummets
|
|
// for a few seconds.
|
|
// Higher end hardware instead has
|
|
// somewhat of a FPS "buffer" which
|
|
// can handle it fine over multiple
|
|
// frames thus reducing frame-time
|
|
// spikes.
|
|
// The technically the best way to
|
|
// do this (that I hadn't though of
|
|
// before) was to add current "FPS"
|
|
// to the equation.
|
|
// If the FPS is low more updates
|
|
// would be done in one frame if it
|
|
// is high we can afford spreading
|
|
// light updates over multiple
|
|
// frames.
|
|
|
|
short lightUpdatesProcessed = 0;
|
|
while (iterator.hasNext() && lightUpdatesProcessed < lightUpdateLimit) {
|
|
final BlockPos blockpos = iterator.next();
|
|
|
|
iterator.remove();
|
|
|
|
final int x = blockpos.getX();
|
|
final int y = blockpos.getY();
|
|
final int z = blockpos.getZ();
|
|
|
|
markBlocksForUpdate(x, y, z, x, y, z);
|
|
|
|
lightUpdatesProcessed++;
|
|
}
|
|
}
|
|
} |