Snippet Save Item Charges

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 The Helper:
    they did not winterize any of the plants and they froze
  • The Helper The Helper:
    it is not that power consumption went up it was available capacity went down with power plants freezing
  • Varine Varine:
    What a fucking disaster. Are all of the Texas people okay? I see TH is, are we the only two?
  • Varine Varine:
    How have the other states held up? I just got power back so I have no idea what's going on, we didn't get warning
  • Varine Varine:
    Why the fuck didn't they fix this ten years ago when it happened?
  • Blackveiled Blackveiled:
    I'm in it with you and TH as well. My power has been in and out, and I have a ruptured pipe that I need to fix, shouldn't be too bad to fix myself.
  • Varine Varine:
    I hope you're staying warm! Apparently the supply is coming up so hopefully we can get back to normal power soon, mine has been on for six hours now.
  • M Mulciberxp:
    My power has been off most of the last 2 days. We had a generator installed 3 years ago though, so we're staying warm. Water is another issue...
  • The Helper The Helper:
    Where I live has a pool so we are using that to get water to flush the toilets. We have enough bottled water to drink and brush teeth and stuff but it has been a few days and no shower though....
  • Varine Varine:
    I had some water in gallon jugs, and got our water back on yesterday. We don't seem to have any leaks, but I haven't crawled down there to look yet.
  • The Helper The Helper:
    still no water I cannot remember when I last showered now I know how they felt in the old west lol
  • Varine Varine:
    My poor plants are happy, they aren
  • Varine Varine:
    aren't used to going this long without water or lights or normal heat. I think a couple of them froze, but they look like they'll make it
  • Varine Varine:
    Well one of them is pretty rough but I think it was sick to begin with, that one always had some problems.
  • jonas jonas:
  • jonas jonas:
    ???
  • Ghan Ghan:
    That is such a Texas thing to say lol
  • midnight8 midnight8:
    a positive could come out of this. So many people trapped at home could put a dent in the covid numbers in Texas
  • Varine Varine:
    That dude, Tom Boyd, is really upset about the backlash from his "it's your fault you're freezing" thing because he claims he resigned before saying it, so it wasn't like he said it in his official capacity or anything.
  • jonas jonas:
    Almost as if he was saying "screw you guys, I'm going home"
  • Varine Varine:
    I'm fairly new here still but that seems to be the analogous message by several of our politicians.
  • vypur85 vypur85:
    Nobody?
  • jonas jonas:
    Hi vypur85, long time no see
  • tom_mai78101 tom_mai78101:
    Hi vypur85, long time no see.
  • The Helper The Helper:
    We are all somebody

    Members online

    No members online now.

    Affiliates

    Hive Workshop NUON Dome
    Top