Jump to content

Recommended Posts

Posted (edited)

Hi, this article is more of a experience sharing instead of a tutorial, the code themselves should be self-explanatory, and the way I do things may not be the best practice, or most efficient.

Product:

zo1hIgh.png

 

I started with the textures, we need the textures/icons that are being rendered to the world, and the ones for the UI.

Kgqtirx.png

DFX7VXu.png

The blue textures are used when the option is hovered.

Then, we need to find out where the mouse is at and which one is selected, we can check the distance and angle from the screen center and decide which part it is on:

    private int getHoveringType(Minecraft minecraft)
    {
      double mX = minecraft.mouseHelper.getMouseX();
      double mY = minecraft.mouseHelper.getMouseY();
      double actualW = minecraft.getMainWindow().getWidth() / 2.0F;
      double actualH = minecraft.getMainWindow().getHeight() / 2.0F;
      double mX2 = mX - actualW;
      double mY2 = mY - actualH;
      double angle = AVAWeaponUtil.getAngleFromCoord(mX2, -mY2) + 30;
      if (Math.sqrt(mX2 * mX2 + mY2 * mY2) <= 15 * minecraft.getMainWindow().getGuiScaleFactor())
        return -1;
      if (angle > 360 || angle <= 60)
        return 0;
      return ((int) angle / 60);
    }

    public static double getAngleFromCoord(double x, double y)
    {
        double angle;
        angle = abs(atan2(x, y) * 180.0D / PI);
        if (x < 0)
            angle = 360 - angle;
        return angle;
    }

In this case the angle is 60 because 360 / 6 options = 60, and if the mouse is within radius of 15 from the screen center then no action is performed (-1)

And then the rendering can be done.

    @Override
      public void render(Minecraft minecraft, PlayerEntity player, MatrixStack stack, IPlayerAction capability, float screenWidth, float screenHeight)
    {
      float x = screenWidth / 2.0F;
      float y = screenHeight / 2.0F;
      float size = 60;
      int type = getHoveringType(minecraft);
      AVAClientUtil.blit(stack, type == -1 ? UI_BG_LIT : UI_BG, x - size, y - size, x + size, y + size);
      for (int i = 0; i < 6; i++)
      {
        stack.push();
        stack.translate(x, y, 0.0F);
        stack.rotate(Vector3f.ZP.rotationDegrees(i * 60));
        stack.translate(-x, -y, 0.0F);
        AVAClientUtil.blit(stack, type == i ? UI_BG_2_LIT : UI_BG_2, x - size, y - size, x + size, y + size);
        stack.pop();
      }
      AVAClientUtil.blit(stack, UI_BG_ICON_LAYER, x - size, y - size, x + size, y + size);
    }

    public static void blit(MatrixStack stack, @Nullable ResourceLocation texture, float x1, float y1, float x2, float y2)
    {
        if (texture != null)
            Minecraft.getInstance().getTextureManager().bindTexture(texture);
        Matrix4f matrix = stack.getLast().getMatrix();
        Tessellator tessellator = Tessellator.getInstance();
        BufferBuilder bufferbuilder = tessellator.getBuffer();
        bufferbuilder.begin(7, DefaultVertexFormats.POSITION_TEX);
        bufferbuilder.pos(matrix, x1, y2, 0.0F).tex(0.0F, 1.0F).endVertex();
        bufferbuilder.pos(matrix, x2, y2, 0.0F).tex(1.0F, 1.0F).endVertex();
        bufferbuilder.pos(matrix, x2, y1, 0.0F).tex(1.0F, 0.0F).endVertex();
        bufferbuilder.pos(matrix, x1, y1, 0.0F).tex(0.0F, 0.0F).endVertex();
        tessellator.draw();
    }

If the type is -1, then the circle at the center use the blue texture.

Otherwise if the type equals the index of the option, it uses the blue texture (or just use RenderSystem.color4f).

