Snippet Save Item Charges

Nestharus

o-o
Reaction score
84
JASS:

library SaveItemCharges /*
*************************************************************************************
*
*   Saves item charges. If an item has no charge, no data is saved at all. If no
*   items in inventory have chages, then absolutely no data is saved. Can use this script
*   with absolutely no cost if the map does not yet have items with charges.
*
*   *************************************************************************************
*   *
*   *   these two tables must be created by the user
*   *   itemMaxChargeTable should have an integer signifying max item charges
*   *   itemPerishableTable should have a boolean signifying whether item is perishable or not
*   *
*   *   itemMaxChargeTable
*   *       ->      maxCharges[itemTypeId]=maxCharges
*   *
*   *   itemPerishableTable
*   *       ->      isPerishable[itemTypeId].boolean=true
*   *   
*   *************************************************************************************
*
*************************************************************************************
*
*   */uses/*
*
*       */ NumberStack /*       hiveworkshop.com/forums/1993458-post521.html
*       */ Table /*             hiveworkshop.com/forums/jass-functions-413/snippet-new-table-188084/
*       */ optional Buffer /*   hiveworkshop.com/forums/2002936-post568.html
*
************************************************************************************
*
*   function SaveItemCharges takes NumberStack stack, unit whichUnit, Table itemMaxChargeTable, Table itemPerishableTable returns nothing
*
*   -> No Buffer <-
*
*       function LoadItemCharges takes NumberStack stack, unit whichUnit, Table itemMaxChargeTable, Table itemPerishableTable returns nothing
*
*   -> Buffer <-
*
*       function LoadItemChargesToBuffer takes NumberStack stack, unit whichUnit, Table itemMaxChargeTable, Table itemPerishableTable returns nothing
*       function LoadItemChargesFromBuffer takes unit whichUnit, Table itemMaxChargeTable returns nothing
*
*   Basic Demos
*
*   ************************************************************************************
*   *
*   *   Table maxCharges = Table.create()
*   *   Table isPerishable = Table.create()
*   *
*   *   set maxCharges['item']=20
*   *   set isPerishable['item'].boolean=true
*   *
*   ************************************************************************************
*   *
*   *   call SaveItemCharges(stack,someUnit,maxCharges,isPerishable)
*   *
*   ************************************************************************************
*   *
*   *   call LoadItemCharges(stack,someUnit,maxCharges,isPerishable)
*   *
*   ************************************************************************************
*
************************************************************************************/
    function SaveItemCharges takes NumberStack stack, unit whichUnit, Table itemMaxChargeTable, Table itemPerishableTable returns nothing
        local integer inventorySize = UnitInventorySize(whichUnit)
        local integer itemSlot = 0
        local integer maxCharges = 0
        local integer itemTypeId
        local item currentItem
        local integer itemCount=0
        loop
            exitwhen itemSlot == inventorySize
            set currentItem=UnitItemInSlot(whichUnit,itemSlot)
            if (null!=currentItem) then
                set itemCount=itemCount+1
                set itemTypeId = GetItemTypeId(currentItem)
                set maxCharges = itemMaxChargeTable[itemTypeId]
                if (0<maxCharges) then
                    if (itemPerishableTable.boolean[itemTypeId]) then
                        call stack.push(GetItemCharges(currentItem)-1,maxCharges-1)
                    else
                        call stack.push(GetItemCharges(currentItem),maxCharges)
                    endif
                endif
            endif
            set itemSlot = itemSlot + 1
        endloop
        set currentItem=null
    endfunction
    static if LIBRARY_Buffer then
        function LoadItemChargesToBuffer takes NumberStack stack, unit whichUnit, Table itemMaxChargeTable, Table itemPerishableTable returns nothing
            local integer inventorySize = UnitInventorySize(whichUnit)
            local integer itemSlot = 0
            local integer maxCharges = 0
            local integer itemTypeId
            local item currentItem
            loop
                exitwhen itemSlot == inventorySize
                set currentItem=UnitItemInSlot(whichUnit,itemSlot)
                if (null!=currentItem) then
                    set itemTypeId = GetItemTypeId(currentItem)
                    set maxCharges = itemMaxChargeTable[itemTypeId]
                    if (0<maxCharges) then
                        if (itemPerishableTable.boolean[itemTypeId]) then
                            call Buffer.write(stack.pop(maxCharges-1)+1)
                        else
                            call Buffer.write(stack.pop(maxCharges))
                        endif
                    endif
                endif
                set itemSlot = itemSlot + 1
            endloop
            set currentItem=null
        endfunction
        function LoadItemChargesFromBuffer takes unit whichUnit, Table itemMaxChargeTable returns nothing
            local integer inventorySize = UnitInventorySize(whichUnit)
            local integer itemSlot = 0
            local item currentItem
            loop
                exitwhen itemSlot == inventorySize
                set currentItem=UnitItemInSlot(whichUnit,itemSlot)
                if (null!=currentItem) then
                    if (0<itemMaxChargeTable[GetItemTypeId(currentItem)]) then
                        call SetItemCharges(currentItem,Buffer.read())
                    endif
                endif
                set itemSlot = itemSlot + 1
            endloop
            set currentItem=null
        endfunction
    else
        function LoadItemCharges takes NumberStack stack, unit whichUnit, Table itemMaxChargeTable, Table itemPerishableTable returns nothing
            local integer inventorySize = UnitInventorySize(whichUnit)
            local integer itemSlot = 0
            local integer maxCharges = 0
            local integer itemTypeId
            local item currentItem
            loop
                exitwhen itemSlot == inventorySize
                set currentItem=UnitItemInSlot(whichUnit,itemSlot)
                if (null!=currentItem) then
                    set itemTypeId = GetItemTypeId(currentItem)
                    set maxCharges = itemMaxChargeTable[itemTypeId]
                    if (0<maxCharges) then
                        if (itemPerishableTable.boolean[itemTypeId]) then
                            call SetItemCharges(currentItem,stack.pop(maxCharges-1)+1)
                        else
                            call SetItemCharges(currentItem,stack.pop(maxCharges))
                        endif
                    endif
                endif
                set itemSlot = itemSlot + 1
            endloop
            set currentItem=null
        endfunction
    endif
endlibrary
 
General chit-chat
Help Users
  • No one is chatting at the moment.

      The Helper Discord

      Members online

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top