The HUD doesn't move (I am doing a mcp mod)

Viewed 161

I am doing a Minecraft client like lunar, but when I click the HUD to modify the place of the "mod" or when I click randomly the game decides to crash. Here is my code for the HUDConfigScreen

    package TrayardClient.gui.hud;
    
    import java.io.IOException;
    import java.util.*;
    
    
    import javax.swing.Renderer;
    import javax.tools.JavaCompiler;
    
    import org.lwjgl.input.Keyboard;
    
    import com.google.common.base.Predicate;
    
    import net.minecraft.client.Minecraft;
    import net.minecraft.client.gui.GuiScreen;
    import net.minecraft.client.gui.ScaledResolution;
    
    public class HUDConfigScreen extends GuiScreen {
        
        private final HashMap<IRenderer, ScreenPosition> renderers = new HashMap<IRenderer, ScreenPosition>();
        
        private Optional<IRenderer> selectedRenderer = Optional.empty();
        
        private int prevX, prevY;
        
        public HUDConfigScreen(HUDManager api) {
            Collection<IRenderer> registeredRenderers = api.getRegisteredRenderer();
            
            for (IRenderer ren : registeredRenderers) {
                if (!ren.isEnabled()) {
                    continue;
                }
                
                ScreenPosition pos = ren.load();
                
                if (pos == null) {
                    pos = ScreenPosition.fromRelativePosition(0.5, 0.5);
                }
                
                adjustBounds(ren, pos);
                this.renderers.put(ren, pos);
            }
        }
        
        @Override
        public void drawScreen(int mouseX, int mouseY, float partialTicks) {
            
            super.drawDefaultBackground();
            
            final float zBackup = this.zLevel;
            this.zLevel = 200;
            
            this.drawHollowRect(0, 0, this.width, this.height - 1, 0xFFFF0000);
            
            for(IRenderer renderer : renderers.keySet()) {
                ScreenPosition pos = renderers.get(renderer);
                
                renderer.render(pos);
                
                this.drawHollowRect(pos.getAbsoluteX(), pos.getAbsoluteY(), renderer.getWidth(), renderer.getHeight(), 0xFF00FFFF);
            }
            this.zLevel = zBackup;
        }
    
        private void drawHollowRect(int x, int y, int w, int h, int color) {
            this.drawHorizontalLine(x, x + w, y, color);
            this.drawHorizontalLine(x, x + w, y + h, color);
            
            this.drawVerticalLine(x, y + h, y, color);
            this.drawVerticalLine(x + w, y + h, y, color);
        }
        
        @Override
        protected void keyTyped(char typedChar, int keyCode) throws IOException {
            if (keyCode == Keyboard.KEY_ESCAPE) {
                renderers.entrySet().forEach((entry) -> {
                    entry.getKey().save(entry.getValue());
                });
                this.mc.displayGuiScreen(null);
            }
        }
        
        
        @Override
        protected void mouseClickMove(int x, int y, int button, long time) throws IOException {
            if (selectedRenderer.isPresent()) {
                moveSelectedRenderBy(x - prevX, y - prevY);
            }
            
            this.prevX = x;
            this.prevY = y;
        }
    
        private void moveSelectedRenderBy(int offsetX, int offsetY) {
            // TODO Auto-generated method stub
            IRenderer renderer = selectedRenderer.get();
            ScreenPosition pos = renderers.get(renderer);
            
            pos.setAbsolute(pos.getAbsoluteX() + offsetX, pos.getAbsoluteY() + offsetY);
            
            adjustBounds(renderer, pos);
        }
        
        @Override
        public void onGuiClosed() {
            for (IRenderer renderer : renderers.keySet()) {
                renderer.save(renderers.get(renderer));
            }
        }
        
        @Override
        public boolean doesGuiPauseGame() {
            return true;
        }
        
        private void adjustBounds(IRenderer renderer, ScreenPosition pos) {
            ScaledResolution res = new ScaledResolution(Minecraft.getMinecraft());
            
            int screenWidth = res.getScaledWidth();
            int screenHeight = res.getScaledHeight();
            
            int absoluteX = Math.max(0, Math.min(pos.getAbsoluteX(), Math.max(screenWidth - renderer.getWidth(), 0)));
            int absoluteY = Math.max(0, Math.min(pos.getAbsoluteY(), Math.max(screenHeight - renderer.getHeight(), 0)));
            
            
        }
        
        @Override
        protected void mouseClicked(int x, int y, int button) throws IOException {
            this.prevX = x;
            this.prevY = y;
            
            loadMouseOver(x, y);
        }
        
        private void loadMouseOver(int x, int y) {
            this.selectedRenderer = renderers.keySet()
              .stream()
              .filter(new MouseOverFinder(x, y))
              .findFirst();
        }
        
        private class MouseOverFinder implements java.util.function.Predicate<IRenderer>{ 
            
            private int mx, my;
            
            public MouseOverFinder(int x, int y) {
                this.mx = x;
                this.my = y;
                 
            }
            
            public boolean test(IRenderer renderer) {
    
                ScreenPosition pos = renderers.get(renderer);
                
                int abssoluteX = pos.getAbsoluteX();
                int absoluteY = pos.getAbsoluteY();
                
                if (mx >= abssoluteX && my <= absoluteY + renderer.getHeight()) {
                    return true;
                }
                
                return false;
            }
    
            public boolean apply(IRenderer arg0) {
                // TODO Auto-generated method stub
                return false;
            }
            
        }
    }

The Edit Panel before click

After click and move a bit

I don't know what to do because I like to code (mostly in C# or python). I am a little bit new to Java. I can't post all the code here, but if you need the code of a certain class, please let me know.

1 Answers

The problem

When you do

private class MouseOverFinder implements Predicate<IRenderer>

you're actually implementing com.google.common.base.Predicate from Guava.

However, when you do

private void loadMouseOver(int x, int y) {
    this.selectedRenderer = renderers.keySet()
      .stream()
      .filter((java.util.function.Predicate<? super IRenderer>) new MouseOverFinder(x, y))
      .findFirst();
}

you're trying to cast a com.google.common.base.Predicate (from Guava) into a java.util.function.Predicate (from Java). Since they don't extend or inherit from each other, this will raise a CastError.

The solution

Change your MouseOverFinder class to

private class MouseOverFinder implements java.util.function.Predicate<IRenderer> {
    // ...

    // Add an override, since you're overriding this method from Predicate
    @Override
    public boolean test(IRenderer renderer) {
        // ...
    }
 
    // Also remove the older `apply` method since it's useless
}

Change your loadMouseOver method to

private void loadMouseOver(int x, int y) {
    this.selectedRenderer = renderers.keySet()
      .stream()
      .filter(new MouseOverFinder(x, y))
      .findFirst();
}
Related