By rotating an identical texture we don't need to have 6 different textures for each option.

 

 

        public static boolean ACTIVE = false;
        public static Vector3d VEC = null;
        @Override
        public void tick(Minecraft minecraft, PlayerEntity player)
        {
            if (minecraft.isGameFocused() && minecraft.currentScreen == null && AVAClientConfig.ENABLE_PING_HOTKEY.get())
            {
                if (AVAClientUtil.middleMouseDown())
                {
                    if (!ACTIVE)
                    {
                        Vector3d eye = AVAWeaponUtil.getEyePositionFor(player);
                        BlockRayTraceResult result = player.world.rayTraceBlocks(new RayTraceContext(eye, eye.add(player.getLookVec().scale(100.0F)), RayTraceContext.BlockMode.VISUAL, RayTraceContext.FluidMode.NONE, player));
                        if (result.getType() != RayTraceResult.Type.MISS)
                        {
                            ACTIVE = true;
                            minecraft.mouseHelper.ungrabMouse();
                            if (minecraft.gameSettings.keyBindPickBlock.getKey().getKeyCode() == GLFW.GLFW_MOUSE_BUTTON_MIDDLE)
                                AVAClientUtil.unpressKeybind(minecraft.gameSettings.keyBindPickBlock);
                            VEC = result.getHitVec();
                        }
                    }
                }
                else
                {
                    int type = getHoveringType(minecraft);
                    if (ACTIVE && VEC != null && type != -1)
                        AVAPackets.INSTANCE.sendToServer(new PingMessage(VEC, ActivePingEffect.Type.values()[type]));
                    reset(minecraft);
                }
            }
            else reset(minecraft);
        }

If player's focusing, the middle mouse is down, then we check if there's terrain (block) in player's sight within 100 blocks, if not, reset the vec, regrab the mouse and set active to false.

MouseHelper#ungrabMouse call allows players to move mouse around the screen.

 

Once we have the VEC set (where the ping will occur), we can render a line between the center of the screen and the ping location. (White line)

AxLrJ4e.png

{
          ActiveRenderInfo info = minecraft.gameRenderer.getActiveRenderInfo();
          Vector3f view = info.getViewVector();
          Vector3d vec = info.getProjectedView().add(view.getX(), view.getY(), view.getZ());
          drawLine(stack, (float) vec.x, (float) vec.y, (float) vec.z, (float) pingVec.x, (float) pingVec.y, (float) pingVec.z, 255, 255, 255, 1.0F)
  }

    public static void drawLine(MatrixStack stack, float x1, float y1, float z1, float x2, float y2, float z2, int r, int g, int b, float a)
    {
        AVAClientUtil.drawTransparent(true);
        IRenderTypeBuffer.Impl impl = IRenderTypeBuffer.getImpl(Tessellator.getInstance().getBuffer());
        IVertexBuilder builder = impl.getBuffer(RenderType.LINES);
        Vector3d view = Minecraft.getInstance().gameRenderer.getActiveRenderInfo().getProjectedView();
        stack.push();
        stack.translate(-view.x, -view.y, -view.z);
        Matrix4f matrix = stack.getLast().getMatrix();
        builder.pos(matrix, x1, y1, z1).color(r, g, b, (int) (a * 255.0F)).endVertex();
        builder.pos(matrix, x2, y2, z2).color(r, g, b, (int) (a * 255.0F)).endVertex();
        stack.pop();
        impl.finish();
        AVAClientUtil.drawTransparent(false);
        RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F);
    }
                      
                      
                      

If you did not add the look offset to the camera position it will not be visible.

 

Then we send a packet to the server to notify all other players that I've ping the location.

