Работа с наборами (Set).
Отличаются от массивов тем, что намного быстрее выполняет функции add и delete (практически моментально) и хранит только уникальные значения.
Code:
### SETS
Sub purgeSet(setName)
var len = getSetLen(setName)
var i
if (len == 0) then
return
endif
for i=0 to len-1
setSetValue(setName,i,0)
next
setSetLen(setName,0)
endsub
Sub dumpSet(setName)
UO.TextOpen()
UO.TextPrint("Printing set <"+setName+"> contents:");
var i
var len = getSetLen(setName)
var value
for i=0 to len-1
value = getSetValue(setName,i)
value = "["+str(i)+"] = "+value
UO.Print(value)
UO.TextPrint(value)
next
endsub
Sub addSetValue(setName, value)
var pos = getSetIndexOf(setName, value)
if (pos >= 0) then
return pos
endif
var len = getSetLen(setName)
setSetValue(setName,len,value)
setSetLen(setName,len+1)
return len
endsub
Sub setSetValue(setName, index, value)
UO.SetGlobal('set_'+setName+'_'+str(index), value)
endsub
Sub getSetValue(setName, index)
return UO.GetGlobal('set_'+setName+'_'+str(index))
endsub
Sub getSetIndexOf(setName, value)
var len = getSetLen(setName)
var i = 0
var curValue
if (len == 0) then
return -1
endif
for i = len-1 to 0 step -1
curValue = getSetValue(setName,i)
if (curValue == value OR curValue == str(value)) then
return i
endif
next
return -1
endsub
Sub getSetLen(setName)
return val(UO.GetGlobal('set_'+setName+'_cnt'))
endsub
Sub setSetLen(setName, length)
UO.SetGlobal('set_'+setName+'_cnt',length)
endsub
Sub delSetIndex(setName, index)
var len = getSetLen(setName)
setSetValue(setName, index, getSetValue(setName, len-1))
setSetLen(setName,len-1)
endsub
Sub delSetValue(setName, value)
delSetIndex(setName, getSetIndexOf(setName, value))
endsub
К примеру я применил его в скрипте на списки игноров:
У меня часто бывает что два скрипта должны игнорить разные вещи, при этом иногда их резетить. К примеру скрипт на подсчёт точного количества шмоток в указанном контейнере должен игнорировать найденные шмотки, а потом их все резетить. Но он может зарезетить переменные другого скрипта, что есть плохо. Поэтому можно использовать это:
Code:
### IGNORE LISTS
Sub addToIgnoreList(listName, object)
var obj = UO.GetSerial(object)
if (obj == 0 OR obj == -1) then
return
endif
addSetValue(listName,obj)
UO.Ignore(obj,'on')
endsub
Sub delFromIgnoreList(listName, object)
var obj = UO.GetSerial(object)
if (obj == 0 OR obj == -1) then
return
endif
delSetValue(listName,obj)
UO.Ignore(obj,'off')
endsub
Sub resetIgnoreList(listName)
var i
var len = getSetLen(listName)
var obj
if (len == 0) then
return
endif
for i=0 to len-1
obj = getSetValue(listName,i)
UO.Ignore(obj,'off')
setSetValue(listName,i,0)
next
setSetLen(listName,0)
endsub
Пример использования:
Code:
sub testIgnoreList()
var i
for i = 0 to 5
UO.FindType(-1)
addToIgnoreList('list1','finditem')
UO.FindType(-1)
addToIgnoreList('list2','finditem')
next
UO.FindType(-1)
UO.Print('Found items after ignore: '+str(UO.FindCount()))
resetIgnoreList('list1')
UO.FindType(-1)
UO.Print('Found items after reset1: '+str(UO.FindCount()))
resetIgnoreList('list2')
UO.FindType(-1)
UO.Print('Found items after reset2: '+str(UO.FindCount()))
endsub