2525
2626public class EditGuiManager implements Listener {
2727 private static final EditGuiManager INSTANCE = new EditGuiManager ();
28+ private static final int INVENTORY_GUI_SIZE = 45 ;
29+ private static final int INVENTORY_STORAGE_SIZE = 36 ;
30+ private static final int INVENTORY_MAIN_SIZE = 27 ;
31+ private static final int HOTBAR_SIZE = 9 ;
32+ private static final int PLAYER_MAIN_START = 9 ;
33+ private static final int OFFHAND_GUI_SLOT = 40 ;
2834 private final ConcurrentHashMap <UUID , EditSession > sessions = new ConcurrentHashMap <>();
2935
3036 public static EditGuiManager getInstance (){
@@ -59,12 +65,6 @@ public void openInventoryEditor(Player admin, UUID targetUuid, String targetName
5965 }
6066 expectedSize = items .length ;
6167 }
62- if (type .equals ("offhand" ) && expectedSize < 37 ){
63- ItemStack [] expanded = new ItemStack [37 ];
64- System .arraycopy (items , 0 , expanded , 0 , items .length );
65- items = expanded ;
66- expectedSize = expanded .length ;
67- }
6868 originalItems = Arrays .copyOf (items , expectedSize );
6969
7070 int inventorySize = getInventorySize (expectedSize , type );
@@ -75,12 +75,14 @@ public void openInventoryEditor(Player admin, UUID targetUuid, String targetName
7575 Inventory inventory = Bukkit .createInventory (admin , inventorySize , title );
7676 Set <Integer > blockedSlots = Set .of ();
7777 Integer offhandSlot = null ;
78+ Integer offhandIndex = null ;
7879
7980 if (type .equals ("inventory" )){
80- int storageSize = Math .min (36 , items .length );
81- for (int i = 0 ; i < storageSize ; i ++){
82- inventory .setItem (i , items [i ]);
83- }
81+ offhandSlot = OFFHAND_GUI_SLOT ;
82+ offhandIndex = resolveOffhandIndex (expectedSize );
83+ placeInventoryItems (inventory , items , offhandIndex );
84+ blockedSlots = getInventoryOffhandBlockedSlots ();
85+ placeBarriers (inventory , blockedSlots );
8486 }else if (type .equals ("armor" )){
8587 int armorSize = Math .min (items .length , 4 );
8688 for (int i = 0 ; i < armorSize ; i ++){
@@ -91,21 +93,14 @@ public void openInventoryEditor(Player admin, UUID targetUuid, String targetName
9193 blockedSlots .add (slot );
9294 }
9395 placeBarriers (inventory , blockedSlots );
94- }else if (type .equals ("offhand" )){
95- offhandSlot = 4 ;
96- if (items .length > 36 ){
97- inventory .setItem (offhandSlot , items [items .length - 1 ]);
98- }
99- blockedSlots = getOffhandBlockedSlots ();
100- placeBarriers (inventory , blockedSlots );
10196 }else {
10297 for (int i = 0 ; i < items .length && i < inventorySize ; i ++){
10398 inventory .setItem (i , items [i ]);
10499 }
105100 }
106101
107102 sessions .put (admin .getUniqueId (), new EditSession (admin .getUniqueId (), targetUuid , targetName , type , inventory , expectedSize ,
108- offhandSlot , blockedSlots , originalItems ));
103+ offhandSlot , offhandIndex , blockedSlots , originalItems ));
109104 admin .openInventory (inventory );
110105 }
111106
@@ -188,28 +183,33 @@ private void applyToPlayer(Player target, String type, ItemStack[] contents){
188183 case "inventory" -> target .getInventory ().setContents (contents );
189184 case "armor" -> target .getInventory ().setArmorContents (contents );
190185 case "enderchest" -> target .getEnderChest ().setContents (contents );
191- case "offhand" -> {
192- if (contents .length > 36 ){
193- target .getInventory ().setItemInOffHand (contents [contents .length - 1 ]);
194- }
195- }
196186 }
197187 }
198188
199189 private ItemStack [] extractContents (Inventory inventory , EditSession session ){
200190 if (session .type .equals ("inventory" )){
201191 ItemStack [] result = Arrays .copyOf (session .originalItems , session .expectedSize );
202- int storageSize = Math .min (36 , result .length );
203- for (int i = 0 ; i < storageSize ; i ++){
204- result [i ] = inventory .getItem (i );
192+ for (int slot = 0 ; slot < INVENTORY_MAIN_SIZE ; slot ++){
193+ int playerIndex = PLAYER_MAIN_START + slot ;
194+ if (playerIndex < result .length ){
195+ result [playerIndex ] = inventory .getItem (slot );
196+ }
205197 }
206- return result ;
207- }
208-
209- if (session .type .equals ("offhand" )){
210- ItemStack [] result = Arrays .copyOf (session .originalItems , session .expectedSize );
211- if (result .length > 36 ){
212- result [result .length - 1 ] = inventory .getItem (session .offhandSlot );
198+ for (int slot = 0 ; slot < HOTBAR_SIZE ; slot ++){
199+ int guiSlot = INVENTORY_MAIN_SIZE + slot ;
200+ if (slot < result .length ){
201+ result [slot ] = inventory .getItem (guiSlot );
202+ }
203+ }
204+ ItemStack offhandItem = session .offhandSlot != null ? inventory .getItem (session .offhandSlot ) : null ;
205+ if (session .offhandIndex != null && session .offhandIndex >= 0 ){
206+ if (session .offhandIndex < result .length ){
207+ result [session .offhandIndex ] = offhandItem ;
208+ }
209+ }else if (offhandItem != null ){
210+ ItemStack [] expanded = Arrays .copyOf (result , INVENTORY_STORAGE_SIZE + 1 );
211+ expanded [INVENTORY_STORAGE_SIZE ] = offhandItem ;
212+ return expanded ;
213213 }
214214 return result ;
215215 }
@@ -225,7 +225,7 @@ private int getDefaultSize(String type){
225225 return switch (type ) {
226226 case "armor" -> 4 ;
227227 case "enderchest" -> 27 ;
228- case "offhand " -> 37 ;
228+ case "inventory " -> 41 ;
229229 default -> 36 ;
230230 };
231231 }
@@ -235,15 +235,41 @@ private int getInventorySize(int expectedSize, String type){
235235 return 9 ;
236236 }
237237 if (type .equals ("inventory" )){
238- return 36 ;
239- }
240- if (type .equals ("offhand" )){
241- return 9 ;
238+ return INVENTORY_GUI_SIZE ;
242239 }
243240 int rows = (expectedSize + 8 ) / 9 ;
244241 return Math .max (9 , rows * 9 );
245242 }
246243
244+ private void placeInventoryItems (Inventory inventory , ItemStack [] items , Integer offhandIndex ){
245+ int dataLength = items .length ;
246+ for (int slot = 0 ; slot < INVENTORY_MAIN_SIZE ; slot ++){
247+ int playerIndex = PLAYER_MAIN_START + slot ;
248+ if (playerIndex < dataLength ){
249+ inventory .setItem (slot , items [playerIndex ]);
250+ }
251+ }
252+ for (int slot = 0 ; slot < HOTBAR_SIZE ; slot ++){
253+ int guiSlot = INVENTORY_MAIN_SIZE + slot ;
254+ if (slot < dataLength ){
255+ inventory .setItem (guiSlot , items [slot ]);
256+ }
257+ }
258+ if (offhandIndex != null && offhandIndex >= 0 && offhandIndex < dataLength ){
259+ inventory .setItem (OFFHAND_GUI_SLOT , items [offhandIndex ]);
260+ }
261+ }
262+
263+ private int resolveOffhandIndex (int dataLength ){
264+ if (dataLength >= 41 ){
265+ return 40 ;
266+ }
267+ if (dataLength == 37 ){
268+ return 36 ;
269+ }
270+ return -1 ;
271+ }
272+
247273 private void placeBarriers (Inventory inventory , Set <Integer > blockedSlots ){
248274 if (blockedSlots .isEmpty ()){
249275 return ;
@@ -264,10 +290,11 @@ private ItemStack buildBarrier(){
264290 return barrier ;
265291 }
266292
267- private Set <Integer > getOffhandBlockedSlots (){
293+ private Set <Integer > getInventoryOffhandBlockedSlots (){
268294 Set <Integer > blocked = new java .util .HashSet <>();
269- for (int slot = 0 ; slot < 9 ; slot ++){
270- if (slot != 4 ){
295+ int rowStart = INVENTORY_GUI_SIZE - 9 ;
296+ for (int slot = rowStart ; slot < rowStart + 9 ; slot ++){
297+ if (slot != OFFHAND_GUI_SLOT ){
271298 blocked .add (slot );
272299 }
273300 }
@@ -279,7 +306,6 @@ private String getTableForInventoryType(String type){
279306 case "inventory" -> Main .TABLE_NAME_INVENTORY ;
280307 case "armor" -> Main .TABLE_NAME_ARMOR ;
281308 case "enderchest" -> Main .TABLE_NAME_ENDERCHEST ;
282- case "offhand" -> Main .TABLE_NAME_INVENTORY ;
283309 default -> "" ;
284310 };
285311 }
@@ -289,7 +315,6 @@ private String getColumnForInventoryType(String type){
289315 case "inventory" -> "inventory" ;
290316 case "armor" -> "armor" ;
291317 case "enderchest" -> "enderchest" ;
292- case "offhand" -> "inventory" ;
293318 default -> "" ;
294319 };
295320 }
@@ -302,18 +327,20 @@ private static class EditSession {
302327 private final Inventory inventory ;
303328 private final int expectedSize ;
304329 private final Integer offhandSlot ;
330+ private final Integer offhandIndex ;
305331 private final Set <Integer > blockedSlots ;
306332 private final ItemStack [] originalItems ;
307333
308334 private EditSession (UUID adminUuid , UUID targetUuid , String targetName , String type , Inventory inventory , int expectedSize ,
309- Integer offhandSlot , Set <Integer > blockedSlots , ItemStack [] originalItems ){
335+ Integer offhandSlot , Integer offhandIndex , Set <Integer > blockedSlots , ItemStack [] originalItems ){
310336 this .adminUuid = adminUuid ;
311337 this .targetUuid = targetUuid ;
312338 this .targetName = targetName ;
313339 this .type = type ;
314340 this .inventory = inventory ;
315341 this .expectedSize = expectedSize ;
316342 this .offhandSlot = offhandSlot ;
343+ this .offhandIndex = offhandIndex ;
317344 this .blockedSlots = blockedSlots ;
318345 this .originalItems = originalItems ;
319346 }
0 commit comments