Once players receives the location of the pings, it's time to render them.

                RenderSystem.disableDepthTest();
                AVAClientUtil.drawTransparent(true);
                Vector3d view = Minecraft.getInstance().gameRenderer.getActiveRenderInfo().getProjectedView();
                Vector3d vec = activePing.getVec();
                double distance = activePing.getVec().distanceTo(view);
                if (distance > 100.0F)
                    continue;
                renderObjectAt(minecraft, activePing, world, stack, (float) (distance / 20.0F), 0.0F, activePing.getTexture());
                double x = vec.x - view.getX();
                double y = vec.y - view.getY();
                double z = vec.z - view.getZ();
                stack.push();
                stack.translate(x, y, z);
                stack.rotate(minecraft.getRenderManager().getCameraOrientation());
                stack.rotate(Vector3f.ZP.rotationDegrees(180.0F));
                float size = (float) (distance / 200.0F);
                stack.scale(size, size, size);
                IRenderTypeBuffer.Impl impl = IRenderTypeBuffer.getImpl(Tessellator.getInstance().getBuffer());
                String text = AVACommonUtil.round(distance, 2) + "m";
                minecraft.fontRenderer.func_243247_a(new StringTextComponent(text), -minecraft.fontRenderer.getStringWidth(text) / 2.0F, 10, AVAConstants.AVA_HUD_TEXT_WHITE, false, stack.getLast().getMatrix(), impl, true, 0, 15728880);
                impl.finish();
                stack.pop();

    private static void renderObjectAt(Minecraft minecraft, EnvironmentObjectEffect object, World world, MatrixStack stack, float size, float offsetScale, ResourceLocation texture)
    {
        Vector3d vec = object.getVec();
        stack.push();
        Vector3d view = Minecraft.getInstance().gameRenderer.getActiveRenderInfo().getProjectedView();
        double x = vec.x - view.getX();
        double y = vec.y - view.getY();
        double z = vec.z - view.getZ();
        if (Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2) + Math.pow(z, 2)) > 100.0F)
            return;
        stack.translate(x, y, z);
        Direction direction = object.getDirection();
        if (direction != null)
        {
            Vector3i offset = direction.getDirectionVec();
            stack.translate(offset.getX() * offsetScale, offset.getY() * offsetScale, offset.getZ() * offsetScale);
            rotateByDirection(stack, direction);
        }
        else
        {
            stack.rotate(minecraft.getRenderManager().getCameraOrientation());
            stack.rotate(Vector3f.ZP.rotationDegrees(180.0F));
        }
        if (object.doBlend())
        {
            Color colour = new Color(world.getBlockState(object.getPos()).getMaterialColor(world, object.getPos()).colorValue);
            RenderSystem.color4f(colour.getRed() / 255.0F, colour.getGreen() / 255.0F, colour.getBlue() / 255.0F, object.getTransparency());
        }
        AVAClientUtil.blit(stack, texture, -size, -size, size, size);
        RenderSystem.color4f(1.0F, 1.0F, 1.0f, 1.0F);
        stack.pop();
    }

QTSIc8A.png

T1IxILB.png

 

In the code I change the size of the object according to the distance ( (distance / 20.0F) ), so the object will stay at similar size no matter the distance between them, and so does the text size.

The direction is always null, and doBlend is false. They are used in my other renderings.

 

 

 

