diff --git a/build.gradle b/build.gradle index dceaf2f..826dbd6 100644 --- a/build.gradle +++ b/build.gradle @@ -21,7 +21,7 @@ minecraft { properties 'mixin.env.remapRefMap': 'true' property 'mixin.env.refMapRemappingFile', "${project.projectDir}/build/createSrgToMcp/output.srg" workingDirectory project.file('run') - arg "-mixin.config=forgecef.mixins.json" + arg "-mixin.config=webdisplays.mixins.json" property 'forge.logging.console.level', 'debug' mods { @@ -35,7 +35,7 @@ minecraft { properties 'mixin.env.remapRefMap': 'true' property 'mixin.env.refMapRemappingFile', "${project.projectDir}/build/createSrgToMcp/output.srg" workingDirectory project.file('run') - arg "-mixin.config=forgecef.mixins.json" + arg "-mixin.config=webdisplays.mixins.json" property 'forge.logging.console.level', 'debug' @@ -52,7 +52,7 @@ minecraft { properties 'mixin.env.remapRefMap': 'true' property 'mixin.env.refMapRemappingFile', "${project.projectDir}/build/createSrgToMcp/output.srg" property 'forge.logging.console.level', 'debug' - args '--mod', 'examplemod', '--all', '--output', file('src/generated/resources/'), '--existing', sourceSets.main.resources.srcDirs[0] + args '--mod', 'webdisplays', '--all', '--output', file('src/generated/resources/'), '--existing', sourceSets.main.resources.srcDirs[0] mods { webdisplays { source sourceSets.main @@ -98,7 +98,7 @@ jar { "Implementation-Version": "${version}", "Implementation-Vendor" :"webdisplays", "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ"), - "MixinConfigs": "forgecef.mixins.json" + "MixinConfigs": "webdisplays.mixins.json" ]) } } diff --git a/cursors.piskel b/cursors.piskel new file mode 100644 index 0000000..b7722a1 --- /dev/null +++ b/cursors.piskel @@ -0,0 +1 @@ +{"modelVersion":2,"piskel":{"name":"image","description":"","fps":10,"height":256,"width":256,"layers":["{\"name\":\"Layer 1\",\"opacity\":0.5,\"frameCount\":1,\"chunks\":[{\"layout\":[[0]],\"base64PNG\":\"data:image/png;base64,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\"}]}","{\"name\":\"Layer 2\",\"opacity\":0,\"frameCount\":1,\"chunks\":[{\"layout\":[[0]],\"base64PNG\":\"data:image/png;base64,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\"}]}"],"hiddenFrames":[""]}} \ No newline at end of file diff --git a/src/main/java/net/montoyo/wd/WebDisplays.java b/src/main/java/net/montoyo/wd/WebDisplays.java index b9d45ec..cdf651f 100644 --- a/src/main/java/net/montoyo/wd/WebDisplays.java +++ b/src/main/java/net/montoyo/wd/WebDisplays.java @@ -51,6 +51,7 @@ import net.montoyo.wd.net.client_bound.S2CMessageServerInfo; import net.montoyo.wd.utilities.DistSafety; import net.montoyo.wd.utilities.Log; import net.montoyo.wd.utilities.Util; +import org.apache.maven.artifact.versioning.ArtifactVersion; import java.io.*; import java.net.MalformedURLException; @@ -64,7 +65,14 @@ public class WebDisplays { public static WebDisplays INSTANCE; public static SharedProxy PROXY = null; - + + public static final boolean cursorSupport; + + static { + ArtifactVersion ver = ModList.get().getModFileById("forgecef").getMods().get(0).getVersion(); + cursorSupport = (ver.getMajorVersion() >= 1 && ver.getMinorVersion() >= 2 && ver.getIncrementalVersion() >= 4); + } + public static WDCreativeTab CREATIVE_TAB; public static final ResourceLocation ADV_PAD_BREAK = new ResourceLocation("webdisplays", "webdisplays/pad_break"); public static final String BLACKLIST_URL = "mod://webdisplays/blacklisted.html"; diff --git a/src/main/java/net/montoyo/wd/client/ClientProxy.java b/src/main/java/net/montoyo/wd/client/ClientProxy.java index 7b28566..b02ea35 100644 --- a/src/main/java/net/montoyo/wd/client/ClientProxy.java +++ b/src/main/java/net/montoyo/wd/client/ClientProxy.java @@ -5,10 +5,15 @@ package net.montoyo.wd.client; import com.mojang.authlib.GameProfile; +import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.platform.InputConstants; +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.advancements.Advancement; import net.minecraft.advancements.AdvancementProgress; import net.minecraft.client.Minecraft; +import net.minecraft.client.Options; +import net.minecraft.client.gui.Gui; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.inventory.ContainerScreen; import net.minecraft.client.multiplayer.ClientAdvancements; @@ -67,6 +72,8 @@ import net.montoyo.wd.entity.TileEntityScreen; import net.montoyo.wd.init.BlockInit; import net.montoyo.wd.init.ItemInit; import net.montoyo.wd.init.TileInit; +import net.montoyo.wd.item.ItemLaserPointer; +import net.montoyo.wd.item.ItemMinePad2; import net.montoyo.wd.item.WDItem; import net.montoyo.wd.miniserv.client.Client; import net.montoyo.wd.net.WDNetworkRegistry; @@ -75,6 +82,7 @@ import net.montoyo.wd.net.server_bound.C2SMessageScreenCtrl; import net.montoyo.wd.net.server_bound.C2SMinepadUrl; import net.montoyo.wd.utilities.*; import org.lwjgl.glfw.GLFW; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import javax.annotation.Nonnull; import java.io.IOException; @@ -87,6 +95,93 @@ import java.util.stream.Stream; @Mod.EventBusSubscriber(modid = "webdisplays", value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.MOD) public class ClientProxy extends SharedProxy implements IDisplayHandler, IJSQueryHandler, ResourceManagerReloadListener { + private static ClientProxy INSTANCE; + + public ClientProxy() { + INSTANCE = this; + } + + public static void blit(PoseStack p_93229_, int p_93230_, int p_93231_, int p_93232_, int p_93233_, int p_93234_, int p_93235_, int offset) { + Gui.blit(p_93229_, p_93230_, p_93231_, offset, (float)p_93232_, (float)p_93233_, p_93234_, p_93235_, 256, 256); + } + + public static void renderCrosshair(Options options, int screenWidth, int screenHeight, int offset, PoseStack poseStack, CallbackInfo ci) { + ItemStack stack = Minecraft.getInstance().player.getItemInHand(InteractionHand.MAIN_HAND); + ItemStack stack1 = Minecraft.getInstance().player.getItemInHand(InteractionHand.OFF_HAND); + + if (stack.getItem() instanceof ItemMinePad2) { + float sign = 1; + if (Minecraft.getInstance().player.getMainArm() == HumanoidArm.LEFT) sign = -1; + if (!MinePadRenderer.renderAtSide(sign)) { + ci.cancel(); + return; + } + } else { + if (stack1.getItem() instanceof ItemMinePad2) { + float sign = -1; + if (Minecraft.getInstance().player.getMainArm() == HumanoidArm.LEFT) sign = 1; + if (!MinePadRenderer.renderAtSide(sign)) { + ci.cancel(); + return; + } + } + } + + if (!(stack.getItem() instanceof ItemLaserPointer || + stack1.getItem() instanceof ItemLaserPointer)) + return; + + if (!INSTANCE.laserPointerRenderer.isOn) { + RenderSystem.setShaderTexture(0, new ResourceLocation( + "webdisplays:textures/gui/cursors.png" + )); + RenderSystem.blendFuncSeparate(GlStateManager.SourceFactor.ONE_MINUS_DST_COLOR, GlStateManager.DestFactor.ONE_MINUS_SRC_COLOR, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO); + + blit(poseStack, (screenWidth - 15) / 2, (screenHeight - 15) / 2, 240, 240, 15, 15, offset); + ci.cancel(); + return; + } + + Minecraft mc = Minecraft.getInstance(); + + if ( + mc.player != null && mc.level != null && ItemInit.itemLaserPointer.isPresent() && mc.player.getItemInHand(InteractionHand.MAIN_HAND).getItem().equals(ItemInit.itemLaserPointer.get()) && + mc.options.keyUse.isDown() && + (mc.hitResult == null || mc.hitResult.getType() == HitResult.Type.BLOCK || mc.hitResult.getType() == HitResult.Type.MISS) + ) { + BlockHitResult result = raycast(64.0); //TODO: Make that distance configurable + + BlockPos bpos = result.getBlockPos(); + + if (result.getType() != HitResult.Type.BLOCK || mc.level.getBlockState(bpos).getBlock() != BlockInit.blockScreen.get()) + return; + + Vector3i pos = new Vector3i(result.getBlockPos()); + BlockSide side = BlockSide.values()[result.getDirection().ordinal()]; + + Multiblock.findOrigin(mc.level, pos, side, null); + TileEntityScreen te = (TileEntityScreen) mc.level.getBlockEntity(pos.toBlock()); + + TileEntityScreen.Screen sc = te.getScreen(side); + + if (sc == null) return; +// if (sc.mouseType == 1) return; + + int coordX = sc.mouseType * 15; + int coordY = coordX / 256; + coordX -= coordY * 256; + + RenderSystem.setShaderTexture(0, new ResourceLocation( + "webdisplays:textures/gui/cursors.png" + )); + RenderSystem.blendFuncSeparate(GlStateManager.SourceFactor.ONE_MINUS_DST_COLOR, GlStateManager.DestFactor.ONE_MINUS_SRC_COLOR, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO); + + blit(poseStack, (screenWidth - 15) / 2, (screenHeight - 15) / 2, coordX, coordY, 15, 15, offset); + + ci.cancel(); + } + } + public class PadData { public IBrowser view; @@ -632,12 +727,13 @@ public class ClientProxy extends SharedProxy implements IDisplayHandler, IJSQuer if(mc.player != null && mc.level != null && ItemInit.itemLaserPointer.isPresent() && mc.player.getItemInHand(InteractionHand.MAIN_HAND).getItem().equals(ItemInit.itemLaserPointer.get()) && mc.options.keyUse.isDown() && (mc.hitResult == null || mc.hitResult.getType() == HitResult.Type.BLOCK || mc.hitResult.getType() == HitResult.Type.MISS)) { - laserPointerRenderer.isOn = true; BlockHitResult result = raycast(64.0); //TODO: Make that distance configurable BlockPos bpos = result.getBlockPos(); if(result.getType() == HitResult.Type.BLOCK && mc.level.getBlockState(bpos).getBlock() == BlockInit.blockScreen.get()) { + laserPointerRenderer.isOn = true; + Vector3i pos = new Vector3i(result.getBlockPos()); BlockSide side = BlockSide.values()[result.getDirection().ordinal()]; @@ -712,6 +808,7 @@ public class ClientProxy extends SharedProxy implements IDisplayHandler, IJSQuer /**************************************** OTHER METHODS ****************************************/ private void laserClick(TileEntityScreen tes, BlockSide side, TileEntityScreen.Screen scr, Vector2i hit) { + tes.handleMouseEvent(side, S2CMessageScreenUpdate.MOUSE_MOVE, hit); if(pointedScreen == tes && pointedScreenSide == side) { long t = System.currentTimeMillis(); @@ -721,7 +818,6 @@ public class ClientProxy extends SharedProxy implements IDisplayHandler, IJSQuer tes.handleMouseEvent(side, S2CMessageScreenUpdate.MOUSE_CLICK, hit); WDNetworkRegistry.INSTANCE.sendToServer(C2SMessageScreenCtrl.laserDown(tes, side, hit)); } else { - tes.handleMouseEvent(side, S2CMessageScreenUpdate.MOUSE_MOVE, hit); WDNetworkRegistry.INSTANCE.sendToServer(C2SMessageScreenCtrl.laserMove(tes, side, hit)); } } @@ -741,7 +837,9 @@ public class ClientProxy extends SharedProxy implements IDisplayHandler, IJSQuer } } - private BlockHitResult raycast(double dist) { + private static BlockHitResult raycast(double dist) { + Minecraft mc = Minecraft.getInstance(); + Vec3 start = mc.player.getEyePosition(1.0f); Vec3 lookVec = mc.player.getLookAngle(); Vec3 end = start.add(lookVec.x * dist, lookVec.y * dist, lookVec.z * dist); diff --git a/src/main/java/net/montoyo/wd/client/gui/GuiMinePad.java b/src/main/java/net/montoyo/wd/client/gui/GuiMinePad.java index a8be35a..c86651b 100644 --- a/src/main/java/net/montoyo/wd/client/gui/GuiMinePad.java +++ b/src/main/java/net/montoyo/wd/client/gui/GuiMinePad.java @@ -37,9 +37,8 @@ public class GuiMinePad extends WDScreen { this(); this.pad = pad; - if (pad.view instanceof CefBrowserOsr osr) { - osr.allowCursorChanges(true); - } + if (WebDisplays.cursorSupport) + pad.view.allowCursorChanges(true); } @Override @@ -230,9 +229,10 @@ public class GuiMinePad extends WDScreen { @Override public void onClose() { super.onClose(); - if (pad.view instanceof CefBrowserOsr osr) { - osr.allowCursorChanges(true); - osr.onCursorChange(null, 0); + if (WebDisplays.cursorSupport) { + pad.view.allowCursorChanges(false); + if (pad.view instanceof CefBrowserOsr osr) + osr.onCursorChange(null, 0); } } } diff --git a/src/main/java/net/montoyo/wd/client/renderers/MinePadRenderer.java b/src/main/java/net/montoyo/wd/client/renderers/MinePadRenderer.java index 90f9103..8ee768c 100644 --- a/src/main/java/net/montoyo/wd/client/renderers/MinePadRenderer.java +++ b/src/main/java/net/montoyo/wd/client/renderers/MinePadRenderer.java @@ -34,15 +34,7 @@ public final class MinePadRenderer implements IItemRenderer { private float sinSwingProg1; private float sinSwingProg2; - @Override - public final boolean render(PoseStack stack, ItemStack is, float handSideSign, float swingProgress, float equipProgress, MultiBufferSource multiBufferSource, int packedLight) { - //Pre-compute values - float sqrtSwingProg = (float) Math.sqrt(swingProgress); - sinSqrtSwingProg1 = (float) Math.sin(sqrtSwingProg * PI); - sinSqrtSwingProg2 = (float) Math.sin(sqrtSwingProg * PI * 2.0f); - sinSwingProg1 = (float) Math.sin(swingProgress * PI); - sinSwingProg2 = (float) Math.sin(swingProgress * swingProgress * PI); - + public static boolean renderAtSide(float handSideSign) { float relSide = handSideSign; if (Minecraft.getInstance().player.getMainArm() == HumanoidArm.LEFT) relSide *= -1; @@ -55,6 +47,20 @@ public final class MinePadRenderer implements IItemRenderer { (relSide > 0 && Minecraft.getInstance().player.getItemInHand(InteractionHand.OFF_HAND).getItem() instanceof ItemMinePad2) ) sideHold = true; + return sideHold; + } + + @Override + public final boolean render(PoseStack stack, ItemStack is, float handSideSign, float swingProgress, float equipProgress, MultiBufferSource multiBufferSource, int packedLight) { + //Pre-compute values + float sqrtSwingProg = (float) Math.sqrt(swingProgress); + sinSqrtSwingProg1 = (float) Math.sin(sqrtSwingProg * PI); + sinSqrtSwingProg2 = (float) Math.sin(sqrtSwingProg * PI * 2.0f); + sinSwingProg1 = (float) Math.sin(swingProgress * PI); + sinSwingProg2 = (float) Math.sin(swingProgress * swingProgress * PI); + + boolean sideHold = renderAtSide(handSideSign); + //Render arm stack.pushPose(); renderArmFirstPerson(stack, multiBufferSource, packedLight, equipProgress, handSideSign); diff --git a/src/main/java/net/montoyo/wd/entity/TileEntityScreen.java b/src/main/java/net/montoyo/wd/entity/TileEntityScreen.java index 9acde3b..e64aee5 100644 --- a/src/main/java/net/montoyo/wd/entity/TileEntityScreen.java +++ b/src/main/java/net/montoyo/wd/entity/TileEntityScreen.java @@ -84,6 +84,8 @@ public class TileEntityScreen extends BlockEntity { public NibbleArray redstoneStatus; //null on client public boolean autoVolume = true; + public int mouseType; + public static Screen deserialize(CompoundTag tag) { Screen ret = new Screen(); ret.side = BlockSide.values()[tag.getByte("Side")]; @@ -228,7 +230,10 @@ public class TileEntityScreen extends BlockEntity { browser.resize(resolution.y, resolution.x); else browser.resize(resolution.x, resolution.y); - + + if (WebDisplays.cursorSupport) + browser.addCursorChangeListener((type) -> mouseType = type); + doTurnOnAnim = doAnim; turnOnTime = System.currentTimeMillis(); } diff --git a/src/main/java/net/montoyo/wd/mixins/OverlayMixin.java b/src/main/java/net/montoyo/wd/mixins/OverlayMixin.java new file mode 100644 index 0000000..62fe35b --- /dev/null +++ b/src/main/java/net/montoyo/wd/mixins/OverlayMixin.java @@ -0,0 +1,30 @@ +package net.montoyo.wd.mixins; + +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.Gui; +import net.montoyo.wd.client.ClientProxy; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(Gui.class) +public class OverlayMixin { + @Shadow + @Final + protected Minecraft minecraft; + + @Shadow + protected int screenWidth; + + @Shadow + protected int screenHeight; + + @Inject(at = @At("HEAD"), method = "renderCrosshair", cancellable = true) + public void preDrawCrosshair(PoseStack poseStack, CallbackInfo ci) { + ClientProxy.renderCrosshair(minecraft.options, screenWidth, screenHeight, ((Gui) (Object) this).getBlitOffset(), poseStack, ci); + } +} diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index 916ea02..ae29e3f 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -42,6 +42,6 @@ side="BOTH" [[dependencies.webdisplays]] modId="forgecef" mandatory=true -versionRange="[1.2.4, )" +versionRange="[1.2.3, )" ordering="NONE" side="BOTH" diff --git a/src/main/resources/assets/webdisplays/textures/gui/cursors.png b/src/main/resources/assets/webdisplays/textures/gui/cursors.png new file mode 100644 index 0000000..ee31110 Binary files /dev/null and b/src/main/resources/assets/webdisplays/textures/gui/cursors.png differ diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 229cda3..7a50bdd 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -22,7 +22,7 @@ ] }, "mixins": [ - "webdisplays.mixin.json" + "webdisplays.mixins.json" ], "depends": { diff --git a/src/main/resources/webdisplays.mixin.json b/src/main/resources/webdisplays.mixins.json similarity index 90% rename from src/main/resources/webdisplays.mixin.json rename to src/main/resources/webdisplays.mixins.json index 5c69d38..12c4abc 100644 --- a/src/main/resources/webdisplays.mixin.json +++ b/src/main/resources/webdisplays.mixins.json @@ -6,6 +6,7 @@ "mixins": [ ], "client": [ + "OverlayMixin" ], "injectors": { "defaultRequire": 1