From de2bc44a8ec83852b9573e8b6eb0b21b53b0e725 Mon Sep 17 00:00:00 2001 From: GiantLuigi4 <49770992+GiantLuigi4@users.noreply.github.com> Date: Sun, 4 Jun 2023 22:14:13 -0400 Subject: [PATCH] cursors --- build.gradle | 8 +- cursors.piskel | 1 + src/main/java/net/montoyo/wd/WebDisplays.java | 10 +- .../net/montoyo/wd/client/ClientProxy.java | 104 +++++++++++++++++- .../net/montoyo/wd/client/gui/GuiMinePad.java | 12 +- .../wd/client/renderers/MinePadRenderer.java | 24 ++-- .../montoyo/wd/entity/TileEntityScreen.java | 7 +- .../net/montoyo/wd/mixins/OverlayMixin.java | 30 +++++ src/main/resources/META-INF/mods.toml | 2 +- .../webdisplays/textures/gui/cursors.png | Bin 0 -> 2850 bytes src/main/resources/fabric.mod.json | 2 +- ...ays.mixin.json => webdisplays.mixins.json} | 1 + 12 files changed, 175 insertions(+), 26 deletions(-) create mode 100644 cursors.piskel create mode 100644 src/main/java/net/montoyo/wd/mixins/OverlayMixin.java create mode 100644 src/main/resources/assets/webdisplays/textures/gui/cursors.png rename src/main/resources/{webdisplays.mixin.json => webdisplays.mixins.json} (90%) 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 0000000000000000000000000000000000000000..ee3111004184adece6253d8ac27a7ef1a7991288 GIT binary patch literal 2850 zcmeI!|1+Bh90%~{NfV1GO>oxwk|NdNRNYmJlE^xisnaQD-KezNNS#JjIwkQXnWEj9 zFKdqr)9C1zyVAH>q@j@%LmO>c);=O>RFxn_`vmDjzRdoN-TCSB`SE?PU*7M_@yBTP zI9D710QNCoL?r+KxcPzr)@Jjh=G@Kz0Nh+m)Tc@LX^Rsn+3Il@bbQw5$kB|e+xv%u ze%s|k=hyZ;2f!mwr{C51f34A5G&T*d1Me0k-3$+te%KA7tSP)PT0Sfmi=hzAe8Yzn7D)Hgop;b-8*esKI)wBmL|t3bNDlvn4ny$%bbCiYBiAL=`VzIS(?>^7~uJ_TlM?t zy`~G*{C??3j}hT>K5-ZwuH=i$6dofH))q3wFsYm+_bu?1BBS;zOc4Bc&zfB4W44$# z(h+#S)ruH&^(xfPupkoDW=M09vh}XW+d1{{+o|0W>rCUbmfXU{YY=X#P(UbEF=7js zvcXh}Mp~LD3?lM&uigk{eAo=EfQ0m0E(bQEztvJRcJ$Ml!gKZpUXWSF>e}ht6suQ0 z@<&>)ZEEi1m4Ym7xxT{gl-}zl+f0zrpWI*Yc%Nvx#2LwdTsVu>?JEm`o!H8cr?h5P zQw2>o;3k*3NuF1=M9!?aKjA9_1<3p9A-$M2xn!}Giy+A}9sB$VqlTl%Wl7eOXUWEK zShWwLz%SvhP&is9GSWDOvj><5$8*j7AzT`Mx#-@KIk;QY`cr@8_qF;`@v3p4Hi86I zy8l8pstl^yv$Rx$?{rH^$v^5*f)Z}yM3}0%3c*8RV-7m|O+yy5*HXk>QFLAt-3KH5 z%hT76MvLSIL6({DJE--NEk=F?l(;vw{VPi)9`U)UFw8>#KSz zvL9@+66I3*w!nJ!3P^cvfeNb+38a(jNL5!Od7F_UhF}&)yRW>_LX^Aati3yH8^T@` z)%6;kEd2K3H&Vf(lu^NNJSK+k{k6uW(UkCdvcQeJGsg_H1|FUJ zFZ*w>7ctJ%otjWo917Q*>GmfcYv;=ix_1uUfOe*i9s0ow?-CE3{&5-`Z0pOt$s9i7 z8PE*$y&5E(af}Dz)HP+)6IAfxgI`Ho0k#CT1hxdW1hxeJ{{nuz|90ir{EAr{fvK4& z4@2WNdvYov%DZN>_xv(*vCcSOZr_bdQJy}{K*H!O-q$%ED2pXrrXHn&t*wu};(eO| hT)np=@2Wg