Edited by poopoodice
  • Like 2
  • Thanks 1

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • If you are using AMD/ATI, update your drivers - get the drivers from their website - do not update via system
    • Not sure why this is happening, but I would love some help. The reason I restarted the server was because I was getting an error while trying to join regarding this "Internal Exception: io.netty.handler.codec.DecoderException: io.netty.handler.codec.EncoderException: java.io.IOException: Root tag must be a named compound tag" Im using ServerMiner if thats any help
    • [13-05-2025 02:20:01]    |-- fabric-renderer-registries-v1 3.2.25+df3654b390 [13-05-2025 02:20:01]    |-- fabric-rendering-data-attachment-v1 0.3.19+6e0787e690 [13-05-2025 02:20:01]    |-- fabric-rendering-fluids-v1 3.0.11+4d0d570390 [13-05-2025 02:20:01]    |-- fabric-rendering-v0 1.1.28+df3654b390 [13-05-2025 02:20:01]    |-- fabric-rendering-v1 1.13.0+526f2c6790 [13-05-2025 02:20:01]    |-- fabric-resource-conditions-api-v1 2.1.2+aae9039d90 [13-05-2025 02:20:01]    |-- fabric-resource-loader-v0 0.8.4+edbdcddb90 [13-05-2025 02:20:01]    |-- fabric-screen-api-v1 1.0.32+4d0d570390 [13-05-2025 02:20:01]    |-- fabric-screen-handler-api-v1 1.3.8+1cc24b1b90 [13-05-2025 02:20:01]    |-- fabric-sound-api-v1 1.0.2+c4f28df590 [13-05-2025 02:20:01]    |-- fabric-textures-v0 1.0.24+aeb40ebe90 [13-05-2025 02:20:01]    |-- fabric-transfer-api-v1 2.1.6+413cbbc790 [13-05-2025 02:20:01]    \-- fabric-transitive-access-wideners-v1 1.3.3+08b73de490 [13-05-2025 02:20:01] - fabricloader 0.16.14 [13-05-2025 02:20:01]    \-- mixinextras 0.4.1 [13-05-2025 02:20:01] - geckolib3 3.1.40 [13-05-2025 02:20:01]    \-- com_eliotlash_mclib_mclib 20 [13-05-2025 02:20:01] - genesis 1.19.2-1.0.2 [13-05-2025 02:20:01] - grounded_origins 1.2.3 [13-05-2025 02:20:01]    \-- apugli 1.9.3+1.19-fabric [13-05-2025 02:20:01] - icarus 1.14.1 [13-05-2025 02:20:01] - identity 2.6.1-1.19.1 [13-05-2025 02:20:01]    \-- omega-config 1.2.3-1.18.1 [13-05-2025 02:20:01] - impaled 1.1.4 [13-05-2025 02:20:01] - itemfig 1.19.2-0.2.7-fabric [13-05-2025 02:20:01] - java 17 [13-05-2025 02:20:01] - journeymap 5.9.8 [13-05-2025 02:20:01]    \-- journeymap-api-fabric 1.19.1-1.9-fabric-SNAPSHOT [13-05-2025 02:20:01] - landchidori 1.0.3 [13-05-2025 02:20:01] - latoorigins 1.19.2-1.1.0 [13-05-2025 02:20:01] - lithium 0.11.1 [13-05-2025 02:20:01] - magic_origins v0.3.5 [13-05-2025 02:20:01] - medievalorigins 5.1.9.2+1.19.2 [13-05-2025 02:20:01]    |-- additionalentityattributes 1.4.0+1.19.2 [13-05-2025 02:20:01]    |-- common-protection-api 1.0.0 [13-05-2025 02:20:01]    \-- reach-entity-attributes 2.3.0 [13-05-2025 02:20:01] - midnightlib 1.0.0 [13-05-2025 02:20:01] - minecraft 1.19.2 [13-05-2025 02:20:01] - moborigins 1.10.0 [13-05-2025 02:20:01] - mrplaguewarper 1.0.8 [13-05-2025 02:20:01] - mythic 1.0.2 [13-05-2025 02:20:01] - mythorigins 1.19-0.2.0 [13-05-2025 02:20:01] - omnitrix_origins 1.0.0 [13-05-2025 02:20:01] - oneporigins 1.0 [13-05-2025 02:20:01] - origins 1.7.1 [13-05-2025 02:20:01]    |-- apoli 2.6.1 [13-05-2025 02:20:01]    |    |-- calio 1.7.0 [13-05-2025 02:20:01]    |    |-- cardinal-components-base 5.0.1 [13-05-2025 02:20:01]    |    |-- cardinal-components-entity 5.0.1 [13-05-2025 02:20:01]    |    |-- cloth-config 8.0.75 [13-05-2025 02:20:01]    |    |    \-- cloth-basic-math 0.6.1 [13-05-2025 02:20:01]    |    \-- playerabilitylib 1.6.0 [13-05-2025 02:20:01]    \-- reach-entity-attributes 2.3.0 [13-05-2025 02:20:01] - origins-plus-plus 2.3.1 [13-05-2025 02:20:01] - origins_4d_being 1.0.0 [13-05-2025 02:20:01] - origins_vampire_mr 1-v2.1.0 [13-05-2025 02:20:01] - originsumbrellas 1.5.4 [13-05-2025 02:20:01] - pehkui 3.8.3+1.14.4-1.21 [13-05-2025 02:20:01]    \-- kanos_config 0.4.1+1.14.4-1.19.4 [13-05-2025 02:20:01] - promans_origins 1.0.0 [13-05-2025 02:20:01] - rpg_origins 1.4.3 [13-05-2025 02:20:01] - sculkling 1.0.0 [13-05-2025 02:20:01] - seleni 0.2.5+1.19.2 [13-05-2025 02:20:01] - slimeorigin 2.0.2-1.19.2 [13-05-2025 02:20:01] - spilaioorigins 1.19-0.3.0 [13-05-2025 02:20:01] - thiccpackets 1.17-1.19+ [13-05-2025 02:20:01] - thorigins 4.2.0 [13-05-2025 02:20:01] - trinkets 3.4.2 [13-05-2025 02:20:01] - voidwalker 1.0.0 [13-05-2025 02:20:01] - yee 3.0.3 [13-05-2025 02:20:01] Found 1 non-fabric mod: [13-05-2025 02:20:01] - better_weapons-1.jar [13-05-2025 02:20:01] SpongePowered MIXIN Subsystem Version=0.8.7 Source=file:/home/smpicnic/server/data/libraries/net/fabricmc/sponge-mixin/0.15.5+mixin.0.8.7/sponge-mixin-0.15.5+mixin.0.8.7.jar Service=Knot/Fabric Env=SERVER [13-05-2025 02:20:01] Compatibility level set to JAVA_17 [13-05-2025 02:20:02] Loaded configuration file for Lithium: 114 options available, 0 override(s) found [13-05-2025 02:20:02] Error loading class: net/minecraft/class_998 (java.lang.ClassNotFoundException: net/minecraft/class_998) [13-05-2025 02:20:02] @Mixin target net.minecraft.class_998 was not found impaled.mixins.json:TridentRiptideFeatureRendererMixin from mod impaled [13-05-2025 02:20:02] Initializing MixinExtras via com.llamalad7.mixinextras.service.MixinExtrasServiceImpl(version=0.4.1). [13-05-2025 02:20:03] Method overwrite conflict for revertScale in slimeorigin.mixins.json:MixinLivingEntity from mod slimeorigin, previously written by latokike.mythorigins.mixin.LivingEntityMixin. Skipping method. [13-05-2025 02:20:03] Added Config bclib.generator to auto sync (file hash) [13-05-2025 02:20:03] Added Config bclib.main to auto sync (content diff) [13-05-2025 02:20:03] Added Config bclib.recipes to auto sync (file hash) [13-05-2025 02:20:03] Added Config bclib.biomes to auto sync (file hash) [13-05-2025 02:20:04] Method overwrite conflict for damage in spilaioorigins.mixins.json:ItemStackMixin from mod spilaioorigins, previously written by latokike.latoorigins.mixin.ItemStackMixin. Skipping method. [13-05-2025 02:20:05] Building unoptimized datafixer [13-05-2025 02:20:05] Method overwrite conflict for method_6091 in moborigins.mixins.json:RavagerEntityMixin from mod moborigins, previously written by draylar.identity.mixin.RavagerEntityMixin. Skipping method. [13-05-2025 02:20:05] Minecraft has crashed! [13-05-2025 02:20:05] net.fabricmc.loader.impl.FormattedException: java.lang.NoSuchFieldError: ATTACK_DAMAGE_MODIFIER [13-05-2025 02:20:05] at net.fabricmc.loader.impl.FormattedException.ofLocalized(FormattedException.java:63) ~[fabric-loader-0.16.14.jar:?] [13-05-2025 02:20:05] at net.fabricmc.loader.impl.game.minecraft.MinecraftGameProvider.launch(MinecraftGameProvider.java:482) ~[fabric-loader-0.16.14.jar:?] [13-05-2025 02:20:05] at net.fabricmc.loader.impl.launch.knot.Knot.launch(Knot.java:74) [fabric-loader-0.16.14.jar:?] [13-05-2025 02:20:05] at net.fabricmc.loader.impl.launch.knot.KnotServer.main(KnotServer.java:23) [fabric-loader-0.16.14.jar:?] [13-05-2025 02:20:05] at net.fabricmc.loader.impl.launch.server.FabricServerLauncher.main(FabricServerLauncher.java:69) [fabric-loader-0.16.14.jar:?] [13-05-2025 02:20:05] Caused by: java.lang.NoSuchFieldError: ATTACK_DAMAGE_MODIFIER [13-05-2025 02:20:05] at net.minecraft.class_1799.<clinit>(class_1799.java:126) ~[server-intermediary.jar:?] [13-05-2025 02:20:05] at net.minecraft.class_1761.<init>(class_1761.java:114) ~[server-intermediary.jar:?] [13-05-2025 02:20:05] at net.minecraft.class_1761$1.<init>(class_1761.java:15) ~[server-intermediary.jar:?] [13-05-2025 02:20:05] at net.minecraft.class_1761.<clinit>(class_1761.java:15) ~[server-intermediary.jar:?] [13-05-2025 02:20:05] at net.minecraft.class_1802.<clinit>(class_1802.java:22) ~[server-intermediary.jar:?] [13-05-2025 02:20:05] at net.minecraft.class_1308$Anonymous$dedb2ce0fc304852b6ae6ea54fec0e73.<init>(DropSkullsMixins.java:23) ~[?:?] [13-05-2025 02:20:05] at net.minecraft.class_1308.<clinit>(class_1308.java:87) ~[server-intermediary.jar:?] [13-05-2025 02:20:05] at net.minecraft.class_1299.<clinit>(class_1299.java:260) ~[server-intermediary.jar:?] [13-05-2025 02:20:05] at net.minecraft.class_3103.<clinit>(class_3103.java:28) ~[server-intermediary.jar:?] [13-05-2025 02:20:05] at net.minecraft.class_3031.<clinit>(class_3031.java:84) ~[server-intermediary.jar:?] [13-05-2025 02:20:05] at net.minecraft.class_6800.<clinit>(class_6800.java:20) ~[server-intermediary.jar:?] [13-05-2025 02:20:05] at net.minecraft.class_6803.method_39702(class_6803.java:24) ~[server-intermediary.jar:?] [13-05-2025 02:20:05] at net.minecraft.class_5458.method_44104(class_5458.java:98) ~[server-intermediary.jar:?] [13-05-2025 02:20:05] at net.minecraft.class_5458.method_30566(class_5458.java:105) ~[server-intermediary.jar:?] [13-05-2025 02:20:05] at java.util.LinkedHashMap.forEach(LinkedHashMap.java:721) ~[?:?] [13-05-2025 02:20:05] at net.minecraft.class_5458.<clinit>(class_5458.java:104) ~[server-intermediary.jar:?] [13-05-2025 02:20:05] at net.minecraft.class_2378.<clinit>(class_2378.java:326) ~[server-intermediary.jar:?] [13-05-2025 02:20:05] at net.minecraft.class_2966.method_12851(class_2966.java:50) ~[server-intermediary.jar:?] [13-05-2025 02:20:05] at net.minecraft.server.Main.main(Main.java:98) ~[server-intermediary.jar:?] [13-05-2025 02:20:05] at net.fabricmc.loader.impl.game.minecraft.MinecraftGameProvider.launch(MinecraftGameProvider.java:480) ~[fabric-loader-0.16.14.jar:?] [13-05-2025 02:20:05] ... 3 more
    • Every time I try to run a modpack I am using, I get a crash error saying that it was caused by an invalid Java Runtime configuration. I have tried everything I can think of to try and debug it but nothing has worked. https://pastebin.com/ddxQTLh4
    • ok i tried to disable the last mod's i installed and it is some of then, so now im going to do the classic enable and disable trick to find out which mod cause the crash. thanks for the help  
  • Topics

  • Who's Online (See full list)

    • There are no registered users currently online
×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.