Snippet Save Item Charges

Nestharus

o-o
Reaction score
83
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.
  • jonas jonas:
    That sounds like fun!
    +1
  • The Helper The Helper:
    it was a blast!
  • The Helper The Helper:
    I am going to post the Youtube of the investigation in the forums when it is ready
    +1
  • jonas jonas:
    cool!
  • vypur85 vypur85:
    Sounds cool TH.
  • tom_mai78101 tom_mai78101:
    I was on a Legend of Zelda marathon...
  • tom_mai78101 tom_mai78101:
    Am still doing it now
    +1
  • jonas jonas:
    which one(s) are you playing?
  • jonas jonas:
    I played a little bit of the switch title two weeks ago and found it quite boring
  • The Helper The Helper:
    just got back from San Antonio this weekend had the best Buffalo Chicken Cheesesteak sandwhich in Universal City, TX - place was called Yous Guys freaking awesome! Hope everyone had a fantastic weekend!
    +1
  • The Helper The Helper:
    Happy Tuesday!
  • The Helper The Helper:
    We have been getting crazy numbers reported by the forum of people online the bots are going crazy on us I think it is AI training bots going at it at least that is what it looks like to me.
  • The Helper The Helper:
    Most legit traffic is tracked on multiple Analytics and we have Cloud Flare setup to block a ton of stuff but still there is large amount of bots that seem to escape detection and show up in the user list of the forum. I have been watching this bullshit for a year and still cannot figure it out it is drving me crazy lol.
    +1
  • Ghan Ghan:
    Beep boop
    +1
  • The Helper The Helper:
    hears robot sounds while 250 bots are on the forum lol
  • The Helper The Helper:
    Happy Saturday!
    +1
  • The Helper The Helper:
    and then it was Thursday...
    +2
  • tom_mai78101 tom_mai78101:
    And then Monday
    +1
  • The Helper The Helper:
    I got the day off today!
    +1
  • tom_mai78101 tom_mai78101:
    How...? (T-T)
  • The Helper The Helper:
    I took the day off. I work for myself so I can do that.
    +1
  • Varine Varine:
    Well I'm already over summer
  • jonas jonas:
    varine! good to see you
  • jonas jonas:
    what's going on, what's got you going
  • The Helper The Helper:
    good to see you varine hope you are well my friend

    The Helper Discord

    Members online

    No members online now.

    Affiliates

    Hive Workshop NUON Dome World Editor Tutorials

    Network Sponsors

    Apex Steel Pipe - Buys and sells Steel Pipe.
    Top