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