1212import net .wurstclient .settings .SliderSetting ;
1313import net .wurstclient .settings .SliderSetting .ValueDisplay ;
1414import net .wurstclient .settings .CheckboxSetting ;
15+ import net .wurstclient .settings .ButtonSetting ;
1516import java .util .ArrayDeque ;
1617import java .util .ArrayList ;
1718import java .util .Collection ;
2728import net .minecraft .world .phys .Vec3 ;
2829import net .wurstclient .Category ;
2930import net .wurstclient .events .UpdateListener ;
31+ import net .wurstclient .events .RenderListener ;
32+ import com .mojang .blaze3d .vertex .PoseStack ;
33+ import net .minecraft .world .phys .AABB ;
34+ import net .wurstclient .util .RenderUtils ;
35+ import net .wurstclient .util .ChatUtils ;
3036import net .wurstclient .hack .Hack ;
3137import net .wurstclient .mixinterface .IKeyBinding ;
3238import net .wurstclient .settings .Setting ;
3945// no screen import needed; we embed ItemESP's editor component directly
4046import net .wurstclient .util .InventoryUtils ;
4147
42- public class ItemHandlerHack extends Hack implements UpdateListener
48+ public class ItemHandlerHack extends Hack
49+ implements UpdateListener , RenderListener
4350{
4451 private static final double SCAN_RADIUS = 2.5 ;
4552 // When the popup is set to "infinite", use this large but finite
@@ -83,7 +90,7 @@ public class ItemHandlerHack extends Hack implements UpdateListener
8390
8491 // Adjust popup/UI scale (affects text size and icon size heuristically)
8592 private final SliderSetting popupScale = new SliderSetting (
86- "Popup font scale" , 0.75 , 0.5 , 1.5 , 0.05 , ValueDisplay .DECIMAL );
93+ "Popup HUD font scale" , 0.75 , 0.5 , 1.5 , 0.05 , ValueDisplay .DECIMAL );
8794
8895 // Respect ItemESP's ignored items list
8996 private final CheckboxSetting respectItemEspIgnores =
@@ -101,6 +108,8 @@ public ItemHandlerHack()
101108 setCategory (Category .ITEMS );
102109 addPossibleKeybind ("itemhandler gui" ,
103110 "ItemHandler GUI (open manual pickup screen)" );
111+ // Top-level button to open the ItemHandler GUI from settings
112+ addSetting (new ButtonSetting ("Open ItemHandler GUI" , this ::openScreen ));
104113 addSetting (rejectRadius );
105114 addSetting (rejectExpiry );
106115 addSetting (hudEnabled );
@@ -118,6 +127,7 @@ public ItemHandlerHack()
118127 protected void onEnable ()
119128 {
120129 EVENTS .add (UpdateListener .class , this );
130+ EVENTS .add (RenderListener .class , this );
121131 trackedItems .clear ();
122132 pickupWhitelist .clear ();
123133 pickupQueue .clear ();
@@ -127,6 +137,7 @@ protected void onEnable()
127137 protected void onDisable ()
128138 {
129139 EVENTS .remove (UpdateListener .class , this );
140+ EVENTS .remove (RenderListener .class , this );
130141 trackedItems .clear ();
131142 pickupWhitelist .clear ();
132143 pickupQueue .clear ();
@@ -202,6 +213,12 @@ private void processRejectedPickup()
202213 continue ;
203214
204215 int gained = count - prev ;
216+ // if player gained items of this id, unmark tracing for that id
217+ if (gained > 0 && tracedItems .contains (id ))
218+ {
219+ tracedItems .remove (id );
220+ ChatUtils .message ("Untraced " + id + " after pickup." );
221+ }
205222 // Total rejected amount for this id (sum across rules that match
206223 // player's position)
207224 int totalRejected = 0 ;
@@ -336,7 +353,7 @@ private void scanNearbyItems()
336353 {
337354 net .wurstclient .hacks .ItemEspHack esp =
338355 net .wurstclient .WurstClient .INSTANCE .getHax ().itemEspHack ;
339- if (esp != null && esp . shouldUseIgnoredItems () )
356+ if (esp != null )
340357 {
341358 String id =
342359 net .minecraft .core .registries .BuiltInRegistries .ITEM
@@ -565,6 +582,46 @@ public String distanceText()
565582 }
566583 }
567584
585+ @ Override
586+ public void onRender (PoseStack matrixStack , float partialTicks )
587+ {
588+ if (tracedItems .isEmpty ())
589+ return ;
590+ // Avoid duplicate rendering if ItemESP is enabled
591+ net .wurstclient .hacks .ItemEspHack esp =
592+ net .wurstclient .WurstClient .INSTANCE .getHax ().itemEspHack ;
593+ if (esp != null && esp .isEnabled ())
594+ return ;
595+
596+ java .util .ArrayList <AABB > boxes = new java .util .ArrayList <>();
597+ java .util .ArrayList <Vec3 > ends = new java .util .ArrayList <>();
598+ for (GroundItem gi : trackedItems )
599+ {
600+ String id = net .minecraft .core .registries .BuiltInRegistries .ITEM
601+ .getKey (gi .stack ().getItem ()).toString ();
602+ if (!isTraced (id ))
603+ continue ;
604+ Vec3 p = gi .position ();
605+ boxes .add (new AABB (p .x - 0.18 , p .y - 0.18 , p .z - 0.18 , p .x + 0.18 ,
606+ p .y + 0.18 , p .z + 0.18 ));
607+ ends .add (p );
608+ }
609+ if (boxes .isEmpty () && ends .isEmpty ())
610+ return ;
611+ float [] rf = RenderUtils .getRainbowColor ();
612+ int traceLines = RenderUtils .toIntColor (rf , 0.5f );
613+ int traceQuads = RenderUtils .toIntColor (rf , 0.35f );
614+ if (!boxes .isEmpty ())
615+ {
616+ RenderUtils .drawSolidBoxes (matrixStack , boxes , traceQuads , false );
617+ RenderUtils .drawOutlinedBoxes (matrixStack , boxes , traceLines ,
618+ false );
619+ }
620+ if (!ends .isEmpty ())
621+ RenderUtils .drawTracers (matrixStack , partialTicks , ends , traceLines ,
622+ false );
623+ }
624+
568625 // Inline ItemESP ignored-items editor in ItemHandler settings
569626 private final Setting itemEspIgnoredListSetting =
570627 new Setting ("Ignored items" , WText .empty ())
0 commit comments