From 8ecdadb607d627ac8d6108d2862d8dded7fbff05 Mon Sep 17 00:00:00 2001 From: shedaniel Date: Mon, 3 Feb 2020 12:46:13 +0800 Subject: [PATCH] 4.2 --- build.gradle | 2 +- .../shedaniel/lightoverlay/LightOverlay.java | 1 + .../lightoverlay/LightOverlayClient.java | 124 ++++++++++++++---- .../lightoverlay/LightOverlayCloth.java | 9 +- .../assets/lightoverlay-forge/lang/en_us.json | 2 + 5 files changed, 107 insertions(+), 31 deletions(-) diff --git a/build.gradle b/build.gradle index d805b16..41ad777 100644 --- a/build.gradle +++ b/build.gradle @@ -11,7 +11,7 @@ buildscript { apply plugin: 'net.minecraftforge.gradle' apply plugin: 'eclipse' -version = "4.1" +version = "4.2" group = "me.shedaniel" // http://maven.apache.org/guides/mini/guide-naming-conventions.html archivesBaseName = "LightOverlay" diff --git a/src/main/java/me/shedaniel/lightoverlay/LightOverlay.java b/src/main/java/me/shedaniel/lightoverlay/LightOverlay.java index 5f76104..ada3d77 100644 --- a/src/main/java/me/shedaniel/lightoverlay/LightOverlay.java +++ b/src/main/java/me/shedaniel/lightoverlay/LightOverlay.java @@ -8,6 +8,7 @@ import net.minecraftforge.fml.common.Mod; public class LightOverlay { public LightOverlay() { + //noinspection Convert2MethodRef DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> LightOverlayClient.register()); } diff --git a/src/main/java/me/shedaniel/lightoverlay/LightOverlayClient.java b/src/main/java/me/shedaniel/lightoverlay/LightOverlayClient.java index 435a3b9..6903131 100644 --- a/src/main/java/me/shedaniel/lightoverlay/LightOverlayClient.java +++ b/src/main/java/me/shedaniel/lightoverlay/LightOverlayClient.java @@ -5,9 +5,8 @@ import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.player.ClientPlayerEntity; -import net.minecraft.client.renderer.ActiveRenderInfo; -import net.minecraft.client.renderer.BufferBuilder; -import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.renderer.*; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.client.settings.KeyBinding; import net.minecraft.client.util.InputMappings; @@ -52,6 +51,8 @@ public class LightOverlayClient { private static final ResourceLocation INCREASE_LINE_WIDTH_KEYBIND = new ResourceLocation("lightoverlay-forge", "increase_line_width"); private static final ResourceLocation DECREASE_LINE_WIDTH_KEYBIND = new ResourceLocation("lightoverlay-forge", "decrease_line_width"); static int reach = 7; + static int crossLevel = 7; + static boolean showNumber = false; static EntityType testingEntityType; static float lineWidth = 1.0F; static int yellowColor = 0xFFFF00, redColor = 0xFF0000; @@ -73,6 +74,7 @@ public class LightOverlayClient { MinecraftForge.EVENT_BUS.register(LightOverlayClient.class); try { + //noinspection Convert2MethodRef DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> LightOverlayCloth.register()); } catch (Exception e) { e.printStackTrace(); @@ -100,19 +102,38 @@ public class LightOverlayClient { // Check block state allow spawning (excludes bedrock and barriers automatically) if (!blockBelowState.canEntitySpawn(world, pos.down(), testingEntityType)) return CrossType.NONE; - if (world.func_226658_a_(LightType.BLOCK, pos) >= 8) + if (world.func_226658_a_(LightType.BLOCK, pos) > crossLevel) return CrossType.NONE; - if (world.func_226658_a_(LightType.SKY, pos) >= 8) + if (world.func_226658_a_(LightType.SKY, pos) > crossLevel) return CrossType.YELLOW; return CrossType.RED; } - public static void renderCross(World world, BlockPos pos, int color, PlayerEntity entity) { - ActiveRenderInfo info = Minecraft.getInstance().gameRenderer.getActiveRenderInfo(); - RenderSystem.lineWidth(lineWidth); - RenderSystem.depthMask(false); - Tessellator tessellator = Tessellator.getInstance(); - BufferBuilder buffer = tessellator.getBuffer(); + public static int getCrossLevel(BlockPos pos, World world, PlayerEntity playerEntity) { + BlockState blockBelowState = world.getBlockState(pos.down()); + BlockState blockUpperState = world.getBlockState(pos); + VoxelShape upperCollisionShape = blockUpperState.getCollisionShape(world, pos, ISelectionContext.forEntity(playerEntity)); + if (!blockUpperState.getFluidState().isEmpty()) + return -1; + /* WorldEntitySpawner.func_222266_a */ + // Check if the outline is full + if (Block.doesSideFillSquare(upperCollisionShape, Direction.UP)) + return -1; + // Check if there is power + if (blockUpperState.canProvidePower()) + return -1; + // Check if the collision has a bump + if (upperCollisionShape.getEnd(Direction.Axis.Y) > 0) + return -1; + if (blockUpperState.getBlock().isIn(BlockTags.RAILS)) + return -1; + // Check block state allow spawning (excludes bedrock and barriers automatically) + if (!blockBelowState.canEntitySpawn(world, pos.down(), testingEntityType)) + return -1; + return world.func_226658_a_(LightType.BLOCK, pos); + } + + public static void renderCross(ActiveRenderInfo info, Tessellator tessellator, BufferBuilder buffer, World world, BlockPos pos, int color, PlayerEntity entity) { double d0 = info.getProjectedView().x; double d1 = info.getProjectedView().y - .005D; VoxelShape upperOutlineShape = world.getBlockState(pos).getShape(world, pos, ISelectionContext.forEntity(entity)); @@ -128,7 +149,29 @@ public class LightOverlayClient { buffer.func_225582_a_(pos.getX() - .01 + 1 - d0, pos.getY() - d1, pos.getZ() + .01 - d2).func_225586_a_(red, green, blue, 255).endVertex(); buffer.func_225582_a_(pos.getX() + .01 - d0, pos.getY() - d1, pos.getZ() - .01 + 1 - d2).func_225586_a_(red, green, blue, 255).endVertex(); tessellator.draw(); - RenderSystem.depthMask(true); + } + + public static void renderLevel(Minecraft minecraft, ActiveRenderInfo info, World world, BlockPos pos, int level, PlayerEntity entity) { + String string_1 = String.valueOf(level); + FontRenderer fontRenderer = minecraft.fontRenderer; + double double_4 = info.getProjectedView().x; + double double_5 = info.getProjectedView().y; + VoxelShape upperOutlineShape = world.getBlockState(pos).getShape(world, pos, ISelectionContext.forEntity(entity)); + if (!upperOutlineShape.isEmpty()) + double_5 -= upperOutlineShape.getEnd(Direction.Axis.Y); + double double_6 = info.getProjectedView().z; + RenderSystem.pushMatrix(); + RenderSystem.translatef((float) (pos.getX() + 0.5f - double_4), (float) (pos.getY() - double_5) + 0.005f, (float) (pos.getZ() + 0.5f - double_6)); + RenderSystem.rotatef(90, 1, 0, 0); + RenderSystem.normal3f(0.0F, 1.0F, 0.0F); + float size = 0.07F; + RenderSystem.scalef(-size, -size, size); + float float_3 = (float) (-fontRenderer.getStringWidth(string_1)) / 2.0F + 0.4f; + RenderSystem.enableAlphaTest(); + IRenderTypeBuffer.Impl vertexConsumerProvider$Immediate_1 = IRenderTypeBuffer.func_228455_a_(Tessellator.getInstance().getBuffer()); + fontRenderer.func_228079_a_(string_1, float_3, -3.5f, level > crossLevel ? 0xff042404 : 0xff731111, false, TransformationMatrix.func_227983_a_().func_227988_c_(), vertexConsumerProvider$Immediate_1, false, 0, 15728880); + vertexConsumerProvider$Immediate_1.func_228461_a_(); + RenderSystem.popMatrix(); } @SubscribeEvent(receiveCanceled = true) @@ -186,20 +229,45 @@ public class LightOverlayClient { Minecraft client = Minecraft.getInstance(); ClientPlayerEntity playerEntity = client.player; World world = client.world; - RenderSystem.disableTexture(); - RenderSystem.disableBlend(); BlockPos playerPos = playerEntity.getPosition(); - BlockPos.getAllInBox(playerPos.add(-reach, -reach, -reach), playerPos.add(reach, reach, reach)).forEach(pos -> { - Biome biome = world.func_226691_t_(pos); - if (biome.getSpawningChance() > 0 && !biome.getSpawns(EntityClassification.MONSTER).isEmpty()) { - CrossType type = LightOverlayClient.getCrossType(pos, world, playerEntity); - if (type != CrossType.NONE) { - VoxelShape shape = world.getBlockState(pos).getCollisionShape(world, pos); - int color = type == CrossType.RED ? redColor : yellowColor; - LightOverlayClient.renderCross(world, pos, color, playerEntity); + ActiveRenderInfo info = client.gameRenderer.getActiveRenderInfo(); + if (showNumber) { + RenderSystem.enableTexture(); + RenderSystem.enableDepthTest(); + + RenderSystem.depthMask(true); + for (BlockPos pos : BlockPos.getAllInBoxMutable(playerPos.add(-reach, -reach, -reach), playerPos.add(reach, reach, reach))) { + Biome biome = world.func_226691_t_(pos); + if (biome.getSpawningChance() > 0 && !biome.getSpawns(EntityClassification.MONSTER).isEmpty()) { + int level = LightOverlayClient.getCrossLevel(pos, world, playerEntity); + if (level >= 0) { + VoxelShape shape = world.getBlockState(pos).getCollisionShape(world, pos); + LightOverlayClient.renderLevel(client, info, world, pos, level, playerEntity); + } + } + } + RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); + RenderSystem.enableDepthTest(); + } else { + RenderSystem.disableTexture(); + RenderSystem.disableBlend(); + RenderSystem.lineWidth(lineWidth); + RenderSystem.depthMask(false); + Tessellator tessellator = Tessellator.getInstance(); + BufferBuilder buffer = tessellator.getBuffer(); + for (BlockPos pos : BlockPos.getAllInBoxMutable(playerPos.add(-reach, -reach, -reach), playerPos.add(reach, reach, reach))) { + Biome biome = world.func_226691_t_(pos); + if (biome.getSpawningChance() > 0 && !biome.getSpawns(EntityClassification.MONSTER).isEmpty()) { + CrossType type = LightOverlayClient.getCrossType(pos, world, playerEntity); + if (type != CrossType.NONE) { + VoxelShape shape = world.getBlockState(pos).getCollisionShape(world, pos); + int color = type == CrossType.RED ? redColor : yellowColor; + LightOverlayClient.renderCross(info, tessellator, buffer, world, pos, color, playerEntity); + } } } - }); + RenderSystem.depthMask(true); + } RenderSystem.popMatrix(); } } @@ -221,7 +289,9 @@ public class LightOverlayClient { properties.load(fis); fis.close(); reach = Integer.parseInt((String) properties.computeIfAbsent("reach", a -> "7")); - lineWidth = Float.valueOf((String) properties.computeIfAbsent("lineWidth", a -> "1")); + crossLevel = Integer.parseInt((String) properties.computeIfAbsent("crossLevel", a -> "7")); + showNumber = ((String) properties.computeIfAbsent("showNumber", a -> "false")).equalsIgnoreCase("true"); + lineWidth = Float.parseFloat((String) properties.computeIfAbsent("lineWidth", a -> "1")); { int r, g, b; r = Integer.parseInt((String) properties.computeIfAbsent("yellowColorRed", a -> "255")); @@ -257,6 +327,10 @@ public class LightOverlayClient { fos.write("\n".getBytes()); fos.write(("reach=" + reach).getBytes()); fos.write("\n".getBytes()); + fos.write(("crossLevel=" + crossLevel).getBytes()); + fos.write("\n".getBytes()); + fos.write(("showNumber=" + showNumber).getBytes()); + fos.write("\n".getBytes()); fos.write(("lineWidth=" + FORMAT.format(lineWidth)).getBytes()); fos.write("\n".getBytes()); fos.write(("yellowColorRed=" + ((yellowColor >> 16) & 255)).getBytes()); @@ -273,7 +347,7 @@ public class LightOverlayClient { fos.close(); } - private static enum CrossType { + private enum CrossType { YELLOW, RED, NONE diff --git a/src/main/java/me/shedaniel/lightoverlay/LightOverlayCloth.java b/src/main/java/me/shedaniel/lightoverlay/LightOverlayCloth.java index c774d1d..ceb53b7 100644 --- a/src/main/java/me/shedaniel/lightoverlay/LightOverlayCloth.java +++ b/src/main/java/me/shedaniel/lightoverlay/LightOverlayCloth.java @@ -3,8 +3,6 @@ package me.shedaniel.lightoverlay; import me.shedaniel.forge.clothconfig2.api.ConfigBuilder; import me.shedaniel.forge.clothconfig2.api.ConfigCategory; import me.shedaniel.forge.clothconfig2.api.ConfigEntryBuilder; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.resources.I18n; import net.minecraft.util.math.MathHelper; import net.minecraftforge.fml.ExtensionPoint; @@ -12,16 +10,17 @@ import net.minecraftforge.fml.ModLoadingContext; import java.util.Locale; import java.util.Optional; -import java.util.function.BiFunction; public class LightOverlayCloth { public static void register() { - ModLoadingContext.get().registerExtensionPoint(ExtensionPoint.CONFIGGUIFACTORY, () -> (BiFunction) (client, parent) -> { + ModLoadingContext.get().registerExtensionPoint(ExtensionPoint.CONFIGGUIFACTORY, () -> (client, parent) -> { ConfigBuilder builder = ConfigBuilder.create().setParentScreen(parent).setTitle("key.lightoverlay.category"); ConfigEntryBuilder eb = builder.getEntryBuilder(); ConfigCategory general = builder.getOrCreateCategory("config.lightoverlay-forge.general"); general.addEntry(eb.startIntSlider("config.lightoverlay-forge.reach", LightOverlayClient.reach, 1, 50).setDefaultValue(7).setTextGetter(integer -> "Reach: " + integer + " Blocks").setSaveConsumer(integer -> LightOverlayClient.reach = integer).build()); + general.addEntry(eb.startIntSlider("config.lightoverlay-forge.crossLevel", LightOverlayClient.crossLevel, 0, 15).setDefaultValue(7).setTextGetter(integer -> "Cross Level: " + integer).setSaveConsumer(integer -> LightOverlayClient.crossLevel = integer).build()); + general.addEntry(eb.startBooleanToggle("config.lightoverlay-forge.showNumber", LightOverlayClient.showNumber).setDefaultValue(false).setSaveConsumer(bool -> LightOverlayClient.showNumber = bool).build()); general.addEntry(eb.startIntSlider("config.lightoverlay-forge.lineWidth", MathHelper.floor(LightOverlayClient.lineWidth * 100), 100, 700).setDefaultValue(100).setTextGetter(integer -> "Light Width: " + LightOverlayClient.FORMAT.format(integer / 100d)).setSaveConsumer(integer -> LightOverlayClient.lineWidth = integer / 100f).build()); general.addEntry(eb.startStrField("config.lightoverlay-forge.yellowColor", "#" + toStringColor(LightOverlayClient.yellowColor)).setDefaultValue("#FFFF00").setSaveConsumer(str -> LightOverlayClient.yellowColor = toIntColor(str)).setErrorSupplier(s -> { if (!s.startsWith("#") || s.length() != 7 || !isInt(s.substring(1))) @@ -67,7 +66,7 @@ public class LightOverlayCloth { private static String toStringColor(int toolColor) { String r = Integer.toHexString((toolColor >> 16) & 0xFF); String g = Integer.toHexString((toolColor >> 8) & 0xFF); - String b = Integer.toHexString((toolColor >> 0) & 0xFF); + String b = Integer.toHexString(toolColor & 0xFF); if (r.length() == 1) r = "0" + r; if (g.length() == 1) diff --git a/src/main/resources/assets/lightoverlay-forge/lang/en_us.json b/src/main/resources/assets/lightoverlay-forge/lang/en_us.json index 4163c9b..1c69022 100755 --- a/src/main/resources/assets/lightoverlay-forge/lang/en_us.json +++ b/src/main/resources/assets/lightoverlay-forge/lang/en_us.json @@ -9,6 +9,8 @@ "text.lightoverlay-forge.current_line_width": "The current line width is %s!", "config.lightoverlay-forge.general": "General", "config.lightoverlay-forge.reach": "Reach:", + "config.lightoverlay-forge.crossLevel": "Light Level:", + "config.lightoverlay-forge.showNumber": "Show Number Instead:", "config.lightoverlay-forge.lineWidth": "Line Width:", "config.lightoverlay-forge.yellowColor": "Yellow Color:", "config.lightoverlay-forge.redColor": "Red Color:", -- 2.44.0