From 116f7290d0e6c28025546f1dee5a808cc2382d33 Mon Sep 17 00:00:00 2001 From: GiantLuigi4 <49770992+GiantLuigi4@users.noreply.github.com> Date: Fri, 2 Jun 2023 15:19:27 -0400 Subject: [PATCH] more minepad stuff, switch off of cloth config --- .../net/montoyo/wd/client/ClientProxy.java | 1 - .../net/montoyo/wd/client/gui/GuiSetURL2.java | 3 +- .../wd/client/renderers/MinePadRenderer.java | 213 +++++++++--------- .../wd/client/renderers/ModelMinePad.java | 82 +++---- .../net/montoyo/wd/config/CommonConfig.java | 3 +- .../montoyo/wd/config/annoconfg/AnnoCFG.java | 12 +- .../montoyo/wd/entity/TileEntityScreen.java | 2 +- .../wd/net/server_bound/C2SMinepadUrl.java | 33 ++- src/main/resources/META-INF/mods.toml | 7 - 9 files changed, 179 insertions(+), 177 deletions(-) diff --git a/src/main/java/net/montoyo/wd/client/ClientProxy.java b/src/main/java/net/montoyo/wd/client/ClientProxy.java index 83057f3..49d06e2 100644 --- a/src/main/java/net/montoyo/wd/client/ClientProxy.java +++ b/src/main/java/net/montoyo/wd/client/ClientProxy.java @@ -104,7 +104,6 @@ public class ClientProxy extends SharedProxy implements IDisplayHandler, IJSQuer isInHotbar = true; this.id = id; } - } private Minecraft mc; diff --git a/src/main/java/net/montoyo/wd/client/gui/GuiSetURL2.java b/src/main/java/net/montoyo/wd/client/gui/GuiSetURL2.java index 4ba1cb9..13abd28 100644 --- a/src/main/java/net/montoyo/wd/client/gui/GuiSetURL2.java +++ b/src/main/java/net/montoyo/wd/client/gui/GuiSetURL2.java @@ -100,11 +100,12 @@ public class GuiSetURL2 extends WDScreen { validate(tfURL.getText()); else if (ev.getSource() == btnShutDown) { if (isPad) { + stack.getTag().remove("PadURL"); + stack.getTag().remove("PadID"); WDNetworkRegistry.INSTANCE.sendToServer(new C2SMinepadUrl( getUUID(), "" )); - stack.getTag().remove("PadURL"); } minecraft.setScreen(null); 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 1677aec..c87117f 100644 --- a/src/main/java/net/montoyo/wd/client/renderers/MinePadRenderer.java +++ b/src/main/java/net/montoyo/wd/client/renderers/MinePadRenderer.java @@ -11,118 +11,119 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.entity.player.PlayerRenderer; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.InteractionHand; import net.minecraft.world.item.ItemStack; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.montoyo.wd.WebDisplays; import net.montoyo.wd.client.ClientProxy; +import net.montoyo.wd.item.ItemMinePad2; @OnlyIn(Dist.CLIENT) public final class MinePadRenderer implements IItemRenderer { - - private static final float PI = (float) Math.PI; - private final Minecraft mc = Minecraft.getInstance(); - private final ResourceLocation tex = new ResourceLocation("webdisplays", "textures/models/minepad.png"); - // private final ModelMinePad model = new ModelMinePad(); - private final ClientProxy clientProxy = (ClientProxy) WebDisplays.PROXY; - - private float sinSqrtSwingProg1; - private float sinSqrtSwingProg2; - private float sinSwingProg1; - private float sinSwingProg2; - -// public static void drawAxis() { -// glDisable(GL_TEXTURE_2D); -// glBegin(GL_LINES); -// glColor4f(1.f, 0.f, 0.f, 1.f); glVertex3d(0.0, 0.0, 0.0); -// glColor4f(1.f, 0.f, 0.f, 1.f); glVertex3d(5.0, 0.0, 0.0); -// glColor4f(0.f, 1.f, 0.f, 1.f); glVertex3d(0.0, 0.0, 0.0); -// glColor4f(0.f, 1.f, 0.f, 1.f); glVertex3d(0.0, 5.0, 0.0); -// glColor4f(0.f, 0.f, 1.f, 1.f); glVertex3d(0.0, 0.0, 0.0); -// glColor4f(0.f, 0.f, 1.f, 1.f); glVertex3d(0.0, 0.0, 5.0); -// glEnd(); -// glEnable(GL_TEXTURE_2D); -// } - - @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); - - //Render arm - stack.pushPose(); - renderArmFirstPerson(stack, multiBufferSource, packedLight, equipProgress, handSideSign); - stack.popPose(); - - //Prepare minePad transform - stack.pushPose(); - stack.translate(handSideSign * -0.4f * sinSqrtSwingProg1, 0.2f * sinSqrtSwingProg2, -0.2f * sinSwingProg1); - stack.translate(handSideSign * 0.56f, -0.52f - equipProgress * 0.6f, -0.72f); - stack.mulPose(Vector3f.YP.rotationDegrees(handSideSign * (45.0f - sinSwingProg2 * 20.0f))); - stack.mulPose(Vector3f.ZP.rotationDegrees(handSideSign * sinSqrtSwingProg1 * -20.0f)); - stack.mulPose(Vector3f.XP.rotationDegrees(sinSqrtSwingProg1 * -80.0f)); - stack.mulPose(Vector3f.YP.rotationDegrees(handSideSign * -45.0f)); - - if(handSideSign >= 0.0f) - stack.translate(-1.065f, 0.0f, 0.0f); - else { - stack.translate(0.0f, 0.0f, -0.2f); - stack.mulPose(Vector3f.YP.rotationDegrees(20.0f)); - stack.translate(-0.475f, -0.1f, 0.0f); - stack.mulPose(Vector3f.ZP.rotationDegrees(1.0f)); - } - - //Render model - stack.pushPose(); - stack.mulPose(Vector3f.XP.rotationDegrees(-90.0f)); - RenderSystem.setShaderColor(1.0f, 1.0f, 1.0f, 1.0f); - RenderSystem.setShaderTexture(0, tex); - // model.render(1.f / 16.f); - stack.popPose(); - - //Render web view - if(is.getTag() != null && is.getTag().contains("PadID")) { - ClientProxy.PadData pd = clientProxy.getPadByID(is.getTag().getUUID("PadID")); - - if(pd != null) { - stack.translate(0.063f, 0.28f, 0.001f); - RenderSystem.setShaderTexture(0, tex); - pd.view.draw(stack,0.0, 0.0, 27.65 / 32.0 + 0.01, 14.0 / 32.0 + 0.002); - } - } - - stack.popPose(); - RenderSystem.enableCull(); - - return false; - } - - private void renderArmFirstPerson(PoseStack stack, MultiBufferSource buffer, int combinedLight, float equipProgress, float handSideSign) { - float tx = -0.3f * sinSqrtSwingProg1; - float ty = 0.4f * sinSqrtSwingProg2; - float tz = -0.4f * sinSwingProg1; - - stack.translate(handSideSign * (tx + 0.64000005f), ty - 0.6f - equipProgress * 0.6f, tz - 0.71999997f); - stack.mulPose(Vector3f.YP.rotationDegrees(handSideSign * 45.0f)); - stack.mulPose(Vector3f.YP.rotationDegrees(handSideSign * sinSqrtSwingProg1 * 70.0f)); - stack.mulPose(Vector3f.ZP.rotationDegrees(handSideSign * sinSwingProg2 * -20.0f)); - stack.translate(-handSideSign, 3.6f, 3.5f); - stack.mulPose(Vector3f.ZP.rotationDegrees(handSideSign * 120.0f)); - stack.mulPose(Vector3f.XP.rotationDegrees(200.0f)); - stack.mulPose(Vector3f.YP.rotationDegrees(handSideSign * -135.0f)); - stack.translate(handSideSign * 5.6f, 0.0f, 0.0f); - - PlayerRenderer playerRenderer = (PlayerRenderer) mc.getEntityRenderDispatcher().getRenderer(mc.player); - RenderSystem.setShaderTexture(0, mc.player.getSkinTextureLocation()); - - if(handSideSign >= 0.0f) - playerRenderer.renderRightHand(stack, buffer, combinedLight, mc.player); - else - playerRenderer.renderLeftHand(stack, buffer, combinedLight, mc.player); - } - + private static final float PI = (float) Math.PI; + private final Minecraft mc = Minecraft.getInstance(); + private final ResourceLocation tex = new ResourceLocation("webdisplays", "textures/models/minepad.png"); + private final ModelMinePad model = new ModelMinePad(); + private final ClientProxy clientProxy = (ClientProxy) WebDisplays.PROXY; + + private float sinSqrtSwingProg1; + private float sinSqrtSwingProg2; + 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); + + //Render arm + stack.pushPose(); + renderArmFirstPerson(stack, multiBufferSource, packedLight, equipProgress, handSideSign); + stack.popPose(); + + //Prepare minePad transform + stack.pushPose(); + stack.translate(handSideSign * -0.4f * sinSqrtSwingProg1, 0.2f * sinSqrtSwingProg2, -0.2f * sinSwingProg1); + stack.translate(handSideSign * 0.56f, -0.52f - equipProgress * 0.6f, -0.72f); + stack.mulPose(Vector3f.YP.rotationDegrees(handSideSign * (45.0f - sinSwingProg2 * 20.0f))); + stack.mulPose(Vector3f.ZP.rotationDegrees(handSideSign * sinSqrtSwingProg1 * -20.0f)); + stack.mulPose(Vector3f.XP.rotationDegrees(sinSqrtSwingProg1 * -80.0f)); + stack.mulPose(Vector3f.YP.rotationDegrees(handSideSign * -45.0f)); + + // by default, the player holds the device off to the side + // if they are crouching, they hold it infront of them + // however, if they are holding two at once, then it once again should just be held off to the side + boolean sideHold = !Minecraft.getInstance().player.isShiftKeyDown(); + if ( + (handSideSign < 0 && Minecraft.getInstance().player.getItemInHand(InteractionHand.MAIN_HAND).getItem() instanceof ItemMinePad2) || + (handSideSign > 0 && Minecraft.getInstance().player.getItemInHand(InteractionHand.OFF_HAND).getItem() instanceof ItemMinePad2) + ) sideHold = true; + + if (sideHold) { + stack.translate(0.0f, 0.0f, -0.2f); + stack.mulPose(Vector3f.YP.rotationDegrees(20.0f * -handSideSign)); + float total = 0.475f; + float off = -0.025f; // gotta love magic numbers + stack.translate(-(total - off) + (off * handSideSign), -0.1f, 0.0f); + stack.mulPose(Vector3f.ZP.rotationDegrees(1.0f)); + } else if (handSideSign >= 0) // right hand + stack.translate(-1.065f, 0.0f, 0.0f); + else // left hand + stack.translate(0.065f, 0.0f, 0.0f); + + //Render model + stack.translate(0.063f, 0.28f, 0.001f); + model.render(multiBufferSource, stack); + stack.translate(-0.063f, -0.28f, -0.001f); + + if (is.getTag() != null && is.getTag().contains("PadID")) { + ClientProxy.PadData pd = clientProxy.getPadByID(is.getTag().getUUID("PadID")); + + //Render web view + if (pd != null) { + double x1 = 0.0; + double y1 = 0.0; + double x2 = 27.65 / 32.0 + 0.01; + double y2 = 14.0 / 32.0 + 0.002; + + stack.translate(0.063f, 0.28f, 0.001f); + RenderSystem.setShaderTexture(0, tex); + pd.view.draw(stack, x1, y1, x2, y2); + } + } + + stack.popPose(); + RenderSystem.enableCull(); + + return true; + } + + private void renderArmFirstPerson(PoseStack stack, MultiBufferSource buffer, int combinedLight, float equipProgress, float handSideSign) { + float tx = -0.3f * sinSqrtSwingProg1; + float ty = 0.4f * sinSqrtSwingProg2; + float tz = -0.4f * sinSwingProg1; + + stack.translate(handSideSign * (tx + 0.64000005f), ty - 0.6f - equipProgress * 0.6f, tz - 0.71999997f); + stack.mulPose(Vector3f.YP.rotationDegrees(handSideSign * 45.0f)); + stack.mulPose(Vector3f.YP.rotationDegrees(handSideSign * sinSqrtSwingProg1 * 70.0f)); + stack.mulPose(Vector3f.ZP.rotationDegrees(handSideSign * sinSwingProg2 * -20.0f)); + stack.translate(-handSideSign, 3.6f, 3.5f); + stack.mulPose(Vector3f.ZP.rotationDegrees(handSideSign * 120.0f)); + stack.mulPose(Vector3f.XP.rotationDegrees(200.0f)); + stack.mulPose(Vector3f.YP.rotationDegrees(handSideSign * -135.0f)); + stack.translate(handSideSign * 5.6f, 0.0f, 0.0f); + + PlayerRenderer playerRenderer = (PlayerRenderer) mc.getEntityRenderDispatcher().getRenderer(mc.player); + RenderSystem.setShaderTexture(0, mc.player.getSkinTextureLocation()); + + if (handSideSign >= 0.0f) + playerRenderer.renderRightHand(stack, buffer, combinedLight, mc.player); + else + playerRenderer.renderLeftHand(stack, buffer, combinedLight, mc.player); + } } diff --git a/src/main/java/net/montoyo/wd/client/renderers/ModelMinePad.java b/src/main/java/net/montoyo/wd/client/renderers/ModelMinePad.java index 3f6b21c..ad916bc 100644 --- a/src/main/java/net/montoyo/wd/client/renderers/ModelMinePad.java +++ b/src/main/java/net/montoyo/wd/client/renderers/ModelMinePad.java @@ -4,60 +4,36 @@ package net.montoyo.wd.client.renderers; -/*import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexConsumer; -import net.minecraft.client.model.Model; -import net.minecraft.client.model.geom.ModelPart; +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.*; +import com.mojang.math.Matrix4f; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.client.renderer.MultiBufferSource; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @OnlyIn(Dist.CLIENT) -public final class ModelMinePad extends Model { - - // fields - private final ModelPart base; - private final ModelPart left; - private final ModelPart right; - - public ModelMinePad() { - super(); - textureWidth = 64; - textureHeight = 32; - - base = new ModelPart(this, 0, 0); - base.addBox(0F, 0F, 0F, 14, 1, 9); - base.setRotationPoint(1F, 0F, 3.5F); - base.setTextureSize(64, 32); - base.mirror = true; - clearRotation(base); - left = new ModelRenderer(this, 0, 10); - left.addBox(0F, 0F, 0F, 1, 1, 7); - left.setRotationPoint(0F, 0F, 4.5F); - left.setTextureSize(64, 32); - left.mirror = true; - clearRotation(left); - right = new ModelRenderer(this, 30, 10); - right.addBox(0F, 0F, 0F, 1, 1, 7); - right.setRotationPoint(15F, 0F, 4.5F); - right.setTextureSize(64, 32); - right.mirror = true; - clearRotation(right); - } - - public final void render(float f5) { - base.render(f5); - left.render(f5); - right.render(f5); - } - - private void clearRotation(ModelPart model) { - model.rotateAngleX = 0.0f; - model.rotateAngleY = 0.0f; - model.rotateAngleZ = 0.0f; - } - - @Override - public void renderToBuffer(PoseStack poseStack, VertexConsumer buffer, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { - - } -}*/ +public final class ModelMinePad { + public void render(MultiBufferSource buffers, PoseStack stack) { + // TODO: this needs completing + // TODO: I'd like this to be able to load a model from a JSON if possible + + double x1 = 1.0; + double y1 = 0.0; + double x2 = 27.65 / 32.0 + 0.01; + double y2 = 14.0 / 32.0 + 0.002; + + Matrix4f positionMatrix = stack.last().pose(); + Tesselator t = Tesselator.getInstance(); + BufferBuilder vb = t.getBuilder(); + + RenderSystem.setShader(GameRenderer::getPositionColorShader); + RenderSystem.setShaderColor(1.0f, 1.0f, 1.0f, 1.0f); + vb.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); + vb.vertex(positionMatrix, (float) x1, (float) y1, 0.0f).color(0, 0, 0, 255).endVertex(); + vb.vertex(positionMatrix, (float) x2, (float) y1, 0.0f).color(0, 0, 0, 255).endVertex(); + vb.vertex(positionMatrix, (float) x2, (float) y2, 0.0f).color(0, 0, 0, 255).endVertex(); + vb.vertex(positionMatrix, (float) x1, (float) y2, 0.0f).color(0, 0, 0, 255).endVertex(); + t.end(); + } +} diff --git a/src/main/java/net/montoyo/wd/config/CommonConfig.java b/src/main/java/net/montoyo/wd/config/CommonConfig.java index dea3846..2515f9d 100644 --- a/src/main/java/net/montoyo/wd/config/CommonConfig.java +++ b/src/main/java/net/montoyo/wd/config/CommonConfig.java @@ -35,9 +35,10 @@ public class CommonConfig { @Comment("Options for the browsers (both the minePad and the screens)") @CFGSegment("browser_options") public static class Browser { - @Name("home_page") + @Name("blacklist") @Comment("The page which screens should open up to when turning on") @Translation("config.webdisplays.blacklist") + @Default(valueStr = "") public static String[] blacklist = new String[0]; @Name("home_page") diff --git a/src/main/java/net/montoyo/wd/config/annoconfg/AnnoCFG.java b/src/main/java/net/montoyo/wd/config/annoconfg/AnnoCFG.java index 550cffa..5cb88ee 100644 --- a/src/main/java/net/montoyo/wd/config/annoconfg/AnnoCFG.java +++ b/src/main/java/net/montoyo/wd/config/annoconfg/AnnoCFG.java @@ -138,10 +138,13 @@ public class AnnoCFG { case OTHER -> { Class fieldType = field.getType(); if (fieldType.equals(String[].class)) { - value = builder.define(nameStr, new String[0]); + Supplier sup = builder.define(nameStr, defaultValue.valueStr()); + value = () -> { + String v = sup.get(); + return v.split(","); + }; } else if (fieldType.equals(String.class)) { - String def = defaultValue.valueStr(); - value = builder.define(nameStr, def); + value = builder.define(nameStr, defaultValue.valueStr()); } else throw new RuntimeException("NYI " + field.getType()); } @@ -149,7 +152,8 @@ public class AnnoCFG { } } catch (NullPointerException npe) { String inf = ""; - if (npe.getMessage().contains("\"value.Default\"")) inf = " this is likely due to a missing default."; + if (npe.getMessage().contains("\"value.Default\"")) + inf = " this is likely due to a missing default."; throw new RuntimeException("A null pointer occurred on " + field.getName() + inf, npe); } diff --git a/src/main/java/net/montoyo/wd/entity/TileEntityScreen.java b/src/main/java/net/montoyo/wd/entity/TileEntityScreen.java index df08b70..6e8d8be 100644 --- a/src/main/java/net/montoyo/wd/entity/TileEntityScreen.java +++ b/src/main/java/net/montoyo/wd/entity/TileEntityScreen.java @@ -224,7 +224,7 @@ public class TileEntityScreen extends BlockEntity { public void createBrowser(boolean doAnim) { if (WebDisplays.PROXY instanceof ClientProxy clientProxy) { browser = clientProxy.getMCEF().createBrowser(WebDisplays.applyBlacklist(url != null ? url : "https://www.google.com")); - + if (rotation.isVertical) browser.resize(resolution.y, resolution.x); else diff --git a/src/main/java/net/montoyo/wd/net/server_bound/C2SMinepadUrl.java b/src/main/java/net/montoyo/wd/net/server_bound/C2SMinepadUrl.java index 29fede8..d8ce7cc 100644 --- a/src/main/java/net/montoyo/wd/net/server_bound/C2SMinepadUrl.java +++ b/src/main/java/net/montoyo/wd/net/server_bound/C2SMinepadUrl.java @@ -30,13 +30,40 @@ public class C2SMinepadUrl extends Packet { buf.writeUtf(url); } + protected void merge(ItemStack stack) { + if (url.equals("")) { + stack.getOrCreateTag().remove("PadID"); + stack.getOrCreateTag().remove("PadURL"); + } else { + stack.getOrCreateTag().putUUID("PadID", id); + stack.getOrCreateTag().putString("PadURL", url); + } + } + @Override public void handle(NetworkEvent.Context ctx) { + // check if the player is holding a minePad with the requested id + // if the player is, then update that pad for (InteractionHand value : InteractionHand.values()) { ItemStack stack = ctx.getSender().getItemInHand(value); - if (stack.getItem() instanceof ItemMinePad2 pad) { - stack.getOrCreateTag().putUUID("PadID", id); - stack.getOrCreateTag().putString("PadURL", url); + if (stack.getItem() instanceof ItemMinePad2 && stack.getOrCreateTag().contains("PadID")) { + UUID padId = stack.getTag().getUUID("PadID"); + if (padId.equals(id)) { + merge(stack); + return; + } + } + } + + // if the player is not holding the requested minePad, update the first one that does not already have an ID + for (InteractionHand value : InteractionHand.values()) { + ItemStack stack = ctx.getSender().getItemInHand(value); + if (stack.getItem() instanceof ItemMinePad2 && stack.getOrCreateTag().contains("PadID")) { + if (stack.getOrCreateTag().contains("PadID")) + continue; + + merge(stack); + return; } } } diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index 407f9df..d80f945 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -45,10 +45,3 @@ mandatory=true versionRange="[1.0.0, )" ordering="NONE" side="BOTH" - -[[dependencies.webdisplays]] -modId="cloth_config" -mandatory=true -versionRange="[8.2.88, )" -ordering="NONE" -side="BOTH" \ No newline at end of file