4

» WarCraft 3 / Создание предмета через itemUserData

Вот смотри далее... Ты задаешь переменную для тела цикла, и считаешь её пока она не упрётся в лимит от инита = 105
Т.е. цикл отработает 105 раз и сделает следующее:
Записывает дату подобранного предмета как тело = это числа от 1 до 105, т.е. тут происходит перезапись сто раз.
Пишет в другую переменную с индексам тела цикла само значение тела цикла.
...всё
Что тут должно произойти? Кроме как дата предмета будет равно 105 после последней перезаписи, а переменная ItemUserDataMas[1...105] = 1...105

Emafusail:
здесь проверяю
Но здесь нигде нет проверки что UserData подобранного предмета равно 0.
Разве не это значит "предмет у которого нет значения" ?

меня интересует почему
call SetItemUserData(GetManipulatedItem(), Cnt_Item_Init)
устанавливает для всех предметов значение Item_Init_Number_End
а когда проверяю Значения в инвентаре у них у всех значение 105
а не 1 2 3 4 5 6 7 8 9 исходя из GetItemTypeId
Из-за того что ты перезаписываешь это UserData для подобранного предмета
я отсюда его убрал чтобы он не установил данные а поставил в блок установки значений для всех предметов!
4

» WarCraft 3 / Создание предмета через itemUserData

Вот смотри далее... Ты задаешь переменную для тела цикла, и считаешь её пока она не упрётся в лимит от инита = 105
Т.е. цикл отработает 105 раз и сделает следующее:
Записывает дату подобранного предмета как тело = это числа от 1 до 105, т.е. тут происходит перезапись сто раз.
Пишет в другую переменную с индексам тела цикла само значение тела цикла.
...всё
Что тут должно произойти? Кроме как дата предмета будет равно 105 после последней перезаписи, а переменная ItemUserDataMas[1...105] = 1...105
ДА! Но оно записывает Только Последний Индекс для всех предметов
SetItemUserData
не различает индекс 1 2 3 4 5 6 а записывает только Последний индекс т.е 105 Для всех предметов!
4

» WarCraft 3 / Создание предмета через itemUserData

ItemUserDataMas[Cnt_Item_Init] это Целочисленная
Item_Init[Cnt_Item_Init] целочисленная
Предмет в инвентаре служит Только для Проверки
SetItemUserData()
а ItemUserDataMas[Cnt_Item_Init] это Значение которое проверяет SetItemUserData()

здесь проверяю

set Cnt_Item_Init=1
loop
exitwhen Cnt_Item_Init>Item_Init_Number_End
set ItemUserDataMas[Cnt_Item_Init] = Cnt_Item_Init
if ItemUserDataMas[Cnt_Item_Init] == Item_Init[Cnt_Item_Init] then
call SetItemUserData(GetManipulatedItem(), Cnt_Item_Init)
endif
//call Text(" == " + I2S( ItemUserDataMas[Cnt_Item_Init] ))
set Cnt_Item_Init = Cnt_Item_Init + 1
endloop

и здесь
set Cnt_Inv = 0
loop
exitwhen Cnt_Inv > Min_Inv
set ItemsInSlots[Cnt_Inv] = UnitItemInSlot(GetManipulatingUnit(), Cnt_Inv)
set Cnt_Inv = Cnt_Inv + 1

call Text(" == " + I2S( GetItemUserData(ItemsInSlots[Cnt_Inv]) ))
endloop

это отдельный блок который проверяет Инвентарь

меня интересует почему
call SetItemUserData(GetManipulatedItem(), Cnt_Item_Init)
устанавливает для всех предметов значение Item_Init_Number_End
а когда проверяю Значения в инвентаре у них у всех значение 105
а не 1 2 3 4 5 6 7 8 9 исходя из GetItemTypeId
4

» WarCraft 3 / Создание предмета через itemUserData

Да, поэтому ставить его надо НЕ в конце.
Ты там делаешь x[a]=a, т.е. что бы ссослаться на индекс массива тебе нужно получить его номер, а его номер - это его же индекс... Зачем?
А после этого SetData(i,x[a]+1)
Хотя по сути это равно SetData(i,a+1)
без разницы какой индекс он вернет мне нужно Привязать
Item_Init[Cnt_Item_Init]
к
ItemUserDataMas[Cnt_Item_Init]
при этом не меняя значение Item_Init[Cnt_Item_Init]
чтобы ItemUserDataMas[Cnt_Item_Init] я мог использовать для других целей
Индекс тут не причем
4

» WarCraft 3 / Создание предмета через itemUserData

А чего ты отладку вызываешь после цикла, а не внутри него? Раз ссылаешься на ту переменную, которая у тебя толкает сам цикл.
это проверка что все значения необходимые для вычисления заданы корректно

//set Cnt_Inv = 1
//loop
//call Text(" == " + I2S( Cnt_Inv ))// 1 2 3 4 5 6 7
//exitwhen Cnt_Inv >Max_Inv
//call Text(" == " + I2S( Cnt_Inv ))// 1 2 3 4 5 6
//set Cnt_Inv = Cnt_Inv + 1
//call Text(" == " + I2S( Cnt_Inv ))// 2 3 4 5 6 7
//endloop
constant integer Max_Inv = bj_MAX_INVENTORY //6
4

» WarCraft 3 / Создание предмета через itemUserData

globals
integer array Item_Init
integer array ItemUserDataMas
item array ItemsInSlots
integer ItemUserDataAmount = 0
integer Cnt_Inv = 0
integer Cnt_Item_Init = 0
constant integer Min_Inv = 5 // UnitItemInSlot()
endglobals

set Cnt_Item_Init=1
loop
exitwhen Cnt_Item_Init>Item_Init_Number_End
set ItemUserDataMas[Cnt_Item_Init] = Cnt_Item_Init
if ItemUserDataMas[Cnt_Item_Init] == Item_Init[Cnt_Item_Init] then
call SetItemUserData(GetManipulatedItem(), Cnt_Item_Init)
endif
//call Text(" == " + I2S( ItemUserDataMas[Cnt_Item_Init] ))
set Cnt_Item_Init = Cnt_Item_Init + 1
endloop
вернет 0

знаю что проверить можно по GetItemTypeId(ItemsInSlots[Cnt_Inv])
но блок отвечающий за инвентарь не в цикле Cnt_Item_Init

но если поставить
call SetItemUserData(GetManipulatedItem(), Cnt_Item_Init)
внутри блока отвечающий за инвентарь он установит значение для только что полученного предмета
это тоже не вариант

нужно GetManipulatedItem() поставить в блоке Cnt_Item_Init чтобы он установил значение для всех предметов от 1 до 105 а когда герой подбирает этот предмет чтобы значение проверялось через ItemUserDataMas[Cnt_Item_Init]
но конвертировать Предмет к Целочисленной нельзя
call SetItemUserData(ItemsInSlots[Cnt_Inv], Cnt_Item_Init)
//это не вариант

if ItemUserDataMas[Cnt_Item_Init] == Item_Init[Cnt_Item_Init] then
//вообще не сработает та как Item_Init возвращает GetItemTypeId предмета а ItemUserDataMas[Cnt_Item_Init] это значение 1 2 3 и так до 105

как привязать SetItemUserData к предмету который вернет GetItemTypeId?
4

» WarCraft 3 / TriggersЫ - Spawn Мобов

Я сделал следующим образом
Занес в переменную типа Массив Id юнита
занес в переменную Область в котором он должен создаваться
занес в переменную Время появления моба
и стартанул таймер, теперь я меняю значение переменной исходя из моих соображений