Jump to content

-TheLittleGuy

Members
  • Posts

    26
  • Joined

  • Last visited

Posts posted by -TheLittleGuy

  1. hmm the code i used in my old mod came from the source code of a different mod, but im not sure if it can be adapted to 1.15, i believe it involved vector math aswell might have to give it a go 
    Thank you for the pointers though!

     

    Edit: Found some code from another mod that I believe I can adapt to my specific use case

  2. Since 1.15 introduced a lot of significant changes as opposed to 1.12, I cannot figure out how to RayTrace an entity from a range further than what pointedEntity allows (~4 blocks)

    I am able to raytrace blocks from an increased range using BlockRayTraceResult, but I am unsure how to apply this to entities. I want to be able to target an entity from a range of about 50 blocks.

    Please let me know where to start. Thank You.

     

  3. Hello!

     

    I am curious on how I would go about creating a "second camera" for use with perspectives. In the past I have heard methods of creating a client side entity and then using setRenderViewEntity() to switch perspectives. However, I want to take this a bit further and Create a second popup window (that can be dragged onto a secondary display) giving me two perspectives independent from each other. The concept would work similar to splitscreen or even those popular free cam mods.

    My basic thought process for this is as follows:

    Create client side "camera" entity, would act as if I were running the game with another account (in regards to a camera view)

    create a second game window with the secondary view - when window is in focus you would be able to move camera around, but cannot interact with GUI's etc.

     

    So how would I go about doing this? Would I need to create a frame buffer/render to texture and do some of that weird openGL related stuff?

     

  4. So I came up with this code but I am unsure how to "tie" it to the tooltips. No crashes occur but it does not work

    List<ITextComponent> tooltip = event.getToolTip();
            ArrayList<String> list = new ArrayList<>();
            String regex = TextFormatting.YELLOW + "(Efficiency \\d+|Fortune \\d+|Unbreaking \\d+).*";
            //add all lines of the tooltip
            for(int i = 0; i < tooltip.size(); i++) {
                String line = tooltip.get(i).getFormattedText();
                list.add(line);
            }
    
            Iterator itr = list.iterator();
            while (itr.hasNext()) {
                String next = (String) itr.next();
    
                if(regex.equals(next)) {
                    tooltip.remove(next); //unsure if this is correct
                    test = true; //test boolean
                }
            }

     

  5. A server I play on has this annoying "feature" where it changes how enchants are displayed on an item to look like the following:

    uvA4udq.png

    However I don't want that so i used some code to "reveal" the vanilla enchants (which are hidden with HideFlags nbt tag) and then removing the yellow text

    Problem is, not all of the yellow lines are getting removed - Ideally there should be no yellow lines on the item.

    9nnZ6QY.png

    Here is the following code that results in the image above:

    @SubscribeEvent
        public void onToolTip(final ItemTooltipEvent event) {
            List<ITextComponent> tooltip = event.getToolTip();
            ArrayList<String> list = new ArrayList<>();
    
            for(int i = 0; i < tooltip.size(); i++) {
    
                String line = tooltip.get(i).getFormattedText();
    
                if (line.matches(TextFormatting.YELLOW + "(Efficiency \\d+|Fortune \\d+|Unbreaking \\d+).*")) {  //other enchants will be added here
    
                //if(line.startsWith(TextFormatting.YELLOW + )) {
                    list.add(line);
                   tooltip.remove(i);
                }
                index = tooltip.size(); //used for testing
                s = list.toString(); //used for testing
            }
    
            CompoundNBT nbt = event.getItemStack().getOrCreateTag();
            nbt.remove("HideFlags");
    
        }

    So what exactly is failing? Any help would be appreciated!

  6. I am trying to create a new modding workspace for 1.15.2 however I keep running into this error when trying to setup the project:

    Could not resolve: net.minecraftforge:forge:1.15.2-31.1.37_mapped_snapshot_20200225-1.15.1

     

    Did I forget to install something? I am unsure whats causing this.

  7. 2 hours ago, deerangle said:

    So I decided to make all the functions to render with any gradient, and here's the code (it only supports normal text, no italics, no bold, no formatting or coloring, no unicode, but you can add that with some extra work if you need it):

    
    public class GradientFontRenderer extends FontRenderer {
    
        public GradientFontRenderer(GameSettings gameSettingsIn, ResourceLocation location, TextureManager textureManagerIn, boolean unicode) {
            super(gameSettingsIn, location, textureManagerIn, unicode);
        }
    
        public int drawGradientString(String text, float x, float y, int topColor, int bottomColor, boolean dropShadow)
        {
            enableAlpha();
            int i;
    
            if (dropShadow)
            {
                i = this.renderGradientString(text, x + 1.0F, y + 1.0F, topColor, bottomColor, true);
                i = Math.max(i, this.renderGradientString(text, x, y, topColor, bottomColor, false));
            }
            else
            {
                i = this.renderGradientString(text, x, y, topColor, bottomColor, false);
            }
    
            return i;
        }
    
        private int renderGradientString(String text, float x, float y, int topColor, int bottomColor, boolean dropShadow)
        {
            if (text == null)
            {
                return 0;
            }
            else
            {
    
                if ((topColor & -67108864) == 0)
                {
                    topColor |= -16777216;
                }
    
                if ((bottomColor & -67108864) == 0)
                {
                    bottomColor |= -16777216;
                }
    
                if (dropShadow)
                {
                    topColor = (topColor & 16579836) >> 2 | topColor & -16777216;
                    bottomColor = (bottomColor & 16579836) >> 2 | bottomColor & -16777216;
                }
    
                this.posX = x;
                this.posY = y;
                this.renderGradientStringAtPos(text, dropShadow, topColor, bottomColor);
                return (int)this.posX;
            }
        }
    
        private void renderGradientStringAtPos(String text, boolean shadow, int topColor, int bottomColor) {
            for (int i = 0; i < text.length(); ++i) {
                char c0 = text.charAt(i);
                int j = "\u00c0\u00c1\u00c2\u00c8\u00ca\u00cb\u00cd\u00d3\u00d4\u00d5\u00da\u00df\u00e3\u00f5\u011f\u0130\u0131\u0152\u0153\u015e\u015f\u0174\u0175\u017e\u0207\u0000\u0000\u0000\u0000\u0000\u0000\u0000 !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\u0000\u00c7\u00fc\u00e9\u00e2\u00e4\u00e0\u00e5\u00e7\u00ea\u00eb\u00e8\u00ef\u00ee\u00ec\u00c4\u00c5\u00c9\u00e6\u00c6\u00f4\u00f6\u00f2\u00fb\u00f9\u00ff\u00d6\u00dc\u00f8\u00a3\u00d8\u00d7\u0192\u00e1\u00ed\u00f3\u00fa\u00f1\u00d1\u00aa\u00ba\u00bf\u00ae\u00ac\u00bd\u00bc\u00a1\u00ab\u00bb\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580\u03b1\u03b2\u0393\u03c0\u03a3\u03c3\u03bc\u03c4\u03a6\u0398\u03a9\u03b4\u221e\u2205\u2208\u2229\u2261\u00b1\u2265\u2264\u2320\u2321\u00f7\u2248\u00b0\u2219\u00b7\u221a\u207f\u00b2\u25a0\u0000".indexOf(c0);
    
                float f1 = j == -1 ? 0.5f : 1f;
                boolean flag = (c0 == 0 || j == -1) && shadow;
    
                if (flag) {
                    this.posX -= f1;
                    this.posY -= f1;
                }
    
                float f = this.renderGradientChar(c0, topColor, bottomColor);
    
                if (flag) {
                    this.posX += f1;
                    this.posY += f1;
                }
    
                doDraw(f);
            }
        }
    
        private float renderGradientChar(char ch, int topColor, int bottomColor) {
            if (ch == 160) return 4.0F; // forge: display nbsp as space. MC-2595
            if (ch == ' ') {
                return 4.0F;
            } else {
                int i = "\u00c0\u00c1\u00c2\u00c8\u00ca\u00cb\u00cd\u00d3\u00d4\u00d5\u00da\u00df\u00e3\u00f5\u011f\u0130\u0131\u0152\u0153\u015e\u015f\u0174\u0175\u017e\u0207\u0000\u0000\u0000\u0000\u0000\u0000\u0000 !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\u0000\u00c7\u00fc\u00e9\u00e2\u00e4\u00e0\u00e5\u00e7\u00ea\u00eb\u00e8\u00ef\u00ee\u00ec\u00c4\u00c5\u00c9\u00e6\u00c6\u00f4\u00f6\u00f2\u00fb\u00f9\u00ff\u00d6\u00dc\u00f8\u00a3\u00d8\u00d7\u0192\u00e1\u00ed\u00f3\u00fa\u00f1\u00d1\u00aa\u00ba\u00bf\u00ae\u00ac\u00bd\u00bc\u00a1\u00ab\u00bb\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580\u03b1\u03b2\u0393\u03c0\u03a3\u03c3\u03bc\u03c4\u03a6\u0398\u03a9\u03b4\u221e\u2205\u2208\u2229\u2261\u00b1\u2265\u2264\u2320\u2321\u00f7\u2248\u00b0\u2219\u00b7\u221a\u207f\u00b2\u25a0\u0000".indexOf(ch);
                if (i != -1) {
                    return this.renderGradientDefaultChar(i, topColor, bottomColor);
                } else {
                    throw new RuntimeException("Unrecognized char: " + ch);
                }
            }
        }
    
        protected float renderGradientDefaultChar(int ch, int topColor, int bottomColor) {
            float topAlpha = ((topColor >> 24) & 0xFF) / 255f;
            float topRed = ((topColor >> 16) & 0xFF) / 255f;
            float topGreen = ((topColor >> 8) & 0xFF) / 255f;
            float topBlue = (topColor & 0xFF) / 255f;
    
            float bottomAlpha = ((bottomColor >> 24) & 0xFF) / 255f;
            float bottomRed = ((bottomColor >> 16) & 0xFF) / 255f;
            float bottomGreen = ((bottomColor >> 8) & 0xFF) / 255f;
            float bottomBlue = (bottomColor & 0xFF) / 255f;
    
            float charXPos = ch % 16 * 8f;
            float charYPos = (ch / 16) * 8f;
            bindTexture(this.locationFontTexture);
            int charWidth = this.charWidth[ch];
            float width = (float) charWidth - 0.01F;
    
            GlStateManager.shadeModel(GL11.GL_SMOOTH);
            GlStateManager.glBegin(GL11.GL_QUADS);
    
            GlStateManager.color(topRed, topGreen, topBlue, topAlpha);
            GlStateManager.glTexCoord2f(charXPos / 128.0F, charYPos / 128.0F); // 0 0
            GlStateManager.glVertex3f(this.posX, this.posY, 0.0F);
    
            GlStateManager.color(bottomRed, bottomGreen, bottomBlue, bottomAlpha);
            GlStateManager.glTexCoord2f(charXPos / 128.0F, (charYPos + 7.99F) / 128.0F); // 0 1
            GlStateManager.glVertex3f(this.posX, this.posY + 7.99F, 0.0F);
    
            GlStateManager.color(bottomRed, bottomGreen, bottomBlue, bottomAlpha);
            GlStateManager.glTexCoord2f((charXPos + width - 1.0F) / 128.0F, (charYPos + 7.99F) / 128.0F); // 1 1
            GlStateManager.glVertex3f(this.posX + width - 1.0F, this.posY + 7.99F, 0.0F);
    
            GlStateManager.color(topRed, topGreen, topBlue, topAlpha);
            GlStateManager.glTexCoord2f((charXPos + width - 1.0F) / 128.0F, charYPos / 128.0F); // 1 0
            GlStateManager.glVertex3f(this.posX + width - 1.0F, this.posY, 0.0F);
    
            GlStateManager.glEnd();
            GlStateManager.shadeModel(GL11.GL_FLAT);
            return (float) charWidth;
        }
    }

    Then change this code from above to the following:

    
    public void drawCenteredGradientString(GradientFontRenderer fontRendererIn, String text, int x, int y, int color, int colorBottom)
    {
        fontRendererIn.drawGradientString(text, x - fontRendererIn.getStringWidth(text) / 2, y, color, colorBottom, true);
    }

    And it should work.

    I actually do have a question: I changed the gradient to start from the left instead of the top however, the current method applies the gradient effect to the individual character. What would have to be changed in order to have the gradient be applied to the entire string? Where would the GL Functions go in that case? Where they are currently or would it have to go after the chars are "assembled" into the string? Ex: i have the string "Test String"  the start color is Green and the end color is Red, the first letter will start green and will fade to red by the time it gets to the last letter.

  8. 2 hours ago, deerangle said:

    The drawGradientRect method uses the following trick to render a gradient: The top two vertices of the quad are in one color, and the bottom two vertices are in another. Then, the shadeModel GL11.GL_SMOOTH is used, so that these colors are interpolated and create a gradient effect. To render a String, the drawString method calls the renderString method, which calls the renderStringAtPos method which ultimately calls the renderGlyph method, which calls the render method of the TexturedGlyph class. In that last render method, the color is set via the function parameters. If you created a custom TexturedGlyph that hat a render method with two colors as input, you could enable the above mentioned shadeModel to render a text with a gradient. It's a bit of work but seems definitely possible.

    Just have a look at

    
    net.minecraft.client.gui.fonts.TexturedGlyph::render

    and

    
    net.minecraftforge.fml.client.config.GuiUtils::drawGradientRect

    PS: Since I'm currently working with 1.14, the class names (any maybe the function names) differ, but apart from that, everything I said should be applicable.

    It seems a bit different in 1.12.2. There doesnt seem to be a TexturedGlyph class.  After the renderStringAtPos method the method renderChar is called which then either calls renderDefaultChar or renderUnicodeChar

    which is where the location of the actual glyphs are "cut out" from the font texture (default.png). The coloring of the text doesnt get set until the renderString method (§ codes excluded those seem to get set inside renderStringAtPos)

  9. Is there a way to give text a gradient effect? Similar to the game's drawGradientRect() Method

    Would I have to use openGL methods to achieve this and if so which ones?

     

    Edit: Kinda related but is there a way to set the opacity of multiple objects being drawn on the screen? Example, I have 4 strings of text and I want to set all of their opacity to 50%

     

     

    • Like 1
  10. the method ObfuscationReflectionHelper#findField wasnt present so i used ReflectionHelper#findField - maybe im using a different forge version?

    Anyways i tried the following code 

    
    static final Field head;
    		static {
    	    	head = ReflectionHelper.findField(GuiPlayerTabOverlay.class, "header" , "field_175256_i");
    	    }
    	    public void getHeader() throws IllegalArgumentException, IllegalAccessException  {
    	    	tabOverlay = new GuiPlayerTabOverlay(mc, guiIngame);
    	    	
    	    	 this.setHeader((ITextComponent) head.get(tabOverlay));
    	    	
    	    }

    then i called the getHeader method in the render method. No crashes, but the header still doesnt get rendered when its supposed to. Surely im missing something or calling the method in the wrong place perhaps?

  11. Hey so after a few days of thinking, I am having trouble getting the value of the reflected fields.

    When trying to render the tab, the game crashes and causes an IllegalArgumentException.

    This is the method i used to get the value (same applies to footer) - the method is then called in renderTabOverlay in my new class

    public void getHeader() {
    	    	
    	    	Field field;
    			try {
    				
    				field = GuiPlayerTabOverlay.class.getDeclaredField("header");
    				field.setAccessible(true);
    	        this.header = (ITextComponent) field.get(this); //This is likely the problem
    	        field.setAccessible(false);
    			} catch (NoSuchFieldException | IllegalAccessException | SecurityException e) {
    				
    				e.printStackTrace();
    			}
    	        
    	    }

    Any assistance on what to fix would be appreciated - I haven't used reflection much so bear with me.

     

    EDIT: I did some looking into how the header/footer text is set, which is set via packets, and the packet that handles this is called SPacketPlayerListHeaderFooter - which has getters for both of the values i need. Would it be possible to grab this packet data and use it?

×
×
  • Create New...

Important Information

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