|
22 | 22 | import net.minecraft.client.Minecraft; |
23 | 23 | import net.minecraft.client.gui.GuiGraphics; |
24 | 24 | import net.minecraft.client.gui.Font; |
| 25 | +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; |
25 | 26 | import net.wurstclient.WurstClient; |
26 | 27 | import net.wurstclient.util.RenderUtils; |
27 | 28 |
|
28 | 29 | public class ItemHandlerHud |
29 | 30 | { |
30 | 31 | private static final Minecraft MC = WurstClient.MC; |
31 | | - // rendering per-frame guard removed: was causing flicker |
| 32 | + private boolean dragging; |
| 33 | + private double dragStartMouseX; |
| 34 | + private double dragStartMouseY; |
| 35 | + private int dragStartOffsetX; |
| 36 | + private int dragStartOffsetY; |
| 37 | + private int dragOffsetX; |
| 38 | + private int dragOffsetY; |
32 | 39 | private boolean lastLeftDown = false; |
33 | 40 |
|
34 | 41 | public void render(GuiGraphics context, float partialTicks) |
@@ -113,8 +120,6 @@ class MergeEntry |
113 | 120 | } |
114 | 121 |
|
115 | 122 | int guiW = context.guiWidth(); |
116 | | - int x = guiW + hack.getHudOffsetX(); |
117 | | - int y = hack.getHudOffsetY(); |
118 | 123 |
|
119 | 124 | // Render only one popup (expanded list). The previous header |
120 | 125 | // duplicate is removed to avoid showing two linked popups. |
@@ -148,11 +153,26 @@ class MergeEntry |
148 | 153 | iconSpace + padding + maxNameW + gap + maxDistW + padding; |
149 | 154 | if(boxWidth < 120) |
150 | 155 | boxWidth = 120; |
| 156 | + |
| 157 | + int hudOffsetX = dragging ? dragOffsetX : hack.getHudOffsetX(); |
| 158 | + int hudOffsetY = dragging ? dragOffsetY : hack.getHudOffsetY(); |
| 159 | + int x = guiW + hudOffsetX; |
| 160 | + int y = hudOffsetY; |
151 | 161 | int ex = x - boxWidth; |
152 | 162 | int ey = y + headerHeight; |
153 | 163 | int rowHeight = 16; |
154 | 164 | int footer = items.size() > maxDisplay ? 1 : 0; |
155 | 165 | int height = maxDisplay * rowHeight + footer * rowHeight + 6; |
| 166 | + |
| 167 | + handleDrag(context, hack, ex, ey, boxWidth, height); |
| 168 | + |
| 169 | + hudOffsetX = dragging ? dragOffsetX : hack.getHudOffsetX(); |
| 170 | + hudOffsetY = dragging ? dragOffsetY : hack.getHudOffsetY(); |
| 171 | + x = guiW + hudOffsetX; |
| 172 | + y = hudOffsetY; |
| 173 | + ex = x - boxWidth; |
| 174 | + ey = y + headerHeight; |
| 175 | + |
156 | 176 | context.fill(ex, ey, ex + boxWidth, ey + height, 0xCC101010); |
157 | 177 | context.guiRenderState.up(); |
158 | 178 |
|
@@ -219,22 +239,79 @@ class MergeEntry |
219 | 239 | scale * 0.95); |
220 | 240 | } |
221 | 241 |
|
| 242 | + // Do not open the ItemHandler GUI from the popup via mouse clicks. |
| 243 | + // Opening the ItemHandler GUI remains available via keybind/command |
| 244 | + // and the settings button. |
| 245 | + } |
| 246 | + |
| 247 | + private void handleDrag(GuiGraphics context, ItemHandlerHack hack, int ex, |
| 248 | + int ey, int boxWidth, int height) |
| 249 | + { |
| 250 | + Window window = MC.getWindow(); |
| 251 | + if(window == null) |
| 252 | + { |
| 253 | + dragging = false; |
| 254 | + lastLeftDown = false; |
| 255 | + return; |
| 256 | + } |
| 257 | + |
| 258 | + boolean leftDown = GLFW.glfwGetMouseButton(window.handle(), |
| 259 | + GLFW.GLFW_MOUSE_BUTTON_LEFT) == GLFW.GLFW_PRESS; |
| 260 | + boolean containerOpen = MC.screen instanceof AbstractContainerScreen<?>; |
| 261 | + if(!containerOpen) |
| 262 | + { |
| 263 | + if(dragging) |
| 264 | + { |
| 265 | + hack.setHudOffsets(dragOffsetX, dragOffsetY); |
| 266 | + dragging = false; |
| 267 | + } |
| 268 | + lastLeftDown = leftDown; |
| 269 | + return; |
| 270 | + } |
| 271 | + |
222 | 272 | double mouseX = getScaledMouseX(context); |
223 | 273 | double mouseY = getScaledMouseY(context); |
224 | | - // hitbox covers the single list popup |
225 | 274 | boolean overList = mouseX >= ex && mouseX <= ex + boxWidth |
226 | 275 | && mouseY >= ey && mouseY <= ey + height; |
227 | | - Window window = MC.getWindow(); |
228 | | - boolean leftDown = GLFW.glfwGetMouseButton(window.handle(), |
229 | | - GLFW.GLFW_MOUSE_BUTTON_LEFT) == GLFW.GLFW_PRESS; |
230 | | - // Do not open the ItemHandler GUI from the popup via mouse clicks. |
231 | | - // This avoids the popup behind other full-screen GUIs triggering |
232 | | - // the ItemHandler screen when clicking in overlapping areas. |
233 | | - // (Opening the ItemHandler GUI is available via the dedicated |
234 | | - // settings button or a keybind/command.) |
| 276 | + |
| 277 | + if(!dragging && leftDown && !lastLeftDown && overList) |
| 278 | + { |
| 279 | + dragging = true; |
| 280 | + dragStartMouseX = mouseX; |
| 281 | + dragStartMouseY = mouseY; |
| 282 | + dragStartOffsetX = hack.getHudOffsetX(); |
| 283 | + dragStartOffsetY = hack.getHudOffsetY(); |
| 284 | + dragOffsetX = dragStartOffsetX; |
| 285 | + dragOffsetY = dragStartOffsetY; |
| 286 | + } |
| 287 | + |
| 288 | + if(dragging) |
| 289 | + { |
| 290 | + if(leftDown) |
| 291 | + { |
| 292 | + int dx = (int)Math.round(mouseX - dragStartMouseX); |
| 293 | + int dy = (int)Math.round(mouseY - dragStartMouseY); |
| 294 | + int minX = hack.getHudOffsetMinX(); |
| 295 | + int maxX = hack.getHudOffsetMaxX(); |
| 296 | + int minY = hack.getHudOffsetMinY(); |
| 297 | + int maxY = hack.getHudOffsetMaxY(); |
| 298 | + dragOffsetX = clamp(dragStartOffsetX + dx, minX, maxX); |
| 299 | + dragOffsetY = clamp(dragStartOffsetY + dy, minY, maxY); |
| 300 | + }else |
| 301 | + { |
| 302 | + hack.setHudOffsets(dragOffsetX, dragOffsetY); |
| 303 | + dragging = false; |
| 304 | + } |
| 305 | + } |
| 306 | + |
235 | 307 | lastLeftDown = leftDown; |
236 | 308 | } |
237 | 309 |
|
| 310 | + private static int clamp(int value, int min, int max) |
| 311 | + { |
| 312 | + return Math.max(min, Math.min(max, value)); |
| 313 | + } |
| 314 | + |
238 | 315 | private static double getScaledMouseX(GuiGraphics context) |
239 | 316 | { |
240 | 317 | Window window = MC.getWindow(); |
|
0 commit comments