Snippet Save Item Charges

Discussion in 'Models and Textures' started by Nestharus, Aug 28, 2011.

  1. Nestharus

    Nestharus o-o

    Ratings:
    +83 / 0 / -0
    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
     

Share This Page