77import invtweaks .config .ContOverride ;
88import invtweaks .config .InvTweaksConfig ;
99import invtweaks .config .Ruleset ;
10+ import invtweaks .gui .InvTweaksButtonQuickStack ;
1011import invtweaks .gui .InvTweaksButtonSort ;
12+ import invtweaks .network .PacketQuickStack ;
1113import invtweaks .network .PacketSortInv ;
14+ import invtweaks .network .PacketSortOrdered ;
15+ import invtweaks .util .ClientSortOrder ;
1216import invtweaks .util .ClientUtils ;
17+ import invtweaks .util .QuickStack ;
1318import invtweaks .util .Sorting ;
19+ import invtweaks .util .ThrowAll ;
1420import invtweaks .util .Utils ;
1521import it .unimi .dsi .fastutil .ints .IntArrayList ;
1622import it .unimi .dsi .fastutil .ints .IntList ;
@@ -51,10 +57,25 @@ private ClientEvents() {
5157 public static final int MIN_SLOTS = 9 ;
5258
5359 private static void requestSort (boolean isPlayer , String screenClass ) {
54- if (ClientUtils .serverConnectionExists ()) {
60+ Player player = ClientUtils .safeGetPlayer ();
61+ if (player == null ) {
62+ return ;
63+ }
64+ if (ClientUtils .serverHasChannel (PacketSortOrdered .TYPE )) {
65+ PacketDistributor .sendToServer (new PacketSortOrdered (isPlayer , screenClass , ClientSortOrder .ranks (player , isPlayer )));
66+ } else if (ClientUtils .serverConnectionExists ()) {
5567 PacketDistributor .sendToServer (new PacketSortInv (isPlayer , screenClass ));
5668 } else {
57- Sorting .executeSort (ClientUtils .safeGetPlayer (), isPlayer , screenClass );
69+ Sorting .executeSort (player , isPlayer , screenClass , ClientSortOrder .comparator ());
70+ }
71+ }
72+
73+ private static void requestQuickStack (boolean fromPlayer , String screenClass ) {
74+ boolean moveAll = ClientUtils .isQuickStackAllDown ();
75+ if (ClientUtils .serverHasChannel (PacketQuickStack .TYPE )) {
76+ PacketDistributor .sendToServer (new PacketQuickStack (fromPlayer , moveAll , screenClass ));
77+ } else {
78+ QuickStack .execute (ClientUtils .safeGetPlayer (), fromPlayer , moveAll , screenClass );
5879 }
5980 }
6081
@@ -85,17 +106,21 @@ public static void onScreenEventInit(ScreenEvent.Init.Post event) {
85106 InvTweaksMod .LOGGER .info ("Opened screen {} with menu {}" , screen .getClass ().getName (), screen .getMenu ().getClass ().getName ());
86107 }
87108
109+ String screenClass = screen .getClass ().getName ();
110+
88111 // first, work with player inventory
89- Slot placement = getDefaultButtonPlacement (screen .getMenu ().slots , Utils ::isPlayerSlot );
90- if (placement != null
112+ Slot playerPlacement = getDefaultButtonPlacement (screen .getMenu ().slots , Utils ::isPlayerSlot );
113+ boolean hasPlayerSortButton = false ;
114+ if (playerPlacement != null
91115 && InvTweaksConfig .isSortEnabled (true )
92116 && InvTweaksConfig .isButtonEnabled (true )) {
93117 try {
94118 event .addListener (
95119 new InvTweaksButtonSort (
96- screen .getGuiLeft () + placement .x + 17 ,
97- screen .getGuiTop () + placement .y ,
98- btn -> requestSort (true , screen .getClass ().getName ())));
120+ screen .getGuiLeft () + playerPlacement .x + 17 ,
121+ screen .getGuiTop () + playerPlacement .y ,
122+ btn -> requestSort (true , screenClass )));
123+ hasPlayerSortButton = true ;
99124 } catch (Exception e ) {
100125 Throwables .throwIfUnchecked (e );
101126 throw new RuntimeException (e );
@@ -112,7 +137,7 @@ public static void onScreenEventInit(ScreenEvent.Init.Post event) {
112137 x = override .getX ();
113138 y = override .getY ();
114139 }
115- placement = getDefaultButtonPlacement (screen .getMenu ().slots , slot -> slot .isActive () && !(Utils .isPlayerSlot (slot ) || slot .container instanceof CraftingContainer ));
140+ Slot placement = getDefaultButtonPlacement (screen .getMenu ().slots , slot -> slot .isActive () && !(Utils .isPlayerSlot (slot ) || slot .container instanceof CraftingContainer ));
116141 if (placement != null ) {
117142 if (x == InvTweaksConfig .NO_POS_OVERRIDE ) {
118143 x = placement .x + 17 ;
@@ -122,18 +147,35 @@ public static void onScreenEventInit(ScreenEvent.Init.Post event) {
122147 }
123148 }
124149
150+ boolean hasButtonPosition = x != InvTweaksConfig .NO_POS_OVERRIDE && y != InvTweaksConfig .NO_POS_OVERRIDE ;
151+ boolean hasExtSortButton = false ;
125152 if (InvTweaksConfig .isSortEnabled (false )) {
126153 try {
127- boolean hasButtonPosition = x != InvTweaksConfig .NO_POS_OVERRIDE && y != InvTweaksConfig .NO_POS_OVERRIDE ;
128154 if (hasButtonPosition && InvTweaksConfig .isButtonEnabled (false )) {
129- event .addListener (new InvTweaksButtonSort (screen .getGuiLeft () + x , screen .getGuiTop () + y , btn -> requestSort (false , screen .getClass ().getName ())));
155+ event .addListener (new InvTweaksButtonSort (screen .getGuiLeft () + x , screen .getGuiTop () + y , btn -> requestSort (false , screenClass )));
156+ hasExtSortButton = true ;
130157 }
131158 screensWithExtSort .add (screen );
132159 } catch (Exception e ) {
133160 Throwables .throwIfUnchecked (e );
134161 throw new RuntimeException (e );
135162 }
136163 }
164+
165+ if (hasButtonPosition && InvTweaksConfig .isQuickStackEnabled ()) {
166+ event .addListener (new InvTweaksButtonQuickStack (
167+ screen .getGuiLeft () + x ,
168+ screen .getGuiTop () + y + (hasExtSortButton ? 18 : 0 ),
169+ false ,
170+ btn -> requestQuickStack (false , screenClass )));
171+ if (playerPlacement != null ) {
172+ event .addListener (new InvTweaksButtonQuickStack (
173+ screen .getGuiLeft () + playerPlacement .x + 17 ,
174+ screen .getGuiTop () + playerPlacement .y + (hasPlayerSortButton ? 18 : 0 ),
175+ true ,
176+ btn -> requestQuickStack (true , screenClass )));
177+ }
178+ }
137179 }
138180 }
139181 }
@@ -154,6 +196,17 @@ public static boolean isJEIKeyboardActive() {
154196 @ SubscribeEvent
155197 public static void onKeyPressed (ScreenEvent .KeyPressed .Pre event ) {
156198 if (event .getScreen () instanceof AbstractContainerScreen <?> screen && !(screen instanceof CreativeModeInventoryScreen ) && !(screen .getFocused () instanceof EditBox ) && !isJEIKeyboardActive ()) {
199+ if (InvTweaksConfig .isThrowAllEnabled ()
200+ && !ThrowAll .isHandledElsewhere ()
201+ && Screen .hasControlDown () && Screen .hasShiftDown ()
202+ && Minecraft .getInstance ().options .keyDrop .matches (event .getKeyCode (), event .getScanCode ())) {
203+ Slot hovered = screen .getSlotUnderMouse ();
204+ Player player = Minecraft .getInstance ().player ;
205+ if (hovered != null && player != null && ThrowAll .execute (player , hovered , screen .getClass ().getName ())) {
206+ event .setCanceled (true );
207+ return ;
208+ }
209+ }
157210 if (
158211 InvTweaksConfig .isSortEnabled (true ) &&
159212 KeyMappings .SORT_PLAYER .isActiveAndMatches (InputConstants .getKey (event .getKeyCode (), event .getScanCode ()))
0 commit comments