Сколько ж ограничений в UnrealScript!

Вот, оказывается  свой итератор нельзя объявить.  Функция-итератор должна быть нативной. Нативную функцию можно объявить только в нативном классе. А нативный класс просто нельзя объявлять...

Но я это обошел.

Создаем функцию, подобную итератору, например:

function RPGInvActor(class<Inventory> BaseClass, out Inventory Inv)

Она подобна итератору:

native final iterator function InventoryActors( class<Inventory> BaseClass, out Inventory Inv );

из класса  InventoryManager. Единственное условие - в Inv должна вернуть None, если не нашла.

Теперь вместо foreach используем:

do
{
 ...
} until( Inv != None);

 

Естестсвенно RPGInvActor должна при каждом вызове возвращать следующее значение. Этого можно достичь введя переменную в классе, которая сохраняет предыдущее найденное значение:

var Inventory        InvCash;            //Для итератора

И использовать ее для нахождения следующего айтема в списке для поиска...

Для чего мне все это понадобилось? Для своей реализации инвентаря.

Инвентарь у Эпиков представляет собой обычный односвязный список. Естественно поиск в нем не быстр, естественно Инвентаря в нем много хранить нельзя (Эпики об этом прямо пишут). Более того, хоть это и возможно принципиально, но у Эпиков в инвентарь нельзя добавлять одинаковые предметы.

Ну а в ролевых играх в рюкзаке у героя очень много предметов, очень много одинаковых...

Как это реализовать? - сделать свою структуру для инвентаря. Я сделал комбинированную.

Есть динамический массив, элементы которого - первые элементы в связанных списках. Тип элемента в массиве повторяться не может. А вот в списке, на который указывает элемент массива как раз наоборот - все элементы одного типа.