project = rootProject.project(":fabric")
taskNames = Collections.singletonList("runServer")
}
-// "Forge: Minecraft Client"(org.jetbrains.gradle.ext.Gradle) {
-// project = rootProject.project(":forge")
-// taskNames = Collections.singletonList("runClient")
-// }
-// "Forge: Minecraft Server"(org.jetbrains.gradle.ext.Gradle) {
-// project = rootProject.project(":forge")
-// taskNames = Collections.singletonList("runServer")
-// }
+ "Forge: Minecraft Client"(org.jetbrains.gradle.ext.Gradle) {
+ project = rootProject.project(":forge")
+ taskNames = Collections.singletonList("runClient")
+ }
+ "Forge: Minecraft Server"(org.jetbrains.gradle.ext.Gradle) {
+ project = rootProject.project(":forge")
+ taskNames = Collections.singletonList("runServer")
+ }
}
}
plugins {
- id("fabric-loom") version "0.5-SNAPSHOT"
+ id("fabric-loom") version "0.4-SNAPSHOT"
}
minecraft {
--- /dev/null
+package me.shedaniel.lightoverlay.fabric;
+
+import net.minecraft.client.render.Frustum;
+import net.minecraft.client.util.math.Vector4f;
+
+public class FrustumHelper {
+ public static boolean isVisible(Frustum frustum, double minX, double minY, double minZ, double maxX, double maxY, double maxZ) {
+ float x1 = (float) (minX - frustum.x);
+ float y1 = (float) (minY - frustum.y);
+ float z1 = (float) (minZ - frustum.z);
+ float x2 = (float) (maxX - frustum.x);
+ float y2 = (float) (maxY - frustum.y);
+ float z2 = (float) (maxZ - frustum.z);
+ return isAnyCornerVisible(frustum, x1, y1, z1, x2, y2, z2);
+ }
+
+ private static boolean isAnyCornerVisible(Frustum frustum, float x1, float y1, float z1, float x2, float y2, float z2) {
+ Vector4f[] homogeneousCoordinates = frustum.homogeneousCoordinates;
+ for (Vector4f vector4f : homogeneousCoordinates) {
+ if (dotProduct(vector4f, x1, y1, z1, 1.0F) <= 0.0F && dotProduct(vector4f, x2, y1, z1, 1.0F) <= 0.0F && dotProduct(vector4f, x1, y2, z1, 1.0F) <= 0.0F && dotProduct(vector4f, x2, y2, z1, 1.0F) <= 0.0F && dotProduct(vector4f, x1, y1, z2, 1.0F) <= 0.0F && dotProduct(vector4f, x2, y1, z2, 1.0F) <= 0.0F && dotProduct(vector4f, x1, y2, z2, 1.0F) <= 0.0F && dotProduct(vector4f, x2, y2, z2, 1.0F) <= 0.0F) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ private static float dotProduct(Vector4f self, float x, float y, float z, float w) {
+ return self.getX() * x + self.getY() * y + self.getZ() * z + self.getW() * w;
+ }
+}
import net.minecraft.client.network.ClientPlayerEntity;
import net.minecraft.client.options.KeyBinding;
import net.minecraft.client.render.Camera;
+import net.minecraft.client.render.Frustum;
import net.minecraft.client.render.Tessellator;
import net.minecraft.client.render.VertexConsumerProvider;
import net.minecraft.client.util.InputUtil;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.DecimalFormat;
-import java.util.*;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
private static boolean enabled = false;
private static EntityType<Entity> testingEntityType;
private static int threadNumber = 0;
+ public static Frustum frustum;
private static final ThreadPoolExecutor EXECUTOR = (ThreadPoolExecutor) Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors(), r -> {
Thread thread = new Thread(r, "light-overlay-" + threadNumber++);
thread.setDaemon(true);
RenderSystem.enableTexture();
RenderSystem.depthMask(true);
BlockPos.Mutable mutable = new BlockPos.Mutable();
+ BlockPos.Mutable downMutable = new BlockPos.Mutable();
for (Map.Entry<ChunkPos, Long2ReferenceMap<Object>> entry : CHUNK_MAP.entrySet()) {
if (caching && (MathHelper.abs(entry.getKey().x - playerPosX) > getChunkRange() || MathHelper.abs(entry.getKey().z - playerPosZ) > getChunkRange())) {
continue;
if (objectEntry.getValue() instanceof Integer) {
mutable.set(BlockPos.unpackLongX(objectEntry.getLongKey()), BlockPos.unpackLongY(objectEntry.getLongKey()), BlockPos.unpackLongZ(objectEntry.getLongKey()));
if (mutable.isWithinDistance(playerPos, reach)) {
- BlockPos down = mutable.down();
- LightOverlay.renderLevel(CLIENT, camera, world, mutable, down, (Integer) objectEntry.getValue(), entityContext);
+ if (frustum == null || FrustumHelper.isVisible(frustum, mutable.getX(), mutable.getY(), mutable.getZ(), mutable.getX() + 1, mutable.getX() + 1, mutable.getX() + 1)) {
+ downMutable.set(mutable.getX(), mutable.getY() - 1, mutable.getZ());
+ LightOverlay.renderLevel(CLIENT, camera, world, mutable, downMutable, (Integer) objectEntry.getValue(), entityContext);
+ }
}
}
}
if (objectEntry.getValue() instanceof CrossType) {
mutable.set(BlockPos.unpackLongX(objectEntry.getLongKey()), BlockPos.unpackLongY(objectEntry.getLongKey()), BlockPos.unpackLongZ(objectEntry.getLongKey()));
if (mutable.isWithinDistance(playerPos, reach)) {
- int color = objectEntry.getValue() == CrossType.RED ? redColor : objectEntry.getValue() == CrossType.YELLOW ? yellowColor : secondaryColor;
- LightOverlay.renderCross(camera, world, mutable, color, entityContext);
+ if (frustum == null || FrustumHelper.isVisible(frustum, mutable.getX(), mutable.getY(), mutable.getZ(), mutable.getX() + 1, mutable.getX() + 1, mutable.getX() + 1)) {
+ int color = objectEntry.getValue() == CrossType.RED ? redColor : objectEntry.getValue() == CrossType.YELLOW ? yellowColor : secondaryColor;
+ LightOverlay.renderCross(camera, world, mutable, color, entityContext);
+ }
}
}
}
--- /dev/null
+package me.shedaniel.lightoverlay.fabric.mixin;
+
+import me.shedaniel.lightoverlay.fabric.LightOverlay;
+import net.minecraft.client.render.Camera;
+import net.minecraft.client.render.Frustum;
+import net.minecraft.client.render.WorldRenderer;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+
+@Mixin(WorldRenderer.class)
+public class MixinWorldRenderer {
+ @Inject(method = "setupTerrain", at = @At("HEAD"))
+ private void setupTerrain(Camera camera, Frustum frustum, boolean hasForcedFrustum, int frame, boolean spectator, CallbackInfo ci) {
+ LightOverlay.frustum = frustum;
+ }
+}
accessWidener v1 named
-accessible field net/minecraft/network/packet/s2c/play/ChunkDeltaUpdateS2CPacket sectionPos Lnet/minecraft/util/math/ChunkSectionPos;
\ No newline at end of file
+accessible field net/minecraft/network/packet/s2c/play/ChunkDeltaUpdateS2CPacket sectionPos Lnet/minecraft/util/math/ChunkSectionPos;
+accessible field net/minecraft/client/render/Frustum x D
+accessible field net/minecraft/client/render/Frustum y D
+accessible field net/minecraft/client/render/Frustum z D
+accessible field net/minecraft/client/render/Frustum homogeneousCoordinates [Lnet/minecraft/client/util/math/Vector4f;
\ No newline at end of file
"compatibilityLevel": "JAVA_8",
"mixins": [],
"client": [
- "MixinClientConnection"
+ "MixinClientConnection",
+ "MixinWorldRenderer"
],
"injectors": {
"defaultRequire": 1
minecraft {
mappings(channel: "snapshot", version: rootProject.mcp_snapshot)
+ accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg')
runs {
client {
workingDirectory project.file("run")
--- /dev/null
+package me.shedaniel.lightoverlay.forge;
+
+import net.minecraft.client.renderer.culling.ClippingHelper;
+import net.minecraft.util.math.vector.Vector4f;
+
+public class FrustumHelper {
+ public static boolean isVisible(ClippingHelper frustum, double minX, double minY, double minZ, double maxX, double maxY, double maxZ) {
+ float x1 = (float) (minX - frustum.cameraX);
+ float y1 = (float) (minY - frustum.cameraY);
+ float z1 = (float) (minZ - frustum.cameraZ);
+ float x2 = (float) (maxX - frustum.cameraX);
+ float y2 = (float) (maxY - frustum.cameraY);
+ float z2 = (float) (maxZ - frustum.cameraZ);
+ return isAnyCornerVisible(frustum, x1, y1, z1, x2, y2, z2);
+ }
+
+ private static boolean isAnyCornerVisible(ClippingHelper frustum, float x1, float y1, float z1, float x2, float y2, float z2) {
+ Vector4f[] homogeneousCoordinates = frustum.frustum;
+ for (Vector4f vector4f : homogeneousCoordinates) {
+ if (dotProduct(vector4f, x1, y1, z1, 1.0F) <= 0.0F && dotProduct(vector4f, x2, y1, z1, 1.0F) <= 0.0F && dotProduct(vector4f, x1, y2, z1, 1.0F) <= 0.0F && dotProduct(vector4f, x2, y2, z1, 1.0F) <= 0.0F && dotProduct(vector4f, x1, y1, z2, 1.0F) <= 0.0F && dotProduct(vector4f, x2, y1, z2, 1.0F) <= 0.0F && dotProduct(vector4f, x1, y2, z2, 1.0F) <= 0.0F && dotProduct(vector4f, x2, y2, z2, 1.0F) <= 0.0F) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ private static float dotProduct(Vector4f self, float x, float y, float z, float w) {
+ return self.getX() * x + self.getY() * y + self.getZ() * z + self.getW() * w;
+ }
+}
import com.google.common.collect.Maps;
import com.mojang.blaze3d.platform.GlStateManager;
import com.mojang.blaze3d.systems.RenderSystem;
+import it.unimi.dsi.fastutil.longs.Long2ReferenceMap;
+import it.unimi.dsi.fastutil.longs.Long2ReferenceOpenHashMap;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.ActiveRenderInfo;
import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.Tessellator;
+import net.minecraft.client.renderer.culling.ClippingHelper;
import net.minecraft.client.settings.KeyBinding;
import net.minecraft.client.util.InputMappings;
import net.minecraft.client.world.ClientWorld;
import net.minecraft.world.IBlockReader;
import net.minecraft.world.LightType;
import net.minecraft.world.World;
-import net.minecraft.world.biome.Biome;
+import net.minecraft.world.biome.MobSpawnInfo;
import net.minecraft.world.chunk.Chunk;
import net.minecraft.world.chunk.ChunkStatus;
import net.minecraft.world.lighting.IWorldLightListener;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.DistExecutor;
import net.minecraftforge.fml.client.registry.ClientRegistry;
-import net.minecraftforge.fml.common.ObfuscationReflectionHelper;
import org.apache.logging.log4j.LogManager;
import org.lwjgl.opengl.GL11;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.DecimalFormat;
-import java.util.*;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
private static boolean enabled = false;
private static EntityType<Entity> testingEntityType;
private static int threadNumber = 0;
+ public static ClippingHelper frustum;
private static final ExecutorService EXECUTOR = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors(), r -> {
Thread thread = new Thread(r, "light-overlay-" + threadNumber++);
thread.setDaemon(true);
return thread;
});
private static final List<ChunkPos> POS = Lists.newCopyOnWriteArrayList();
- private static final Map<ChunkPos, Map<Long, Object>> CHUNK_MAP = Maps.newConcurrentMap();
+ private static final Map<ChunkPos, Long2ReferenceMap<Object>> CHUNK_MAP = Maps.newConcurrentMap();
private static long ticks = 0;
static {
CHUNK_MAP.clear();
ClientPlayerEntity player = minecraft.player;
ClientWorld world = minecraft.world;
- BlockPos playerPos = player.func_233580_cy_();
+ BlockPos playerPos = player.getPosition();
ISelectionContext entityContext = ISelectionContext.forEntity(player);
IWorldLightListener block = world.getLightManager().getLightEngine(LightType.BLOCK);
IWorldLightListener sky = showNumber ? null : world.getLightManager().getLightEngine(LightType.SKY);
BlockPos.Mutable downPos = new BlockPos.Mutable();
Iterable<BlockPos> iterate = BlockPos.getAllInBoxMutable(playerPos.getX() - reach, playerPos.getY() - reach, playerPos.getZ() - reach,
playerPos.getX() + reach, playerPos.getY() + reach, playerPos.getZ() + reach);
- HashMap<Long, Object> map = Maps.newHashMap();
+ Long2ReferenceMap<Object> map = new Long2ReferenceOpenHashMap<>();
CHUNK_MAP.put(new ChunkPos(0, 0), map);
for (BlockPos blockPos : iterate) {
downPos.setPos(blockPos.getX(), blockPos.getY() - 1, blockPos.getZ());
if (showNumber) {
int level = getCrossLevel(blockPos, downPos, world, block, entityContext);
if (level >= 0) {
- map.put(blockPos.toLong(), level);
+ map.put(blockPos.toLong(), Integer.valueOf(level));
}
} else {
CrossType type = getCrossType(blockPos, downPos, world, block, sky, entityContext);
}
}
}
- if (!POS.isEmpty()) {
- if (playerPos[0] == null) {
- playerPos[0] = player.getPositionVec();
- }
- ChunkPos pos = POS.stream().min(Comparator.comparingDouble(value -> value.getBlock(8, 0, 8).distanceSq(playerPos[0].x, 0, playerPos[0].z, false))).get();
- EXECUTOR.submit(() -> {
- if (MathHelper.abs(pos.x - playerPosX) <= getChunkRange() && MathHelper.abs(pos.z - playerPosZ) <= getChunkRange()) {
- calculateChunk(world.getChunkProvider().getChunk(pos.x, pos.z, ChunkStatus.FULL, false), world, pos, selectionContext);
- } else {
- CHUNK_MAP.remove(pos);
+ POS.removeIf(pos -> MathHelper.abs(pos.x - playerPosX) > getChunkRange() || MathHelper.abs(pos.z - playerPosZ) > getChunkRange());
+ for (int k = 0; k < 2; k++) {
+ if (!POS.isEmpty()) {
+ if (playerPos[0] == null) {
+ playerPos[0] = player.getPositionVec();
}
- });
- POS.remove(pos);
+ ChunkPos pos = POS.stream().min(Comparator.comparingDouble(value -> {
+ int i = Math.abs(value.x - playerPosX);
+ int j = Math.abs(value.z - playerPosZ);
+ return i * i + j * j;
+ })).get();
+ POS.remove(pos);
+ EXECUTOR.submit(() -> {
+ try {
+ calculateChunk(world.getChunkProvider().getChunk(pos.x, pos.z, ChunkStatus.FULL, false), world, pos, selectionContext);
+ } catch (Throwable throwable) {
+ LogManager.getLogger().throwing(throwable);
+ }
+ });
+ }
}
if (ticks % 50 == 0) {
- Iterator<Map.Entry<ChunkPos, Map<Long, Object>>> chunkMapIterator = CHUNK_MAP.entrySet().iterator();
- while (chunkMapIterator.hasNext()) {
- Map.Entry<ChunkPos, Map<Long, Object>> pos = chunkMapIterator.next();
- if (MathHelper.abs(pos.getKey().x - playerPosX) > getChunkRange() * 2 || MathHelper.abs(pos.getKey().z - playerPosZ) > getChunkRange() * 2) {
- chunkMapIterator.remove();
- }
- }
+ CHUNK_MAP.entrySet().removeIf(pos -> MathHelper.abs(pos.getKey().x - playerPosX) > getChunkRange() * 2 || MathHelper.abs(pos.getKey().z - playerPosZ) > getChunkRange() * 2);
}
}
}
}
}
+ public static void updateFrustum(ClippingHelper helper) {
+ frustum = helper;
+ }
+
private static void calculateChunk(Chunk chunk, World world, ChunkPos chunkPos, ISelectionContext selectionContext) {
- Map<Long, Object> map = Maps.newHashMap();
- if (chunk != null) {
+ if (world != null && chunk != null) {
+ Long2ReferenceMap<Object> map = new Long2ReferenceOpenHashMap<>();
IWorldLightListener block = chunk.getWorldLightManager().getLightEngine(LightType.BLOCK);
IWorldLightListener sky = showNumber ? null : chunk.getWorldLightManager().getLightEngine(LightType.SKY);
for (BlockPos pos : BlockPos.getAllInBoxMutable(chunkPos.getXStart(), 0, chunkPos.getZStart(), chunkPos.getXEnd(), 256, chunkPos.getZEnd())) {
if (showNumber) {
int level = LightOverlayClient.getCrossLevel(pos, down, chunk, block, selectionContext);
if (level >= 0) {
- map.put(pos.toLong(), level);
+ map.put(pos.toLong(), Integer.valueOf(level));
}
} else {
- Biome biome = world.getBiomeManager().getBiome(pos);
- if (biome.getSpawningChance() > 0 && !biome.getSpawns(EntityClassification.MONSTER).isEmpty()) {
+ MobSpawnInfo spawnInfo = world.getBiomeManager().getBiome(pos).func_242433_b();
+ if (spawnInfo.func_242557_a() > 0 && !spawnInfo.func_242559_a(EntityClassification.MONSTER).isEmpty()) {
CrossType type = LightOverlayClient.getCrossType(pos, down, chunk, block, sky, selectionContext);
if (type != CrossType.NONE) {
map.put(pos.toLong(), type);
}
}
}
+ CHUNK_MAP.put(chunkPos, map);
+ } else {
+ CHUNK_MAP.remove(chunkPos);
}
- CHUNK_MAP.put(chunkPos, map);
}
public static void renderWorldLast() {
int playerPosZ = ((int) playerEntity.getPosZ()) >> 4;
ISelectionContext selectionContext = ISelectionContext.forEntity(playerEntity);
World world = client.world;
- BlockPos playerPos = playerEntity.func_233580_cy_();
+ BlockPos playerPos = playerEntity.getPosition();
ActiveRenderInfo info = client.gameRenderer.getActiveRenderInfo();
if (showNumber) {
RenderSystem.enableTexture();
RenderSystem.depthMask(true);
BlockPos.Mutable mutable = new BlockPos.Mutable();
- for (Map.Entry<ChunkPos, Map<Long, Object>> entry : CHUNK_MAP.entrySet()) {
+ BlockPos.Mutable downMutable = new BlockPos.Mutable();
+ for (Map.Entry<ChunkPos, Long2ReferenceMap<Object>> entry : CHUNK_MAP.entrySet()) {
if (caching && (MathHelper.abs(entry.getKey().x - playerPosX) > getChunkRange() || MathHelper.abs(entry.getKey().z - playerPosZ) > getChunkRange())) {
continue;
}
- for (Map.Entry<Long, Object> objectEntry : entry.getValue().entrySet()) {
+ for (Long2ReferenceMap.Entry<Object> objectEntry : entry.getValue().long2ReferenceEntrySet()) {
if (objectEntry.getValue() instanceof Integer) {
- mutable.setPos(BlockPos.unpackX(objectEntry.getKey()), BlockPos.unpackY(objectEntry.getKey()), BlockPos.unpackZ(objectEntry.getKey()));
+ mutable.setPos(BlockPos.unpackX(objectEntry.getLongKey()), BlockPos.unpackY(objectEntry.getLongKey()), BlockPos.unpackZ(objectEntry.getLongKey()));
if (mutable.withinDistance(playerPos, reach)) {
- BlockPos down = mutable.down();
- LightOverlayClient.renderLevel(client, info, world, mutable, down, (Integer) objectEntry.getValue(), selectionContext);
+ if (frustum == null || FrustumHelper.isVisible(frustum, mutable.getX(), mutable.getY(), mutable.getZ(), mutable.getX() + 1, mutable.getX() + 1, mutable.getX() + 1)) {
+ downMutable.setPos(mutable.getX(), mutable.getY() - 1, mutable.getZ());
+ LightOverlayClient.renderLevel(client, info, world, mutable, downMutable, (Integer) objectEntry.getValue(), selectionContext);
+ }
}
}
}
GL11.glLineWidth(lineWidth);
GL11.glBegin(GL11.GL_LINES);
BlockPos.Mutable mutable = new BlockPos.Mutable();
- for (Map.Entry<ChunkPos, Map<Long, Object>> entry : CHUNK_MAP.entrySet()) {
+ for (Map.Entry<ChunkPos, Long2ReferenceMap<Object>> entry : CHUNK_MAP.entrySet()) {
if (caching && (MathHelper.abs(entry.getKey().x - playerPosX) > getChunkRange() || MathHelper.abs(entry.getKey().z - playerPosZ) > getChunkRange())) {
continue;
}
- for (Map.Entry<Long, Object> objectEntry : entry.getValue().entrySet()) {
+ for (Long2ReferenceMap.Entry<Object> objectEntry : entry.getValue().long2ReferenceEntrySet()) {
if (objectEntry.getValue() instanceof CrossType) {
- mutable.setPos(BlockPos.unpackX(objectEntry.getKey()), BlockPos.unpackY(objectEntry.getKey()), BlockPos.unpackZ(objectEntry.getKey()));
+ mutable.setPos(BlockPos.unpackX(objectEntry.getLongKey()), BlockPos.unpackY(objectEntry.getLongKey()), BlockPos.unpackZ(objectEntry.getLongKey()));
if (mutable.withinDistance(playerPos, reach)) {
- BlockPos down = mutable.down();
- int color = objectEntry.getValue() == CrossType.RED ? redColor : objectEntry.getValue() == CrossType.YELLOW ? yellowColor : secondaryColor;
- renderCross(info, world, mutable, color, selectionContext);
+ if (frustum == null || FrustumHelper.isVisible(frustum, mutable.getX(), mutable.getY(), mutable.getZ(), mutable.getX() + 1, mutable.getX() + 1, mutable.getX() + 1)) {
+ int color = objectEntry.getValue() == CrossType.RED ? redColor : objectEntry.getValue() == CrossType.YELLOW ? yellowColor : secondaryColor;
+ renderCross(info, world, mutable, color, selectionContext);
+ }
}
}
}
} else if (packet instanceof SChunkDataPacket) {
LightOverlayClient.queueChunkAndNear(new ChunkPos(((SChunkDataPacket) packet).getChunkX(), ((SChunkDataPacket) packet).getChunkZ()));
} else if (packet instanceof SMultiBlockChangePacket) {
- ChunkPos chunkPos = ObfuscationReflectionHelper.getPrivateValue(SMultiBlockChangePacket.class, (SMultiBlockChangePacket) packet, "field_148925_b");
- LightOverlayClient.queueChunkAndNear(new ChunkPos(chunkPos.x, chunkPos.z));
+ LightOverlayClient.queueChunkAndNear(new ChunkPos(((SMultiBlockChangePacket) packet).field_244305_a.getSectionX(), ((SMultiBlockChangePacket) packet).field_244305_a.getSectionZ()));
} else if (packet instanceof SUpdateLightPacket) {
LightOverlayClient.queueChunkAndNear(new ChunkPos(((SUpdateLightPacket) packet).getChunkX(), ((SUpdateLightPacket) packet).getChunkZ()));
}
ConfigEntryBuilder eb = builder.entryBuilder();
ConfigCategory general = builder.getOrCreateCategory(new TranslationTextComponent("config.lightoverlay.general"));
- general.addEntry(eb.startTextDescription(ITextComponent.func_241827_a_("§7" + I18n.format("description.lightoverlay.caching"))).build());
+ general.addEntry(eb.startTextDescription(ITextComponent.func_244388_a("§7" + I18n.format("description.lightoverlay.caching"))).build());
general.addEntry(eb.startBooleanToggle(new TranslationTextComponent("config.lightoverlay.caching"), LightOverlayClient.caching).setDefaultValue(false).setSaveConsumer(bool -> LightOverlayClient.caching = bool).build());
- general.addEntry(eb.startIntSlider(new TranslationTextComponent("config.lightoverlay.reach"), LightOverlayClient.reach, 1, 64).setDefaultValue(12).setTextGetter(integer -> ITextComponent.func_241827_a_("Reach: " + integer + " Blocks")).setSaveConsumer(integer -> LightOverlayClient.reach = integer).build());
- IntegerSliderEntry crossLevel = eb.startIntSlider(new TranslationTextComponent("config.lightoverlay.crossLevel"), LightOverlayClient.crossLevel, 0, 15).setDefaultValue(7).setTextGetter(integer -> ITextComponent.func_241827_a_("Cross Level: " + integer)).setSaveConsumer(integer -> LightOverlayClient.crossLevel = integer).build();
+ general.addEntry(eb.startIntSlider(new TranslationTextComponent("config.lightoverlay.reach"), LightOverlayClient.reach, 1, 64).setDefaultValue(12).setTextGetter(integer -> ITextComponent.func_244388_a("Reach: " + integer + " Blocks")).setSaveConsumer(integer -> LightOverlayClient.reach = integer).build());
+ IntegerSliderEntry crossLevel = eb.startIntSlider(new TranslationTextComponent("config.lightoverlay.crossLevel"), LightOverlayClient.crossLevel, 0, 15).setDefaultValue(7).setTextGetter(integer -> ITextComponent.func_244388_a("Cross Level: " + integer)).setSaveConsumer(integer -> LightOverlayClient.crossLevel = integer).build();
general.addEntry(crossLevel);
general.addEntry(eb.startIntSlider(new TranslationTextComponent("config.lightoverlay.secondaryLevel"), LightOverlayClient.secondaryLevel, -1, 15)
.setErrorSupplier(integer -> {
- if (integer >= 0 && integer >= crossLevel.getValue()) return Optional.of(ITextComponent.func_241827_a_("Secondary Level cannot be higher than Cross Level!"));
+ if (integer >= 0 && integer >= crossLevel.getValue()) return Optional.of(ITextComponent.func_244388_a("Secondary Level cannot be higher than Cross Level!"));
return Optional.empty();
- }).setDefaultValue(-1).setTextGetter(integer -> ITextComponent.func_241827_a_(integer < 0 ? "Off" : "Level: " + integer)).setSaveConsumer(integer -> LightOverlayClient.secondaryLevel = integer).build());
+ }).setDefaultValue(-1).setTextGetter(integer -> ITextComponent.func_244388_a(integer < 0 ? "Off" : "Level: " + integer)).setSaveConsumer(integer -> LightOverlayClient.secondaryLevel = integer).build());
general.addEntry(eb.startBooleanToggle(new TranslationTextComponent("config.lightoverlay.showNumber"), LightOverlayClient.showNumber).setDefaultValue(false).setSaveConsumer(bool -> LightOverlayClient.showNumber = bool).build());
general.addEntry(eb.startBooleanToggle(new TranslationTextComponent("config.lightoverlay.smoothLines"), LightOverlayClient.smoothLines).setDefaultValue(true).setSaveConsumer(bool -> LightOverlayClient.smoothLines = bool).build());
general.addEntry(eb.startBooleanToggle(new TranslationTextComponent("config.lightoverlay.underwater"), LightOverlayClient.underwater).setDefaultValue(false).setSaveConsumer(bool -> LightOverlayClient.underwater = bool).build());
- general.addEntry(eb.startIntSlider(new TranslationTextComponent("config.lightoverlay.lineWidth"), MathHelper.floor(LightOverlayClient.lineWidth * 100), 100, 700).setDefaultValue(100).setTextGetter(integer -> ITextComponent.func_241827_a_("Light Width: " + LightOverlayClient.FORMAT.format(integer / 100d))).setSaveConsumer(integer -> LightOverlayClient.lineWidth = integer / 100f).build());
+ general.addEntry(eb.startIntSlider(new TranslationTextComponent("config.lightoverlay.lineWidth"), MathHelper.floor(LightOverlayClient.lineWidth * 100), 100, 700).setDefaultValue(100).setTextGetter(integer -> ITextComponent.func_244388_a("Light Width: " + LightOverlayClient.FORMAT.format(integer / 100d))).setSaveConsumer(integer -> LightOverlayClient.lineWidth = integer / 100f).build());
general.addEntry(eb.startColorField(new TranslationTextComponent("config.lightoverlay.yellowColor"), LightOverlayClient.yellowColor).setDefaultValue(0xFFFF00).setSaveConsumer(color -> LightOverlayClient.yellowColor = color).build());
general.addEntry(eb.startColorField(new TranslationTextComponent("config.lightoverlay.redColor"), LightOverlayClient.redColor).setDefaultValue(0xFF0000).setSaveConsumer(color -> LightOverlayClient.redColor = color).build());
general.addEntry(eb.startColorField(new TranslationTextComponent("config.lightoverlay.secondaryColor"), LightOverlayClient.secondaryColor).setDefaultValue(0x0000FF).setSaveConsumer(color -> LightOverlayClient.secondaryColor = color).build());
},
'transformer': function (classNode) {
var render = ASMAPI.mapMethod("func_229019_a_");
- for (i in classNode.methods) {
+ var setupTerrain = ASMAPI.mapMethod("func_228437_a_");
+ for (var i in classNode.methods) {
var method = classNode.methods[i];
if (method.name === render) {
var instructions = method.instructions;
}
}
break;
+ } else if (method.name === setupTerrain) {
+ var instructions = method.instructions;
+ instructions.insertBefore(new LabelNode());
+ instructions.insertBefore(new VarInsnNode(Opcodes.ALOAD, 2));
+ instructions.insertBefore(new MethodInsnNode(Opcodes.INVOKESTATIC, "me/shedaniel/lightoverlay/forge/LightOverlayClient", "updateFrustum", "(Lnet/minecraft/client/renderer/culling/ClippingHelper;)V", false));
}
}
return classNode;
--- /dev/null
+public net.minecraft.client.renderer.culling.ClippingHelper field_228949_b_ #cameraX
+public net.minecraft.client.renderer.culling.ClippingHelper field_228950_c_ #cameraY
+public net.minecraft.client.renderer.culling.ClippingHelper field_228951_d_ #cameraZ
+public net.minecraft.client.renderer.culling.ClippingHelper field_228948_a_ #frustum
+public net.minecraft.network.play.server.SMultiBlockChangePacket field_244305_a #field_244305_a
\ No newline at end of file
issueTrackerURL="https://github.com/shedaniel/LightOverlay/issues/" #optional
logoFile="icon.png"
authors="shedaniel"
+license="Apache-2.0"
[[mods]]
modId="lightoverlay-forge"
version="${file.jarVersion}"
org.gradle.jvmargs=-Xmx3G
org.gradle.daemon=false
-mod_version=5.5.0
+mod_version=5.5.1
# fabric
fabric_minecraft_version=1.16.2
modmenu_version=1.14.6+build.31
# forge
-mcp_snapshot=20200514-1.16
-forge_minecraft_version=1.16.1
-forge_version=32.0.7
-cloth_config_forge=4.0
\ No newline at end of file
+mcp_snapshot=20200723-1.16.1
+forge_minecraft_version=1.16.2
+forge_version=33.0.3
+cloth_config_forge=4.1.0
\ No newline at end of file
rootProject.name="light-overlay"
include("fabric")
-//include("forge")
+include("forge")