plugins {
- id "architectury-plugin" version "3.2-SNAPSHOT"
- id "dev.architectury.loom" version "0.7.2-SNAPSHOT" apply false
+ id "architectury-plugin" version "3.3-SNAPSHOT"
+ id "dev.architectury.loom" version "0.7.4-SNAPSHOT" apply false
}
architectury {
}
architectury {
- common(false)
+ common()
}
\ No newline at end of file
builder.begin(VertexFormat.Mode.DEBUG_LINES, DefaultVertexFormat.POSITION_COLOR);
BlockPos.MutableBlockPos mutable = new BlockPos.MutableBlockPos();
- System.out.println(ticker.CHUNK_MAP.size());
for (Map.Entry<CubicChunkPos, Long2ByteMap> entry : ticker.CHUNK_MAP.entrySet()) {
CubicChunkPos chunkPos = entry.getKey();
if (LightOverlay.caching && (Mth.abs(chunkPos.x - playerPosX) > chunkRange || Mth.abs(chunkPos.y - playerPosY) > Math.max(1, chunkRange >> 1) || Mth.abs(chunkPos.z - playerPosZ) > chunkRange)) {
plugins {
- id "com.github.johnrengelman.shadow" version "5.0.0"
+ id "com.github.johnrengelman.shadow" version "7.0.0"
}
configurations {
forge()
}
-loom {
- mixinConfig "lightoverlay-forge.mixins.json"
-}
-
processResources {
filesMatching("META-INF/mods.toml") {
expand "version": project.version
minecraft("com.mojang:minecraft:${rootProject.architectury.minecraft}")
mappings(minecraft.officialMojangMappings())
forge("net.minecraftforge:forge:${rootProject.architectury.minecraft}-${project.forge_version}")
- modCompile("me.shedaniel.cloth:cloth-config-forge:${rootProject.cloth_config_version}")
- modCompile("me.shedaniel:architectury:${rootProject.architectury_version}:forge")
+ modImplementation("me.shedaniel.cloth:cloth-config-forge:${rootProject.cloth_config_version}")
+ modImplementation("dev.architectury:architectury-forge:${rootProject.architectury_version}")
implementation(project(path: ":common")) {
transitive = false
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.fml.DistExecutor;
-import net.minecraftforge.fml.ExtensionPoint;
+import net.minecraftforge.fml.IExtensionPoint;
import net.minecraftforge.fml.ModLoadingContext;
import net.minecraftforge.fml.common.Mod;
-import net.minecraftforge.fml.network.FMLNetworkConstants;
-import org.apache.commons.lang3.tuple.Pair;
+import net.minecraftforge.fmllegacy.network.FMLNetworkConstants;
@Mod("lightoverlay")
public class LightOverlay {
public LightOverlay() {
- ModLoadingContext.get().registerExtensionPoint(ExtensionPoint.DISPLAYTEST, () -> Pair.of(() -> FMLNetworkConstants.IGNORESERVERONLY, (a, b) -> true));
+ ModLoadingContext.get().registerExtensionPoint(IExtensionPoint.DisplayTest.class, () -> new IExtensionPoint.DisplayTest(() -> FMLNetworkConstants.IGNORESERVERONLY, (a, b) -> true));
DistExecutor.safeRunWhenOn(Dist.CLIENT, () -> LightOverlayImpl::register);
}
}
package me.shedaniel.lightoverlay.forge;
import me.shedaniel.lightoverlay.common.ClothScreen;
-import net.minecraftforge.fml.ExtensionPoint;
import net.minecraftforge.fml.ModLoadingContext;
+import net.minecraftforge.fmlclient.ConfigGuiHandler;
public class LightOverlayCloth {
public static void register() {
- ModLoadingContext.get().registerExtensionPoint(ExtensionPoint.CONFIGGUIFACTORY, () -> (client, parent) -> {
+ ModLoadingContext.get().registerExtensionPoint(ConfigGuiHandler.ConfigGuiFactory.class, () -> new ConfigGuiHandler.ConfigGuiFactory((client, parent) -> {
return ClothScreen.getConfigScreenByCloth(parent);
- });
+ }));
}
}
package me.shedaniel.lightoverlay.forge;
+import com.mojang.blaze3d.vertex.PoseStack;
import me.shedaniel.lightoverlay.common.LightOverlay;
import net.minecraft.client.renderer.culling.Frustum;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.fml.DistExecutor;
+import java.util.function.Consumer;
+
public class LightOverlayImpl {
- public static Runnable debugRenderer = () -> {};
+ public static Consumer<PoseStack> debugRenderer = poses -> {};
public static void register() {
LightOverlay.register();
return FrustumHelper.isVisible(clippingHelper, v, v1, v2, v3, v4, v5);
}
- public static void renderWorldLast() {
- debugRenderer.run();
+ public static void renderWorldLast(PoseStack stack) {
+ debugRenderer.accept(stack);
}
}
import me.shedaniel.lightoverlay.common.CubicChunkPos;
import me.shedaniel.lightoverlay.common.LightOverlay;
-import net.minecraft.network.Connection;
+//import net.minecraft.network.Connection;
+import net.minecraft.client.multiplayer.ClientPacketListener;
import net.minecraft.network.PacketListener;
import net.minecraft.network.protocol.Packet;
import net.minecraft.network.protocol.game.ClientboundBlockUpdatePacket;
import net.minecraft.network.protocol.game.ClientboundLightUpdatePacket;
import net.minecraft.network.protocol.game.ClientboundSectionBlocksUpdatePacket;
import net.minecraft.network.protocol.game.ClientboundSetChunkCacheCenterPacket;
-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;
+import net.minecraft.util.Mth;
+//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(Connection.class)
+//@Mixin(Connection.class)
public class MixinClientConnection {
- @Inject(method = "genericsFtw", at = @At("HEAD"))
- private static void handlePacket(Packet packet, PacketListener listener, CallbackInfo ci) {
- if (packet instanceof ClientboundBlockUpdatePacket) {
- LightOverlay.queueChunkAndNear(new CubicChunkPos(((ClientboundBlockUpdatePacket) packet).getPos()));
- } else if (packet instanceof ClientboundSetChunkCacheCenterPacket) {
- for (int y = 0; y <= 15; y++) {
- LightOverlay.queueChunkAndNear(new CubicChunkPos(((ClientboundSetChunkCacheCenterPacket) packet).getX(), y, ((ClientboundSetChunkCacheCenterPacket) packet).getZ()));
- }
- } else if (packet instanceof ClientboundSectionBlocksUpdatePacket) {
- for (int y = 0; y <= 15; y++) {
- LightOverlay.queueChunkAndNear(new CubicChunkPos(((ClientboundSectionBlocksUpdatePacket) packet).sectionPos.getX(), y, ((ClientboundSectionBlocksUpdatePacket) packet).sectionPos.getZ()));
- }
- } else if (packet instanceof ClientboundLightUpdatePacket) {
- for (int y = 0; y <= 15; y++) {
- LightOverlay.queueChunk(new CubicChunkPos(((ClientboundLightUpdatePacket) packet).getX(), y, ((ClientboundLightUpdatePacket) packet).getZ()));
+// @Inject(method = "genericsFtw", at = @At("HEAD"))
+// private static void handlePacket(Packet packet, PacketListener listener, CallbackInfo ci) {
+//
+// }
+ public static void handlePacket(Packet packet, PacketListener listener) {
+ try {
+ if (!(listener instanceof ClientPacketListener packetListener)) return;
+ var level = packetListener.getLevel();
+ if (level == null) return;
+ if (packet instanceof ClientboundBlockUpdatePacket p) {
+ LightOverlay.queueChunkAndNear(new CubicChunkPos(p.getPos()));
+ } else if (packet instanceof ClientboundSetChunkCacheCenterPacket p) {
+ var height = Mth.ceil(level.getHeight() / 32.0);
+ var start = Math.floorDiv(level.getMinBuildHeight(), 32);
+ for (int y = start; y < start + height; y++) {
+ LightOverlay.queueChunkAndNear(new CubicChunkPos(p.getX(), y, p.getZ()));
+ }
+ } else if (packet instanceof ClientboundSectionBlocksUpdatePacket p) {
+ LightOverlay.queueChunkAndNear(new CubicChunkPos(p.sectionPos.getX(), p.sectionPos.getY() >> 1, p.sectionPos.getZ()));
+ } else if (packet instanceof ClientboundLightUpdatePacket p) {
+ var height = Mth.ceil(level.getHeight() / 32.0);
+ var start = Math.floorDiv(level.getMinBuildHeight(), 32);
+ for (int y = start; y < start + height; y++) {
+ LightOverlay.queueChunk(new CubicChunkPos(p.getX(), y, p.getZ()));
+ }
}
+ } catch (Throwable throwable) {
+ new RuntimeException("Light Overlay failed to process packet", throwable).printStackTrace();
}
}
}
import com.mojang.blaze3d.vertex.PoseStack;
import me.shedaniel.lightoverlay.forge.LightOverlayImpl;
+/*import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.debug.DebugRenderer;
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;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;*/
-@Mixin(DebugRenderer.class)
+//@Mixin(DebugRenderer.class)
public class MixinDebugRenderer {
- @Inject(method = "render", at = @At("HEAD"))
- private void render(PoseStack arg, MultiBufferSource.BufferSource arg2, double d, double e, double f, CallbackInfo ci) {
- LightOverlayImpl.renderWorldLast();
+// @Inject(method = "render", at = @At("HEAD"))
+// private void render(PoseStack arg, MultiBufferSource.BufferSource arg2, double d, double e, double f, CallbackInfo ci) {
+// LightOverlayImpl.renderWorldLast();
+// }
+
+ public static void render(PoseStack stack) {
+ LightOverlayImpl.renderWorldLast(stack);
}
}
package me.shedaniel.lightoverlay.forge.mixin;
import me.shedaniel.lightoverlay.common.LightOverlay;
-import net.minecraft.client.Camera;
-import net.minecraft.client.renderer.LevelRenderer;
import net.minecraft.client.renderer.culling.Frustum;
-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;
+//import net.minecraft.client.Camera;
+//import net.minecraft.client.renderer.LevelRenderer;
+//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(LevelRenderer.class)
+//@Mixin(LevelRenderer.class)
public class MixinLevelRenderer {
- @Inject(method = "setupRender", at = @At("HEAD"))
- private void setupTerrain(Camera camera, Frustum frustum, boolean bl, int i, boolean bl2, CallbackInfo ci) {
- LightOverlay.frustum = frustum;
+// @Inject(method = "setupRender", at = @At("HEAD"))
+// private void setupTerrain(Camera camera, Frustum frustum, boolean bl, int i, boolean bl2, CallbackInfo ci) {
+// LightOverlay.renderer.frustum = frustum;
+// }
+
+ public static void setupTerrain(Frustum frustum) {
+ LightOverlay.renderer.frustum = frustum;
}
}
--- /dev/null
+var Opcodes = Java.type("org.objectweb.asm.Opcodes");
+var VarInsnNode = Java.type("org.objectweb.asm.tree.VarInsnNode");
+var MethodInsnNode = Java.type("org.objectweb.asm.tree.MethodInsnNode");
+var ASMAPI = Java.type("net.minecraftforge.coremod.api.ASMAPI");
+
+function transformMethod(method) {
+ var instructions = method.instructions;
+ instructions.insert(new MethodInsnNode(Opcodes.INVOKESTATIC, "me/shedaniel/lightoverlay/forge/mixin/MixinClientConnection", "handlePacket", "(Lnet/minecraft/network/protocol/Packet;Lnet/minecraft/network/PacketListener;)V", false));
+ instructions.insert(new VarInsnNode(Opcodes.ALOAD, 1));
+ instructions.insert(new VarInsnNode(Opcodes.ALOAD, 0));
+}
+
+function initializeCoreMod() {
+ return {
+ "lightoverlay": {
+ 'target': {
+ 'type': 'CLASS',
+ 'name': 'net.minecraft.network.Connection'
+ },
+ 'transformer': function (classNode) {
+ var genericsFtw = ASMAPI.mapMethod("m_129517_");
+ for (i in classNode.methods) {
+ var method = classNode.methods[i];
+ if (method.name === genericsFtw) {
+ transformMethod(method)
+ break;
+ }
+ }
+ return classNode;
+ }
+ }
+ }
+}
\ No newline at end of file
--- /dev/null
+var Opcodes = Java.type("org.objectweb.asm.Opcodes");
+var VarInsnNode = Java.type("org.objectweb.asm.tree.VarInsnNode");
+var MethodInsnNode = Java.type("org.objectweb.asm.tree.MethodInsnNode");
+var ASMAPI = Java.type("net.minecraftforge.coremod.api.ASMAPI");
+
+function transformMethod(method) {
+ var instructions = method.instructions;
+ instructions.insert(new MethodInsnNode(Opcodes.INVOKESTATIC, "me/shedaniel/lightoverlay/forge/mixin/MixinDebugRenderer", "render", "(Lcom/mojang/blaze3d/vertex/PoseStack;)V", false));
+ instructions.insert(new VarInsnNode(Opcodes.ALOAD, 1));
+}
+
+function initializeCoreMod() {
+ return {
+ "lightoverlay": {
+ 'target': {
+ 'type': 'CLASS',
+ 'name': 'net.minecraft.client.renderer.debug.DebugRenderer'
+ },
+ 'transformer': function (classNode) {
+ var render = ASMAPI.mapMethod("m_113457_");
+ for (i in classNode.methods) {
+ var method = classNode.methods[i];
+ if (method.name === render) {
+ transformMethod(method)
+ break;
+ }
+ }
+ return classNode;
+ }
+ }
+ }
+}
\ No newline at end of file
--- /dev/null
+var Opcodes = Java.type("org.objectweb.asm.Opcodes");
+var VarInsnNode = Java.type("org.objectweb.asm.tree.VarInsnNode");
+var MethodInsnNode = Java.type("org.objectweb.asm.tree.MethodInsnNode");
+var ASMAPI = Java.type("net.minecraftforge.coremod.api.ASMAPI");
+
+function transformMethod(method) {
+ var instructions = method.instructions;
+ instructions.insert(new MethodInsnNode(Opcodes.INVOKESTATIC, "me/shedaniel/lightoverlay/forge/mixin/MixinLevelRenderer", "setupTerrain", "(Lnet/minecraft/client/renderer/culling/Frustum;)V", false));
+ instructions.insert(new VarInsnNode(Opcodes.ALOAD, 2));
+}
+
+function initializeCoreMod() {
+ return {
+ "lightoverlay": {
+ 'target': {
+ 'type': 'CLASS',
+ 'name': 'net.minecraft.client.renderer.LevelRenderer'
+ },
+ 'transformer': function (classNode) {
+ var setupRender = ASMAPI.mapMethod("m_109695_");
+ for (i in classNode.methods) {
+ var method = classNode.methods[i];
+ if (method.name === setupRender) {
+ transformMethod(method)
+ break;
+ }
+ }
+ return classNode;
+ }
+ }
+ }
+}
\ No newline at end of file
-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
+public net.minecraft.client.renderer.culling.Frustum f_112996_ # camX
+public net.minecraft.client.renderer.culling.Frustum f_112997_ # camY
+public net.minecraft.client.renderer.culling.Frustum f_112998_ # camZ
+public net.minecraft.client.renderer.culling.Frustum f_112995_ # frustumData
+public net.minecraft.network.protocol.game.ClientboundSectionBlocksUpdatePacket f_132980_ # sectionPos
\ No newline at end of file
--- /dev/null
+{
+ "Connection": "META-INF/Connection.js",
+ "DebugRenderer": "META-INF/DebugRenderer.js",
+ "LevelRenderer": "META-INF/LevelRenderer.js"
+}
\ No newline at end of file
modLoader = "javafml"
-loaderVersion = "[33,)"
+loaderVersion = "[37,)"
issueTrackerURL = "https://github.com/shedaniel/LightOverlay/issues/" #optional
logoFile = "icon.png"
authors = "shedaniel"
'''
[[dependencies.lightoverlay]]
-modId = "cloth-config"
+modId = "cloth_config"
mandatory = true
-versionRange = "[4.10.13,)"
+versionRange = "[5.0.38,)"
ordering = "NONE"
side = "CLIENT"
[[dependencies.lightoverlay]]
modId = "architectury"
mandatory = true
-versionRange = "[1.5.112,)"
+versionRange = "[2.3.24,)"
ordering = "NONE"
side = "CLIENT"
\ No newline at end of file
+++ /dev/null
-{
- "required": true,
- "package": "me.shedaniel.lightoverlay.forge.mixin",
- "minVersion": "0.7.11",
- "compatibilityLevel": "JAVA_8",
- "mixins": [],
- "client": [
- "MixinClientConnection",
- "MixinDebugRenderer",
- "MixinLevelRenderer"
- ],
- "injectors": {
- "defaultRequire": 1
- }
-}
\ No newline at end of file
org.gradle.daemon=false
mod_version=6.0.0
-minecraft_version=1.17
+minecraft_version=1.17.1
-architectury_version=2.0.9
+architectury_version=2.3.24
# fabric
fabric_loader_version=0.11.6
-fabric_api_version=0.35.1+1.17
-cloth_config_version=5.0.34
+fabric_api_version=0.37.2+1.17
+cloth_config_version=5.0.38
modmenu_version=2.0.2
# forge
-forge_version=35.1.7
\ No newline at end of file
+forge_version=37.0.13
\ No newline at end of file
include("common")
include("fabric")
-//include("forge")
+include("forge")