]> git.lizzy.rs Git - LightOverlay.git/blob - src/main/java/me/shedaniel/lightoverlay/LightOverlay.java
Done!
[LightOverlay.git] / src / main / java / me / shedaniel / lightoverlay / LightOverlay.java
1 package me.shedaniel.lightoverlay;
2
3 import com.mojang.blaze3d.platform.GlStateManager;
4 import net.minecraft.block.BlockState;
5 import net.minecraft.block.Blocks;
6 import net.minecraft.client.Minecraft;
7 import net.minecraft.client.entity.player.ClientPlayerEntity;
8 import net.minecraft.client.renderer.ActiveRenderInfo;
9 import net.minecraft.client.renderer.BufferBuilder;
10 import net.minecraft.client.renderer.Tessellator;
11 import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
12 import net.minecraft.client.settings.KeyBinding;
13 import net.minecraft.client.util.InputMappings;
14 import net.minecraft.entity.Entity;
15 import net.minecraft.entity.EntityClassification;
16 import net.minecraft.entity.EntityType;
17 import net.minecraft.entity.player.PlayerEntity;
18 import net.minecraft.util.ResourceLocation;
19 import net.minecraft.util.math.BlockPos;
20 import net.minecraft.util.math.shapes.VoxelShape;
21 import net.minecraft.util.text.TranslationTextComponent;
22 import net.minecraft.world.LightType;
23 import net.minecraft.world.World;
24 import net.minecraftforge.api.distmarker.Dist;
25 import net.minecraftforge.api.distmarker.OnlyIn;
26 import net.minecraftforge.client.event.InputEvent;
27 import net.minecraftforge.client.event.RenderWorldLastEvent;
28 import net.minecraftforge.client.settings.KeyConflictContext;
29 import net.minecraftforge.client.settings.KeyModifier;
30 import net.minecraftforge.common.MinecraftForge;
31 import net.minecraftforge.eventbus.api.SubscribeEvent;
32 import net.minecraftforge.fml.client.registry.ClientRegistry;
33 import net.minecraftforge.fml.common.Mod;
34
35 import java.awt.*;
36
37 @OnlyIn(Dist.CLIENT)
38 @Mod("lightoverlay-forge")
39 public class LightOverlay {
40     
41     private static final String KEYBIND_CATEGORY = "key.lightoverlay-forge.category";
42     private static final ResourceLocation ENABLE_OVERLAY_KEYBIND = new ResourceLocation("lightoverlay-forge", "enable_overlay");
43     private static final ResourceLocation INCREASE_REACH_KEYBIND = new ResourceLocation("lightoverlay-forge", "increase_reach");
44     private static final ResourceLocation DECREASE_REACH_KEYBIND = new ResourceLocation("lightoverlay-forge", "decrease_reach");
45     private static KeyBinding enableOverlay, increaseReach, decreaseReach;
46     private static boolean enabled = false;
47     private static int reach = 12;
48     private static EntityType<Entity> testingEntityType;
49     
50     public LightOverlay() {
51         testingEntityType = EntityType.Builder.create(EntityClassification.MONSTER).size(0f, 0f).disableSerialization().build(null);
52         enableOverlay = registerKeybind(ENABLE_OVERLAY_KEYBIND, InputMappings.Type.KEYSYM, 296, KEYBIND_CATEGORY);
53         increaseReach = registerKeybind(INCREASE_REACH_KEYBIND, InputMappings.Type.KEYSYM, -1, KEYBIND_CATEGORY);
54         decreaseReach = registerKeybind(DECREASE_REACH_KEYBIND, InputMappings.Type.KEYSYM, -1, KEYBIND_CATEGORY);
55         MinecraftForge.EVENT_BUS.register(this);
56     }
57     
58     public static CrossType getCrossType(BlockPos pos, World world, PlayerEntity playerEntity) {
59         BlockState blockBelowState = world.getBlockState(pos.down());
60         BlockState blockState = world.getBlockState(pos);
61         if (blockBelowState.isAir() || !blockState.isAir())
62             return CrossType.NONE;
63         if (blockBelowState.getBlock() == Blocks.BEDROCK || blockBelowState.getBlock() == Blocks.BARRIER)
64             return CrossType.NONE;
65         if (!blockBelowState.canEntitySpawn(world, pos.down(), testingEntityType))
66             return CrossType.NONE;
67         if (world.getLightFor(LightType.BLOCK, pos) >= 8)
68             return CrossType.NONE;
69         if (world.getLightFor(LightType.SKY, pos) >= 8)
70             return CrossType.YELLOW;
71         return CrossType.RED;
72     }
73     
74     public static void renderCross(BlockPos pos, Color color, PlayerEntity entity) {
75         ActiveRenderInfo info = Minecraft.getInstance().gameRenderer.getActiveRenderInfo();
76         GlStateManager.lineWidth(1.0F);
77         GlStateManager.depthMask(false);
78         GlStateManager.disableTexture();
79         Tessellator tessellator = Tessellator.getInstance();
80         BufferBuilder buffer = tessellator.getBuffer();
81         double d0 = info.getProjectedView().x;
82         double d1 = info.getProjectedView().y - .005D;
83         double d2 = info.getProjectedView().z;
84         
85         buffer.begin(1, DefaultVertexFormats.POSITION_COLOR);
86         buffer.pos(pos.getX() + .01 - d0, pos.getY() - d1, pos.getZ() + .01 - d2).color(color.getRed(), color.getGreen(), color.getBlue(), color.getAlpha()).endVertex();
87         buffer.pos(pos.getX() - .01 + 1 - d0, pos.getY() - d1, pos.getZ() - .01 + 1 - d2).color(color.getRed(), color.getGreen(), color.getBlue(), color.getAlpha()).endVertex();
88         buffer.pos(pos.getX() - .01 + 1 - d0, pos.getY() - d1, pos.getZ() + .01 - d2).color(color.getRed(), color.getGreen(), color.getBlue(), color.getAlpha()).endVertex();
89         buffer.pos(pos.getX() + .01 - d0, pos.getY() - d1, pos.getZ() - .01 + 1 - d2).color(color.getRed(), color.getGreen(), color.getBlue(), color.getAlpha()).endVertex();
90         tessellator.draw();
91         GlStateManager.depthMask(true);
92         GlStateManager.enableTexture();
93     }
94     
95     @SubscribeEvent(receiveCanceled = true)
96     public void handleInput(InputEvent.KeyInputEvent event) {
97         if (enableOverlay.isPressed())
98             enabled = !enabled;
99         if (increaseReach.isPressed()) {
100             if (reach < 50)
101                 reach++;
102             Minecraft.getInstance().player.sendStatusMessage(new TranslationTextComponent("text.lightoverlay-forge.current_reach", reach), false);
103         }
104         if (decreaseReach.isPressed()) {
105             if (reach > 1)
106                 reach--;
107             Minecraft.getInstance().player.sendStatusMessage(new TranslationTextComponent("text.lightoverlay-forge.current_reach", reach), false);
108         }
109     }
110     
111     @SubscribeEvent
112     public void renderWorldLast(RenderWorldLastEvent event) {
113         if (LightOverlay.enabled) {
114             Minecraft client = Minecraft.getInstance();
115             ClientPlayerEntity playerEntity = client.player;
116             World world = client.world;
117             GlStateManager.disableTexture();
118             GlStateManager.disableBlend();
119             BlockPos playerPos = new BlockPos(playerEntity.posX, playerEntity.posY, playerEntity.posZ);
120             BlockPos.getAllInBox(playerPos.add(-reach, -reach, -reach), playerPos.add(reach, reach, reach)).forEach(pos -> {
121                 if (world.getBiome(pos).getSpawningChance() > 0) {
122                     CrossType type = LightOverlay.getCrossType(pos, world, playerEntity);
123                     if (type != CrossType.NONE) {
124                         VoxelShape shape = world.getBlockState(pos).getCollisionShape(world, pos);
125                         Color color = type == CrossType.RED ? Color.RED : Color.YELLOW;
126                         LightOverlay.renderCross(pos, color, playerEntity);
127                     }
128                 }
129             });
130             GlStateManager.enableBlend();
131             GlStateManager.enableTexture();
132         }
133     }
134     
135     private KeyBinding registerKeybind(ResourceLocation resourceLocation, InputMappings.Type type, int keyCode, String category) {
136         KeyBinding keyBinding = new KeyBinding("key." + resourceLocation.getNamespace() + "." + resourceLocation.getPath(), KeyConflictContext.IN_GAME, KeyModifier.NONE, type, keyCode, category);
137         ClientRegistry.registerKeyBinding(keyBinding);
138         return keyBinding;
139     }
140     
141     private static enum CrossType {
142         YELLOW,
143         RED,
144         NONE
145     }
146     
147 }