From 128606ae9cc70bf384cb058e0bd30b04e14567ef Mon Sep 17 00:00:00 2001 From: AlgorithmX2 Date: Sat, 10 Nov 2018 17:10:31 -0600 Subject: [PATCH] Sort/Combine/Condense Button for Bit Bag. Implements #125 --- .../chiselsandbits/bitbag/BagContainer.java | 6 ++ .../mod/chiselsandbits/bitbag/BagGui.java | 15 +++ .../chiselsandbits/bitbag/BagInventory.java | 96 ++++++++++++++++++ .../mod/chiselsandbits/core/ClientSide.java | 3 + .../chiselsandbits/helpers/LocalStrings.java | 1 + .../network/ModPacketTypes.java | 4 +- .../assets/chiselsandbits/lang/en_us.lang | 1 + .../chiselsandbits/textures/icons/sort.png | Bin 0 -> 268 bytes 8 files changed, 125 insertions(+), 1 deletion(-) create mode 100644 src/main/resources/assets/chiselsandbits/textures/icons/sort.png diff --git a/src/main/java/mod/chiselsandbits/bitbag/BagContainer.java b/src/main/java/mod/chiselsandbits/bitbag/BagContainer.java index fa58530a..8d2ffbbf 100644 --- a/src/main/java/mod/chiselsandbits/bitbag/BagContainer.java +++ b/src/main/java/mod/chiselsandbits/bitbag/BagContainer.java @@ -369,4 +369,10 @@ public void clear( ( (EntityPlayerMP) thePlayer ).sendContainerToPlayer( this ); } + public void sort() + { + bagInv.sort(); + ( (EntityPlayerMP) thePlayer ).sendContainerToPlayer( this ); + } + } diff --git a/src/main/java/mod/chiselsandbits/bitbag/BagGui.java b/src/main/java/mod/chiselsandbits/bitbag/BagGui.java index 86dcecb1..92a179e5 100644 --- a/src/main/java/mod/chiselsandbits/bitbag/BagGui.java +++ b/src/main/java/mod/chiselsandbits/bitbag/BagGui.java @@ -11,6 +11,7 @@ import mod.chiselsandbits.network.NetworkRouter; import mod.chiselsandbits.network.packets.PacketBagGui; import mod.chiselsandbits.network.packets.PacketClearBagGui; +import mod.chiselsandbits.network.packets.PacketSortBagGui; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.GuiButton; import net.minecraft.client.gui.inventory.GuiContainer; @@ -32,6 +33,7 @@ public class BagGui extends GuiContainer private static GuiBagFontRenderer specialFontRenderer = null; private GuiIconButton trashBtn; + private GuiIconButton sortBtn; public BagGui( final EntityPlayer player, @@ -52,6 +54,7 @@ public void initGui() super.initGui(); buttonList.add( trashBtn = new GuiIconButton( 1, guiLeft - 18, guiTop + 0, "help.trash", ClientSide.trashIcon ) ); + buttonList.add( sortBtn = new GuiIconButton( 1, guiLeft - 18, guiTop + 18, "help.sort", ClientSide.sortIcon ) ); } BagContainer getBagContainer() @@ -193,6 +196,13 @@ protected void drawGuiContainerForegroundLayer( } } + if ( sortBtn.isMouseOver() ) + { + final List text = Arrays + .asList( new String[] { LocalStrings.Sort.getLocal() } ); + drawHoveringText( text, mouseX - guiLeft, mouseY - guiTop, fontRendererObj ); + } + if ( trashBtn.isMouseOver() ) { if ( isValidBitItem() ) @@ -229,6 +239,11 @@ private ItemStack getInHandItem() protected void actionPerformed( final GuiButton button ) throws IOException { + if ( button == sortBtn ) + { + NetworkRouter.instance.sendToServer( new PacketSortBagGui() ); + } + if ( button == trashBtn ) { if ( requireConfirm ) diff --git a/src/main/java/mod/chiselsandbits/bitbag/BagInventory.java b/src/main/java/mod/chiselsandbits/bitbag/BagInventory.java index 0c99bf18..6e9d385e 100644 --- a/src/main/java/mod/chiselsandbits/bitbag/BagInventory.java +++ b/src/main/java/mod/chiselsandbits/bitbag/BagInventory.java @@ -245,6 +245,101 @@ public int getFieldCount() return 0; } + private static class StateQtyPair + { + public StateQtyPair( + int state, + int qty ) + { + this.qty = qty; + this.state = state; + } + + int qty; + int state; + }; + + public void sort() + { + List stacks = new ArrayList(); + + for ( int x = 0; x < stackSlots.length; ++x ) + { + int state = inv.contents[x * ItemBitBag.INTS_PER_BIT_TYPE + ItemBitBag.OFFSET_STATE_ID]; + int qty = inv.contents[x * ItemBitBag.INTS_PER_BIT_TYPE + ItemBitBag.OFFSET_QUANTITY]; + + if ( state > 0 && qty > 0 ) + { + stacks.add( new StateQtyPair( state, qty ) ); + } + } + + stacks.sort( new Comparator() { + + @Override + public int compare( + StateQtyPair o1, + StateQtyPair o2 ) + { + if ( o1.state < o2.state ) + return 1; + + if ( o1.state > o2.state ) + return -1; + + if ( o1.qty < o2.qty ) + return 1; + + if ( o1.qty > o2.qty ) + return -1; + + return 0; + } + } ); + + for ( int x = 0; x < stacks.size() - 1; x++ ) + { + StateQtyPair a = stacks.get( x ); + StateQtyPair b = stacks.get( x + 1 ); + + if ( a.state == b.state ) + { + if ( a.qty < getInventoryStackLimit() ) + { + int shiftSize = getInventoryStackLimit() - a.qty; + shiftSize = Math.min( shiftSize, b.qty ); + + a.qty += shiftSize; + b.qty -= shiftSize; + + if ( b.qty <= 0 ) + stacks.remove( x + 1 ); + + --x; + } + } + } + + for ( int x = 0; x < stackSlots.length; ++x ) + { + int state = 0; + int qty = 0; + + if ( stacks.size() > x ) + { + state = stacks.get( x ).state; + qty = stacks.get( x ).qty; + } + + inv.contents[x * ItemBitBag.INTS_PER_BIT_TYPE + ItemBitBag.OFFSET_STATE_ID] = state; + inv.contents[x * ItemBitBag.INTS_PER_BIT_TYPE + ItemBitBag.OFFSET_QUANTITY] = qty; + + stackSlots[x] = ModUtil.getEmptyStack(); + } + + inv.onChange(); + } + public void clear( final ItemStack stack ) { @@ -472,4 +567,5 @@ public boolean func_191420_l() return true; } + } diff --git a/src/main/java/mod/chiselsandbits/core/ClientSide.java b/src/main/java/mod/chiselsandbits/core/ClientSide.java index b65bbf1c..f5061184 100644 --- a/src/main/java/mod/chiselsandbits/core/ClientSide.java +++ b/src/main/java/mod/chiselsandbits/core/ClientSide.java @@ -399,6 +399,8 @@ public Map putStateModelLocations( public static TextureAtlasSprite redoIcon; public static TextureAtlasSprite trashIcon; + public static TextureAtlasSprite sortIcon; + public static TextureAtlasSprite swapIcon; public static TextureAtlasSprite placeIcon; @@ -415,6 +417,7 @@ void registerIconTextures( undoIcon = map.registerSprite( new ResourceLocation( "chiselsandbits", "icons/undo" ) ); redoIcon = map.registerSprite( new ResourceLocation( "chiselsandbits", "icons/redo" ) ); trashIcon = map.registerSprite( new ResourceLocation( "chiselsandbits", "icons/trash" ) ); + sortIcon = map.registerSprite( new ResourceLocation( "chiselsandbits", "icons/sort" ) ); roll_x = map.registerSprite( new ResourceLocation( "chiselsandbits", "icons/roll_x" ) ); roll_z = map.registerSprite( new ResourceLocation( "chiselsandbits", "icons/roll_z" ) ); diff --git a/src/main/java/mod/chiselsandbits/helpers/LocalStrings.java b/src/main/java/mod/chiselsandbits/helpers/LocalStrings.java index 5694ef9a..d9e84ee1 100644 --- a/src/main/java/mod/chiselsandbits/helpers/LocalStrings.java +++ b/src/main/java/mod/chiselsandbits/helpers/LocalStrings.java @@ -59,6 +59,7 @@ public enum LocalStrings leftAlt( "help.leftalt" ), rightAlt( "help.rightalt" ), + Sort( "help.sort" ), Trash( "help.trash" ), TrashItem( "help.trashitem" ), ReallyTrash( "help.reallytrash" ), diff --git a/src/main/java/mod/chiselsandbits/network/ModPacketTypes.java b/src/main/java/mod/chiselsandbits/network/ModPacketTypes.java index 5946620a..4b65bfd1 100644 --- a/src/main/java/mod/chiselsandbits/network/ModPacketTypes.java +++ b/src/main/java/mod/chiselsandbits/network/ModPacketTypes.java @@ -11,6 +11,7 @@ import mod.chiselsandbits.network.packets.PacketRotateVoxelBlob; import mod.chiselsandbits.network.packets.PacketSetChiselMode; import mod.chiselsandbits.network.packets.PacketSetColor; +import mod.chiselsandbits.network.packets.PacketSortBagGui; import mod.chiselsandbits.network.packets.PacketSuppressInteraction; import mod.chiselsandbits.network.packets.PacketUndo; @@ -26,7 +27,8 @@ public enum ModPacketTypes CLEAR_BAG( PacketClearBagGui.class ), SUPRESS_INTERACTION( PacketSuppressInteraction.class ), SET_COLOR( PacketSetColor.class ), - ACCURATE_PLACEMENT( PacketAccurateSneakPlace.class ); + ACCURATE_PLACEMENT( PacketAccurateSneakPlace.class ), + SORT_BAG_GUI( PacketSortBagGui.class ); private final Class packetClass; diff --git a/src/main/resources/assets/chiselsandbits/lang/en_us.lang b/src/main/resources/assets/chiselsandbits/lang/en_us.lang index f0345350..f53ea643 100644 --- a/src/main/resources/assets/chiselsandbits/lang/en_us.lang +++ b/src/main/resources/assets/chiselsandbits/lang/en_us.lang @@ -119,6 +119,7 @@ mod.chiselsandbits.help.rightshift=Right Shift mod.chiselsandbits.help.leftalt=Left Alt mod.chiselsandbits.help.rightalt=Right Alt mod.chiselsandbits.help.trash=Delete Bag Contents, Hold Item to filter. +mod.chiselsandbits.help.sort=Condense and Combine mod.chiselsandbits.help.trashitem=Delete only %s mod.chiselsandbits.help.reallytrash=Click again to confirm deletion of all mod.chiselsandbits.help.reallytrash_blank=Click again to confirm deletion of %s diff --git a/src/main/resources/assets/chiselsandbits/textures/icons/sort.png b/src/main/resources/assets/chiselsandbits/textures/icons/sort.png new file mode 100644 index 0000000000000000000000000000000000000000..4d57278ea24f50245329a3f9d4793d4f83ed5ca1 GIT binary patch literal 268 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DkxL735kHCP2GC{f}XQ4*Y=R#Ki=l*&+$n3-3imzP?iV4`QJXPB%t#~Y}o%hSa% z#KM2+gp0fl3Op_|`(;z4*e-Qm@m%%2a0%~Lhd&j9{r8MbJ5T7}DQMMOv2`E+Y}Xm$ zQ_jDhChBRu!N-xsdVzNTjsC+Pvpl`G1*trL(^MVKpwZ~?yyg4Cgd@ut6u%vIU`gB1 zrG3C*i+v*d4yH8YEzS4xS*#Cmr2TK4X2N(OzVm{ta)kRO=1Pv2{I7#WHUnM7;OXk; Jvd$@?2>`1^Tzvol literal 0 HcmV?d00001