diff --git a/src/main/java/com/seibel/lod/builders/LodBuilder.java b/src/main/java/com/seibel/lod/builders/LodBuilder.java index 98a75af60..2d5e0ee2d 100644 --- a/src/main/java/com/seibel/lod/builders/LodBuilder.java +++ b/src/main/java/com/seibel/lod/builders/LodBuilder.java @@ -21,7 +21,6 @@ import java.awt.Color; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import com.seibel.lod.config.LodConfig; import com.seibel.lod.enums.DistanceGenerationMode; import com.seibel.lod.enums.LodDetail; import com.seibel.lod.objects.DataPoint; @@ -32,6 +31,7 @@ import com.seibel.lod.util.ColorUtil; import com.seibel.lod.util.DetailDistanceUtil; import com.seibel.lod.util.LodThreadFactory; import com.seibel.lod.util.LodUtil; +import com.seibel.lod.wrapper.MinecraftWrapper; import net.minecraft.block.AbstractPlantBlock; import net.minecraft.block.BlockState; @@ -41,7 +41,6 @@ import net.minecraft.block.GrassBlock; import net.minecraft.block.IGrowable; import net.minecraft.block.LeavesBlock; import net.minecraft.block.material.MaterialColor; -import net.minecraft.client.Minecraft; import net.minecraft.world.DimensionType; import net.minecraft.world.IWorld; import net.minecraft.world.biome.Biome; @@ -111,7 +110,7 @@ public class LodBuilder int playerPosX; int playerPosZ; - if (Minecraft.getInstance().player == null) + if (MinecraftWrapper.INSTANCE.getPlayer() == null) { playerPosX = chunk.getPos().getMinBlockX(); playerPosZ = chunk.getPos().getMinBlockZ(); diff --git a/src/main/java/com/seibel/lod/builders/worldGeneration/LodWorldGenerator.java b/src/main/java/com/seibel/lod/builders/worldGeneration/LodWorldGenerator.java index 3f697d71a..f1e7e100a 100644 --- a/src/main/java/com/seibel/lod/builders/worldGeneration/LodWorldGenerator.java +++ b/src/main/java/com/seibel/lod/builders/worldGeneration/LodWorldGenerator.java @@ -25,8 +25,8 @@ import com.seibel.lod.render.LodRenderer; import com.seibel.lod.util.DetailDistanceUtil; import com.seibel.lod.util.LodThreadFactory; import com.seibel.lod.util.LodUtil; +import com.seibel.lod.wrapper.MinecraftWrapper; -import net.minecraft.client.Minecraft; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.ChunkPos; import net.minecraft.world.server.ServerWorld; @@ -40,7 +40,7 @@ import net.minecraftforge.common.WorldWorkerManager; */ public class LodWorldGenerator { - public Minecraft mc = Minecraft.getInstance(); + public MinecraftWrapper mc = MinecraftWrapper.INSTANCE; /** * This holds the thread used to generate new LODs off the main thread. @@ -108,7 +108,7 @@ public class LodWorldGenerator try { // round the player's block position down to the nearest chunk BlockPos - ChunkPos playerChunkPos = new ChunkPos(mc.player.blockPosition()); + ChunkPos playerChunkPos = new ChunkPos(mc.getPlayer().blockPosition()); BlockPos playerBlockPosRounded = playerChunkPos.getWorldPosition(); // used when determining which chunks are closer when queuing distance diff --git a/src/main/java/com/seibel/lod/handlers/ReflectionHandler.java b/src/main/java/com/seibel/lod/handlers/ReflectionHandler.java index 843fd8e8b..70d140424 100644 --- a/src/main/java/com/seibel/lod/handlers/ReflectionHandler.java +++ b/src/main/java/com/seibel/lod/handlers/ReflectionHandler.java @@ -20,8 +20,7 @@ package com.seibel.lod.handlers; import java.lang.reflect.Field; import com.seibel.lod.enums.FogQuality; - -import net.minecraft.client.Minecraft; +import com.seibel.lod.wrapper.MinecraftWrapper; /** * This object is used to get variables from methods @@ -33,7 +32,7 @@ import net.minecraft.client.Minecraft; */ public class ReflectionHandler { - private Minecraft mc = Minecraft.getInstance(); + private MinecraftWrapper mc = MinecraftWrapper.INSTANCE; public Field ofFogField = null; public ReflectionHandler() @@ -48,7 +47,7 @@ public class ReflectionHandler private void setupFogField() { // get every variable from the entity renderer - Field[] optionFields = mc.options.getClass().getDeclaredFields(); + Field[] optionFields = mc.getOptions().getClass().getDeclaredFields(); // try and find the ofFogType variable in gameSettings for (Field field : optionFields) @@ -84,7 +83,7 @@ public class ReflectionHandler try { - returnNum = (int) ofFogField.get(mc.options); + returnNum = (int) ofFogField.get(mc.getOptions()); } catch (IllegalArgumentException | IllegalAccessException e) { e.printStackTrace(); diff --git a/src/main/java/com/seibel/lod/objects/LodDimension.java b/src/main/java/com/seibel/lod/objects/LodDimension.java index de1733141..3230a9a20 100644 --- a/src/main/java/com/seibel/lod/objects/LodDimension.java +++ b/src/main/java/com/seibel/lod/objects/LodDimension.java @@ -33,8 +33,8 @@ import com.seibel.lod.objects.LevelPos.LevelPos; import com.seibel.lod.util.DetailDistanceUtil; import com.seibel.lod.util.LodThreadFactory; import com.seibel.lod.util.LodUtil; +import com.seibel.lod.wrapper.MinecraftWrapper; -import net.minecraft.client.Minecraft; import net.minecraft.util.math.ChunkPos; import net.minecraft.world.DimensionType; import net.minecraft.world.server.ServerChunkProvider; @@ -47,7 +47,7 @@ import net.minecraft.world.server.ServerWorld; * * @author Leonardo Amato * @author James Seibel - * @version 8-8-2021 + * @version 9-6-2021 */ public class LodDimension { @@ -89,7 +89,7 @@ public class LodDimension dimension = newDimension; width = newWidth; halfWidth = (int) Math.floor(width / 2); - Minecraft mc = Minecraft.getInstance(); + MinecraftWrapper mc = MinecraftWrapper.INSTANCE; if (newDimension != null && lodWorld != null) { try @@ -110,8 +110,8 @@ public class LodDimension { // connected to server - saveDir = new File(mc.gameDirectory.getCanonicalFile().getPath() + - File.separatorChar + "lod server data" + File.separatorChar + LodUtil.getDimensionIDFromWorld(mc.level)); + saveDir = new File(mc.getGameDirectory().getCanonicalFile().getPath() + + File.separatorChar + "lod server data" + File.separatorChar + mc.getCurrentDimensionId()); } fileHandler = new LodDimensionFileHandler(saveDir, this); @@ -243,8 +243,6 @@ public class LodDimension */ public int getMinMemoryNeeded() { - int regionX; - int regionZ; int count = 0; LodRegion region; @@ -696,9 +694,6 @@ public class LodDimension @Override public String toString() { - int regionX; - int regionZ; - LevelPos levelPos; LodRegion region; StringBuilder stringBuilder = new StringBuilder(); diff --git a/src/main/java/com/seibel/lod/proxy/ClientProxy.java b/src/main/java/com/seibel/lod/proxy/ClientProxy.java index 0a869c453..2725ebbaf 100644 --- a/src/main/java/com/seibel/lod/proxy/ClientProxy.java +++ b/src/main/java/com/seibel/lod/proxy/ClientProxy.java @@ -38,8 +38,8 @@ import com.seibel.lod.objects.RegionPos; import com.seibel.lod.render.LodRenderer; import com.seibel.lod.util.DetailDistanceUtil; import com.seibel.lod.util.LodUtil; +import com.seibel.lod.wrapper.MinecraftWrapper; -import net.minecraft.client.Minecraft; import net.minecraft.profiler.IProfiler; import net.minecraft.util.text.StringTextComponent; import net.minecraftforge.client.event.InputEvent; @@ -68,7 +68,7 @@ public class ClientProxy private boolean configOverrideReminderPrinted = false; - Minecraft mc = Minecraft.getInstance(); + MinecraftWrapper mc = MinecraftWrapper.INSTANCE; /** @@ -104,12 +104,12 @@ public class ClientProxy public void renderLods(float partialTicks) { DetailDistanceUtil.updateSettings(); - if (mc == null || mc.player == null || !lodWorld.getIsWorldLoaded()) + if (mc == null || mc.getPlayer() == null || !lodWorld.getIsWorldLoaded()) return; viewDistanceChangedEvent(); - LodDimension lodDim = lodWorld.getLodDimension(mc.player.level.dimensionType()); + LodDimension lodDim = lodWorld.getLodDimension(mc.getCurrentDimension()); if (lodDim == null) return; @@ -118,8 +118,8 @@ public class ClientProxy //System.out.println("memory needed " + lodDim.getMinMemoryNeeded() + " byte"); //System.out.println(lodDim); - lodDim.treeCutter((int) mc.player.getX(), (int) mc.player.getZ()); - lodDim.treeGenerator((int) mc.player.getX(), (int) mc.player.getZ()); + lodDim.treeCutter((int) mc.getPlayer().getX(), (int) mc.getPlayer().getZ()); + lodDim.treeGenerator((int) mc.getPlayer().getX(), (int) mc.getPlayer().getZ()); // comment out when creating a release @@ -141,7 +141,7 @@ public class ClientProxy // these can't be set until after the buffers are built (in renderer.drawLODs) // otherwise the buffers may be set to the wrong size, or not changed at all - previousChunkRenderDistance = mc.options.renderDistance; + previousChunkRenderDistance = mc.getRenderDistance(); previousLodRenderDistance = LodConfig.CLIENT.graphics.lodChunkRenderDistance.get(); } @@ -151,7 +151,7 @@ public class ClientProxy // remind the developer(s). that config override is active if (!configOverrideReminderPrinted) { - mc.player.sendMessage(new StringTextComponent("Debug settings enabled!"), mc.player.getUUID()); + mc.getPlayer().sendMessage(new StringTextComponent("Debug settings enabled!"), mc.getPlayer().getUUID()); configOverrideReminderPrinted = true; } @@ -188,10 +188,10 @@ public class ClientProxy @SubscribeEvent public void serverTickEvent(TickEvent.ServerTickEvent event) { - if (mc == null || mc.player == null || !lodWorld.getIsWorldLoaded()) + if (mc == null || mc.getPlayer() == null || !lodWorld.getIsWorldLoaded()) return; - LodDimension lodDim = lodWorld.getLodDimension(mc.player.level.dimensionType()); + LodDimension lodDim = lodWorld.getLodDimension(mc.getPlayer().level.dimensionType()); if (lodDim == null) return; @@ -225,7 +225,6 @@ public class ClientProxy public void worldUnloadEvent(WorldEvent.Unload event) { // the player just unloaded a world/dimension - if (mc.getConnection().getLevel() == null) { // if this isn't done unfinished tasks may be left in the queue @@ -280,7 +279,7 @@ public class ClientProxy private void playerMoveEvent(LodDimension lodDim) { // make sure the dimension is centered - RegionPos playerRegionPos = new RegionPos(mc.player.blockPosition()); + RegionPos playerRegionPos = new RegionPos(mc.getPlayer().blockPosition()); RegionPos worldRegionOffset = new RegionPos(playerRegionPos.x - lodDim.getCenterX(), playerRegionPos.z - lodDim.getCenterZ()); if (worldRegionOffset.x != 0 || worldRegionOffset.z != 0) { diff --git a/src/main/java/com/seibel/lod/render/LodRenderer.java b/src/main/java/com/seibel/lod/render/LodRenderer.java index 18e8883b8..ca6179480 100644 --- a/src/main/java/com/seibel/lod/render/LodRenderer.java +++ b/src/main/java/com/seibel/lod/render/LodRenderer.java @@ -44,14 +44,15 @@ import com.seibel.lod.objects.LevelPos.LevelPos; import com.seibel.lod.proxy.ClientProxy; import com.seibel.lod.util.DetailDistanceUtil; import com.seibel.lod.util.LodUtil; +import com.seibel.lod.wrapper.MinecraftWrapper; -import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.ActiveRenderInfo; import net.minecraft.client.renderer.FogRenderer; import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.client.renderer.vertex.VertexBuffer; import net.minecraft.client.renderer.vertex.VertexFormat; +import net.minecraft.entity.Entity; import net.minecraft.potion.EffectInstance; import net.minecraft.potion.Effects; import net.minecraft.profiler.IProfiler; @@ -102,7 +103,7 @@ public class LodRenderer */ public DebugMode previousDebugMode = DebugMode.OFF; - private Minecraft mc; + private MinecraftWrapper mc; private GameRenderer gameRender; private IProfiler profiler; private int farPlaneBlockDistance; @@ -153,8 +154,8 @@ public class LodRenderer public LodRenderer(LodBufferBuilder newLodNodeBufferBuilder) { - mc = Minecraft.getInstance(); - gameRender = mc.gameRenderer; + mc = MinecraftWrapper.INSTANCE; + gameRender = mc.getGameRenderer(); reflectionHandler = new ReflectionHandler(); lodBufferBuilder = newLodNodeBufferBuilder; @@ -215,7 +216,7 @@ public class LodRenderer if ((partialRegen || fullRegen) && !lodBufferBuilder.generatingBuffers && !lodBufferBuilder.newBuffersAvaliable()) { // generate the LODs on a separate thread to prevent stuttering or freezing - lodBufferBuilder.generateLodBuffersAsync(this, lodDim, mc.player.blockPosition(), true); + lodBufferBuilder.generateLodBuffersAsync(this, lodDim, mc.getPlayer().blockPosition(), true); // the regen process has been started, // it will be done when lodBufferBuilder.newBuffersAvaliable() @@ -287,8 +288,9 @@ public class LodRenderer if (vbos != null) { - Vector3d cameraDir = mc.cameraEntity.getLookAngle().normalize(); - cameraDir = mc.options.getCameraType().isMirrored() ? cameraDir.reverse() : cameraDir; + Entity cameraEntity = mc.getCameraEntity(); + Vector3d cameraDir = cameraEntity.getLookAngle().normalize(); + cameraDir = mc.getOptions().getCameraType().isMirrored() ? cameraDir.reverse() : cameraDir; // used to determine what type of fog to render @@ -300,7 +302,7 @@ public class LodRenderer for (int j = 0; j < vbos.length; j++) { RegionPos vboPos = new RegionPos(i + lodDim.getCenterX() - lodDim.getWidth() / 2, j + lodDim.getCenterZ() - lodDim.getWidth() / 2); - if (RenderUtil.isRegionInViewFrustum(mc.cameraEntity.blockPosition(), cameraDir, vboPos.blockPos())) + if (RenderUtil.isRegionInViewFrustum(cameraEntity.blockPosition(), cameraDir, vboPos.blockPos())) { if ((i > halfWidth - quarterWidth && i < halfWidth + quarterWidth) && (j > halfWidth - quarterWidth && j < halfWidth + quarterWidth)) setupFog(fogSettings.near.distance, fogSettings.near.quality); @@ -434,13 +436,13 @@ public class LodRenderer { if (fogQuality == FogQuality.FANCY) { - RenderSystem.fogEnd(mc.options.renderDistance * 16 * 1.41f); - RenderSystem.fogStart(mc.options.renderDistance * 16 * 1.6f); + RenderSystem.fogEnd(mc.getRenderDistance() * 16 * 1.41f); + RenderSystem.fogStart(mc.getRenderDistance() * 16 * 1.6f); } else if (fogQuality == FogQuality.FAST) { - RenderSystem.fogEnd(mc.options.renderDistance * 16 * 1.0f); - RenderSystem.fogStart(mc.options.renderDistance * 16 * 1.5f); + RenderSystem.fogEnd(mc.getRenderDistance() * 16 * 1.0f); + RenderSystem.fogStart(mc.getRenderDistance() * 16 * 1.5f); } } @@ -481,7 +483,7 @@ public class LodRenderer private Matrix4f generateModelViewMatrix(float partialTicks) { // get all relevant camera info - ActiveRenderInfo renderInfo = mc.gameRenderer.getMainCamera(); + ActiveRenderInfo renderInfo = mc.getGameRenderer().getMainCamera(); Vector3d projectedView = renderInfo.getPosition(); @@ -519,16 +521,16 @@ public class LodRenderer matrixStack.pushPose(); gameRender.bobHurt(matrixStack, partialTicks); - if (this.mc.options.bobView) + if (this.mc.getOptions().bobView) { gameRender.bobView(matrixStack, partialTicks); } // potion and nausea effects - float f = MathHelper.lerp(partialTicks, this.mc.player.oPortalTime, this.mc.player.portalTime) * this.mc.options.screenEffectScale * this.mc.options.screenEffectScale; + float f = MathHelper.lerp(partialTicks, this.mc.getPlayer().oPortalTime, this.mc.getPlayer().portalTime) * this.mc.getOptions().screenEffectScale * this.mc.getOptions().screenEffectScale; if (f > 0.0F) { - int i = this.mc.player.hasEffect(Effects.CONFUSION) ? 7 : 20; + int i = this.mc.getPlayer().hasEffect(Effects.CONFUSION) ? 7 : 20; float f1 = 5.0F / (f * f + 5.0F) - f * 0.04F; f1 = f1 * f1; Vector3f vector3f = new Vector3f(0.0F, MathHelper.SQRT_OF_TWO / 2.0F, MathHelper.SQRT_OF_TWO / 2.0F); @@ -548,7 +550,7 @@ public class LodRenderer // it is possible to see the near clip plane, but // you have to be flying quickly in spectator mode through ungenerated // terrain, so I don't think it is much of an issue. - mc.options.renderDistance, + mc.getRenderDistance(), farPlaneBlockDistance * LodUtil.CHUNK_WIDTH * 2); // add the screen space distortions @@ -565,9 +567,9 @@ public class LodRenderer { // Determine if the player has night vision boolean playerHasNightVision = false; - if (this.mc.player != null) + if (this.mc.getPlayer() != null) { - Iterator iterator = this.mc.player.getActiveEffects().iterator(); + Iterator iterator = this.mc.getPlayer().getActiveEffects().iterator(); while (iterator.hasNext()) { EffectInstance instance = iterator.next(); @@ -580,9 +582,9 @@ public class LodRenderer } - float sunBrightness = lodDimension.dimension.hasSkyLight() ? mc.level.getSkyDarken(partialTicks) : 0.2f; + float sunBrightness = lodDimension.dimension.hasSkyLight() ? mc.getSkyDarken(partialTicks) : 0.2f; sunBrightness = playerHasNightVision ? 1.0f : sunBrightness; - float gammaMultiplyer = (float) mc.options.gamma - 0.5f; + float gammaMultiplyer = (float) mc.getOptions().gamma - 0.5f; float lightStrength = ((sunBrightness / 2f) - 0.2f) + (gammaMultiplyer * 0.3f); float lightAmbient[] = {lightStrength, lightStrength, lightStrength, 1.0f}; @@ -656,7 +658,7 @@ public class LodRenderer private double getFov(float partialTicks, boolean useFovSetting) { - return mc.gameRenderer.getFov(mc.gameRenderer.getMainCamera(), partialTicks, useFovSetting); + return mc.getGameRenderer().getFov(mc.getGameRenderer().getMainCamera(), partialTicks, useFovSetting); } @@ -775,24 +777,23 @@ public class LodRenderer /** * Determines if the LODs should have a fullRegen or partialRegen */ - @SuppressWarnings("unchecked") private void determineIfLodsShouldRegenerate(LodDimension lodDim) { - short renderDistance = (short) mc.options.renderDistance; + short renderDistance = (short) mc.getRenderDistance(); //=============// // full regens // //=============// // check if the view distance changed if (ClientProxy.previousLodRenderDistance != LodConfig.CLIENT.graphics.lodChunkRenderDistance.get() - || mc.options.renderDistance != prevRenderDistance + || mc.getRenderDistance() != prevRenderDistance || prevFogDistance != LodConfig.CLIENT.graphics.fogDistance.get()) { DetailDistanceUtil.updateSettings(); fullRegen = true; - previousPos.changeParameters((byte) 4, mc.player.xChunk, mc.player.zChunk); + previousPos.changeParameters((byte) 4, mc.getPlayer().xChunk, mc.getPlayer().zChunk); prevFogDistance = LodConfig.CLIENT.graphics.fogDistance.get(); - prevRenderDistance = mc.options.renderDistance; + prevRenderDistance = mc.getRenderDistance(); //should use this when it's ready vanillaRenderedChunks = new boolean[renderDistance*2+2][renderDistance*2+2]; } @@ -811,11 +812,11 @@ public class LodRenderer if (newTime - prevPlayerPosTime > LodConfig.CLIENT.buffers.bufferRebuildPlayerMoveTimeout.get()) { if (previousPos.detailLevel == 0 - || mc.player.xChunk != previousPos.posX - || mc.player.zChunk != previousPos.posZ) + || mc.getPlayer().xChunk != previousPos.posX + || mc.getPlayer().zChunk != previousPos.posZ) { fullRegen = true; - previousPos.changeParameters((byte) 4, mc.player.xChunk, mc.player.zChunk); + previousPos.changeParameters((byte) 4, mc.getPlayer().xChunk, mc.getPlayer().zChunk); //should use this when it's ready vanillaRenderedChunks = new boolean[renderDistance*2+2][renderDistance*2+2]; } @@ -861,13 +862,13 @@ public class LodRenderer //==============// // determine which LODs should not be rendered close to the player - HashSet chunkPosToSkip = LodUtil.getNearbyLodChunkPosToSkip(lodDim, mc.player.blockPosition()); + HashSet chunkPosToSkip = LodUtil.getNearbyLodChunkPosToSkip(lodDim, mc.getPlayer().blockPosition()); int chunkX; int chunkZ; for (ChunkPos pos : chunkPosToSkip) { - chunkX = pos.x - mc.player.xChunk + renderDistance + 1; - chunkZ = pos.z - mc.player.zChunk + renderDistance + 1; + chunkX = pos.x - mc.getPlayer().xChunk + renderDistance + 1; + chunkZ = pos.z - mc.getPlayer().zChunk + renderDistance + 1; try { if (!vanillaRenderedChunks[chunkX][chunkZ]) @@ -884,7 +885,7 @@ public class LodRenderer // if the player is high enough, draw all LODs - if(chunkPosToSkip.isEmpty() && mc.player.position().y > 256) + if(chunkPosToSkip.isEmpty() && mc.getPlayer().position().y > 256) { vanillaRenderedChunks = new boolean[renderDistance*2+2][renderDistance*2+2]; vanillaRenderedChunksChanged = true; diff --git a/src/main/java/com/seibel/lod/render/RenderUtil.java b/src/main/java/com/seibel/lod/render/RenderUtil.java index 2cc40ec79..d9df8fbea 100644 --- a/src/main/java/com/seibel/lod/render/RenderUtil.java +++ b/src/main/java/com/seibel/lod/render/RenderUtil.java @@ -20,8 +20,8 @@ package com.seibel.lod.render; import com.seibel.lod.config.LodConfig; import com.seibel.lod.enums.LodTemplate; import com.seibel.lod.util.LodUtil; +import com.seibel.lod.wrapper.MinecraftWrapper; -import net.minecraft.client.Minecraft; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.ChunkPos; import net.minecraft.util.math.vector.Vector3d; @@ -35,7 +35,7 @@ import net.minecraft.util.math.vector.Vector3d; */ public class RenderUtil { - private static final Minecraft mc = Minecraft.getInstance(); + private static final MinecraftWrapper mc = MinecraftWrapper.INSTANCE; /** @@ -44,28 +44,24 @@ public class RenderUtil */ public static boolean isChunkPosInLoadedArea(ChunkPos pos, ChunkPos center) { - Minecraft mc = Minecraft.getInstance(); - - return (pos.x >= center.x - mc.options.renderDistance - && pos.x <= center.x + mc.options.renderDistance) + return (pos.x >= center.x - mc.getRenderDistance() + && pos.x <= center.x + mc.getRenderDistance()) && - (pos.z >= center.z - mc.options.renderDistance - && pos.z <= center.z + mc.options.renderDistance); + (pos.z >= center.z - mc.getRenderDistance() + && pos.z <= center.z + mc.getRenderDistance()); } /** * Returns if the given coordinate is in the loaded area of the world. * @param centerCoordinate the center of the loaded world */ - public static boolean isCoordinateInLoadedArea(int i, int j, int centerCoordinate) + public static boolean isCoordinateInLoadedArea(int x, int z, int centerCoordinate) { - Minecraft mc = Minecraft.getInstance(); - - return (i >= centerCoordinate - mc.options.renderDistance - && i <= centerCoordinate + mc.options.renderDistance) + return (x >= centerCoordinate - mc.getRenderDistance() + && x <= centerCoordinate + mc.getRenderDistance()) && - (j >= centerCoordinate - mc.options.renderDistance - && j <= centerCoordinate + mc.options.renderDistance); + (z >= centerCoordinate - mc.getRenderDistance() + && z <= centerCoordinate + mc.getRenderDistance()); } @@ -109,7 +105,7 @@ public class RenderUtil int maxNumberOfLods = LodRenderer.MAX_ALOCATEABLE_DIRECT_MEMORY / lodTemplate.getBufferMemoryForSingleLod(); int numbLodsWide = (int) Math.sqrt(maxNumberOfLods); - return numbLodsWide / (2 * mc.options.renderDistance); + return numbLodsWide / (2 * mc.getRenderDistance()); } diff --git a/src/main/java/com/seibel/lod/util/DetailDistanceUtil.java b/src/main/java/com/seibel/lod/util/DetailDistanceUtil.java index a2d09628f..e9c0cfcc2 100644 --- a/src/main/java/com/seibel/lod/util/DetailDistanceUtil.java +++ b/src/main/java/com/seibel/lod/util/DetailDistanceUtil.java @@ -4,8 +4,7 @@ import com.seibel.lod.config.LodConfig; import com.seibel.lod.enums.DistanceGenerationMode; import com.seibel.lod.enums.LodDetail; import com.seibel.lod.objects.RegionPos; - -import net.minecraft.client.Minecraft; +import com.seibel.lod.wrapper.MinecraftWrapper; public class DetailDistanceUtil { @@ -59,7 +58,7 @@ public class DetailDistanceUtil initial = LodConfig.CLIENT.graphics.lodQuality.get() * 128; return (int) (Math.pow(base, detail) * initial); case RENDER_DEPENDANT: - int realRenderDistance = Minecraft.getInstance().options.renderDistance * 16; + int realRenderDistance = MinecraftWrapper.INSTANCE.getRenderDistance() * 16; int border = 64; byte detailAtBorder = (byte) 4; if (detail > detailAtBorder) diff --git a/src/main/java/com/seibel/lod/util/LodUtil.java b/src/main/java/com/seibel/lod/util/LodUtil.java index 313ad01c7..98498d537 100644 --- a/src/main/java/com/seibel/lod/util/LodUtil.java +++ b/src/main/java/com/seibel/lod/util/LodUtil.java @@ -24,10 +24,12 @@ import java.util.HashSet; import com.seibel.lod.objects.LodDimension; import com.seibel.lod.objects.RegionPos; import com.seibel.lod.objects.LevelPos.LevelPos; +import com.seibel.lod.wrapper.MinecraftWrapper; -import net.minecraft.client.Minecraft; +import it.unimi.dsi.fastutil.objects.ObjectList; import net.minecraft.client.multiplayer.ServerData; import net.minecraft.client.renderer.WorldRenderer; +import net.minecraft.client.renderer.WorldRenderer.LocalRenderInformationContainer; import net.minecraft.server.integrated.IntegratedServer; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.ChunkPos; @@ -47,7 +49,7 @@ import net.minecraft.world.server.ServerWorld; */ public class LodUtil { - private static Minecraft mc = Minecraft.getInstance(); + private static MinecraftWrapper mc = MinecraftWrapper.INSTANCE; /** alpha used when drawing chunks in debug mode */ @@ -226,8 +228,6 @@ public class LodUtil */ public static String getDimensionIDFromWorld(IWorld world) { - Minecraft mc = Minecraft.getInstance(); - if(mc.hasSingleplayerServer()) { // this will return the world save location @@ -313,7 +313,7 @@ public class LodUtil */ public static HashSet getNearbyLodChunkPosToSkip(LodDimension lodDim, BlockPos playerPos) { - int chunkRenderDist = mc.options.renderDistance; + int chunkRenderDist = mc.getRenderDistance(); ChunkPos centerChunk = new ChunkPos(playerPos); // skip chunks that are already going to be rendered by Minecraft @@ -355,19 +355,22 @@ public class LodUtil { HashSet loadedPos = new HashSet<>(); - Minecraft mc = Minecraft.getInstance(); - // Wow those are some long names! - // go through every RenderInfo to get the compiled chunks - for (WorldRenderer.LocalRenderInformationContainer worldrenderer$localrenderinformationcontainer : mc.levelRenderer.renderChunks) + // auto close the LevelRenderer once it is done being used (similar to using in C#) + try (WorldRenderer renderer = mc.getLevelRenderer()) { - if (!worldrenderer$localrenderinformationcontainer.chunk.getCompiledChunk().hasNoRenderableLayers()) + // go through every RenderInfo to get the compiled chunks + ObjectList chunks = renderer.renderChunks; + for (WorldRenderer.LocalRenderInformationContainer worldrenderer$localrenderinformationcontainer : chunks) { - // add the ChunkPos for every empty compiled chunk - BlockPos bpos = worldrenderer$localrenderinformationcontainer.chunk.getOrigin(); - - loadedPos.add(new ChunkPos(bpos)); + if (!worldrenderer$localrenderinformationcontainer.chunk.getCompiledChunk().hasNoRenderableLayers()) + { + // add the ChunkPos for every empty compiled chunk + BlockPos bpos = worldrenderer$localrenderinformationcontainer.chunk.getOrigin(); + + loadedPos.add(new ChunkPos(bpos)); + } } } diff --git a/src/main/java/com/seibel/lod/wrapper/MinecraftWrapper.java b/src/main/java/com/seibel/lod/wrapper/MinecraftWrapper.java new file mode 100644 index 000000000..e7e772b23 --- /dev/null +++ b/src/main/java/com/seibel/lod/wrapper/MinecraftWrapper.java @@ -0,0 +1,137 @@ +package com.seibel.lod.wrapper; + +import java.io.File; + +import com.seibel.lod.util.LodUtil; + +import net.minecraft.client.GameSettings; +import net.minecraft.client.MainWindow; +import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.player.ClientPlayerEntity; +import net.minecraft.client.multiplayer.ServerData; +import net.minecraft.client.network.play.ClientPlayNetHandler; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.client.renderer.WorldRenderer; +import net.minecraft.entity.Entity; +import net.minecraft.profiler.IProfiler; +import net.minecraft.server.integrated.IntegratedServer; +import net.minecraft.util.Direction; +import net.minecraft.world.DimensionType; + +/** + * A singleton that wraps the Minecraft class + * to allow for easier movement between Minecraft versions. + * + * @author James Seibel + * @version 9-6-2021 + */ +public class MinecraftWrapper +{ + public static MinecraftWrapper INSTANCE = new MinecraftWrapper(); + + private Minecraft mc = Minecraft.getInstance(); + + private MinecraftWrapper() + { + + } + + + + //=================// + // method wrappers // + //=================// + + public float getShading(Direction direction) + { + return mc.level.getShade(Direction.UP, true); + } + + public boolean hasSingleplayerServer() + { + return mc.hasSingleplayerServer(); + } + + public DimensionType getCurrentDimension() + { + return mc.player.level.dimensionType(); + } + + public String getCurrentDimensionId() + { + return LodUtil.getDimensionIDFromWorld(mc.level); + } + + + + + //=============// + // Simple gets // + //=============// + + public ClientPlayerEntity getPlayer() + { + return mc.player; + } + + public GameSettings getOptions() + { + return mc.options; + } + + /** Measured in chunks */ + public int getRenderDistance() + { + return mc.options.renderDistance; + } + + public File getGameDirectory() + { + return mc.gameDirectory; + } + + public IProfiler getProfiler() + { + return mc.getProfiler(); + } + + public ClientPlayNetHandler getConnection() + { + return mc.getConnection(); + } + + public GameRenderer getGameRenderer() + { + return mc.gameRenderer; + } + + public Entity getCameraEntity() + { + return mc.cameraEntity; + } + + public MainWindow getWindow() + { + return mc.getWindow(); + } + + public float getSkyDarken(float partialTicks) + { + return mc.level.getSkyDarken(partialTicks); + } + + public IntegratedServer getSingleplayerServer() + { + return mc.getSingleplayerServer(); + } + + public ServerData getCurrentServer() + { + return mc.getCurrentServer(); + } + + public WorldRenderer getLevelRenderer() + { + return mc.levelRenderer; + } +}