всем привет.
начал пилить несколько функций для создания предмета
но столкнулся с проблемой
ItemUserData неправильно работает в цикле
set trig[7] = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(trig[7],EVENT_PLAYER_UNIT_PICKUP_ITEM)
call TriggerAddAction(trig[7],function F_Pick_Item)
function F_Pick_Item takes nothing returns nothing
set Cnt_Inv = 0
loop
exitwhen Cnt_Inv > Min_Inv // 5
set ItemsInSlots[Cnt_Inv] = UnitItemInSlot(GetManipulatingUnit(), Cnt_Inv)
set ItemUserDataMas[Cnt_Inv] = Cnt_Inv
call SetItemUserData(GetManipulatedItem(), ItemUserDataMas[Cnt_Inv+1]) // от 1 до 6
set Cnt_Inv = Cnt_Inv + 1
endloop

call Text(" == " + I2S( ItemUserDataMas[Cnt_Inv] ))
пытаюсь каждый раз когда юнит получает предмет у которого нет значений добавить 1 к нему чтобы привязать его к предмету
set Item_Init[1] = 'I03D'
set Item_Init[2] = 'I03E'
set Item_Init[3] = 'I03F'
set Item_Init[4] = 'I03G'
set Item_Init_Number_End = 105
пытался следующим образом
set Cnt_Item_Init=1
loop
exitwhen Cnt_Item_Init>Item_Init_Number_End
call SetItemUserData(GetManipulatedItem(), Cnt_Item_Init)
set ItemUserDataMas[Cnt_Item_Init] = 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]) )) // возвращает значение 106 для всех предметов в инвентаре
endloop
call SetItemUserData(GetManipulatedItem(), Cnt_Item_Init)
Нельзя использовать SetItemUserData в цикле? или надо убрать массив и установить значение без массива?

Принятый ответ

логика такова
цикл от 1 до всех предметов в карте призван Установить для Каждого Item_Init[Cnt_Item_Init]
Значение взятое из SetItemUserData
для удобства занес эти Значения в Переменную типа Массив чтобы Оперировать с ними там где мне это нужно
и когда в инвентаре окажется Индекс этого предмета я буду знать что этот предмет мне нужен для Удаления
для этого есть функция
function F_H_Section_ReturnItem takes unit u, integer id returns nothing
set Cnt_Inv = 0
loop
exitwhen Cnt_Inv > Min_Inv
set ItemsInSlots[Cnt_Inv] = UnitItemInSlot(u, Cnt_Inv)
if LoadBoolean(H, StringHash("H"), StringHash("RemoveItems")) then
call SaveBoolean(H, StringHash("H"), StringHash("RemoveItems"), false)
call RemoveItem(ItemsInSlots[Cnt_Inv])
else
if GetItemTypeId(ItemsInSlots[Cnt_Inv]) == id then
call SaveBoolean(H, StringHash("H"), StringHash("RemoveItem"), true)
call RemoveItem(ItemsInSlots[Cnt_Inv])
endif
endif
set Cnt_Inv = Cnt_Inv + 1
endloop
set Cnt_Inv = 0
loop
exitwhen Cnt_Inv > Min_Inv
set ItemsInSlots[Cnt_Inv] = null
set Cnt_Inv = Cnt_Inv + 1
endloop
endfunction
достаточно одно SaveBoolean и готово
а дальше Создание предмета ПО Индексу расположенный в Item_Init

call SaveBoolean(H, StringHash("H"), StringHash("RemoveItems"), false)
призван удалить Все предметы из инвентаря Без проверки GetItemTypeId

либо использовать вариант который написал nazarpunk:

тут уже мне решать

function F_Pick_Item takes nothing returns nothing

set Cnt_Item_Init = 1
loop
exitwhen Cnt_Item_Init > Item_Init_Number_End
call SaveBoolean(H, StringHash("H"), StringHash("ItemUserDataSave"), true)
call SaveItemHandle(H, StringHash("H"), StringHash("ItemUserData"), GetManipulatedItem())

if GetItemTypeId(GetManipulatedItem()) == Item_Init[Cnt_Item_Init] then
set ItemUserDataMas[ItemUserDataAmount] = Cnt_Item_Init
endif

set Cnt_Item_Init = Cnt_Item_Init + 1
endloop

call F_H_Section_ItemUserData()

Я походу нашёл где ChatGPT обучается кодить...
я похож на ИИ?
даже мне стало интересно на что он способен :)

function F_H_Section_ItemUserData takes nothing returns integer
local item ItemUserData = LoadItemHandle(H, StringHash("H"), StringHash("ItemUserData"))
local integer I
set I = GetItemUserData(ItemUserData)
if LoadBoolean(H, StringHash("H"), StringHash("ItemUserDataSave")) then
call SaveInteger(H, StringHash("H"), StringHash("GetItemUserData"), I)
call SaveItemHandle(H, StringHash("H"), StringHash("ItemUserDataHandle"), ItemUserData)
call SaveInteger(H, StringHash("H"), StringHash("UserDataPlayerId"), GetPlayerId(GetItemPlayer(ItemUserData)))
call SaveInteger(H, StringHash("H"), StringHash("UserDataItemId"), GetItemTypeId(ItemUserData))
call SaveInteger(H, StringHash("H"), StringHash("ItemLevel"), GetItemLevel(ItemUserData))
call SaveBoolean(H, StringHash("H"), StringHash("ItemUserDataSave"), false)
endif
if ItemUserDataAmount < Size then
call SetItemUserData(ItemUserData, ItemUserDataMas[ItemUserDataAmount])
call SaveInteger(H, StringHash("H"), StringHash("ItemUserDataAmount")+ItemUserDataAmount, ItemUserDataMas[ItemUserDataAmount])
if LoadBoolean(H, StringHash("H"), StringHash("ItemUserDataIndicator")) then
set HRed[2] = GetRandomReal(0, 255)
set HGreen[2] = GetRandomReal(0, 255)
set HBlue[2] = GetRandomReal(0, 255)
call ItemAddIndicatorBJ(ItemUserData, HRed[2], HGreen[2], HBlue[2], 0)
endif
return I
else
call Text("|cFFFF0000ERROR: F_H_Section_ItemUserData - clear bad key|r")
set ItemUserDataAmount = Size - 1
return ItemUserDataAmount
endif
endfunction
constant integer Size = JASS_MAX_ARRAY_SIZE

спасибо за ответы, останусь на этом примере пожалуй
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
26
6 месяцев назад
0
1227895619 отличаются
Чем?
0
2
6 месяцев назад
0
привязывая данные к Предмету
0
26
6 месяцев назад
0
Item_Init инициализируется После установки
ItemUserDataMas
Всмысле "после" ?
0
2
6 месяцев назад
0
1227895619 отличаются
Чем?
много чем, это Разные Предметы из Разных категорий из других Разрядов из Кампании и у них у всех отдельные значения
0
26
6 месяцев назад
0
привязывая данные к Предмету
А тебе не это надо? Что б по типу предметы получать номер массива
Тип предмета 'I03D', это 1227895620, если отнять 1227895619 тотполцчаешь 1
Вот у тебя I03D=1
А переменная с индектом 1 = 'I03D'
0
2
6 месяцев назад
0
Item_Init инициализируется После установки
ItemUserDataMas
Всмысле "после" ?
ну это я сделаю, Первичные Функции необходимые для Работы Всего в карте устроены по Близовскому принципу "Поочередно"
0
26
6 месяцев назад
0
много чем, это Разные Предметы из Разных категорий из других Разрядов из Кампании и у них у всех отдельные значения
Ну так сгруппируй их
0
2
6 месяцев назад
0
привязывая данные к Предмету
А тебе не это надо? Что б по типу предметы получать номер массива
Тип предмета 'I03D', это 1227895620, если отнять 1227895619 тотполцчаешь 1
Вот у тебя I03D=1
А переменная с индектом 1 = 'I03D'
хороший пример...но надо продумать в каком месте его поставить чтобы функция работала

много чем, это Разные Предметы из Разных категорий из других Разрядов из Кампании и у них у всех отдельные значения
Ну так сгруппируй их
а тут другие проблемы возникают это отдельная тема для разговора

впрочем придумал решение по лучше

//if GetItemTypeId(GetManipulatedItem()) == Item_Init[Cnt_Item_Init] then
//call SetItemUserData(GetManipulatedItem(), Cnt_Item_Init)

//endif
в угоду Компактности
а то и так есть Тяжелые функции которые хочу Имплементировать в карту сохраняя и подгружая Значения из разных Массивов
0
26
6 месяцев назад
0
Я походу нашёл где ChatGPT обучается кодить...
0
2
6 месяцев назад
Отредактирован Emafusail
0
логика такова
цикл от 1 до всех предметов в карте призван Установить для Каждого Item_Init[Cnt_Item_Init]
Значение взятое из SetItemUserData
для удобства занес эти Значения в Переменную типа Массив чтобы Оперировать с ними там где мне это нужно
и когда в инвентаре окажется Индекс этого предмета я буду знать что этот предмет мне нужен для Удаления
для этого есть функция
function F_H_Section_ReturnItem takes unit u, integer id returns nothing
set Cnt_Inv = 0
loop
exitwhen Cnt_Inv > Min_Inv
set ItemsInSlots[Cnt_Inv] = UnitItemInSlot(u, Cnt_Inv)
if LoadBoolean(H, StringHash("H"), StringHash("RemoveItems")) then
call SaveBoolean(H, StringHash("H"), StringHash("RemoveItems"), false)
call RemoveItem(ItemsInSlots[Cnt_Inv])
else
if GetItemTypeId(ItemsInSlots[Cnt_Inv]) == id then
call SaveBoolean(H, StringHash("H"), StringHash("RemoveItem"), true)
call RemoveItem(ItemsInSlots[Cnt_Inv])
endif
endif
set Cnt_Inv = Cnt_Inv + 1
endloop
set Cnt_Inv = 0
loop
exitwhen Cnt_Inv > Min_Inv
set ItemsInSlots[Cnt_Inv] = null
set Cnt_Inv = Cnt_Inv + 1
endloop
endfunction
достаточно одно SaveBoolean и готово
а дальше Создание предмета ПО Индексу расположенный в Item_Init

call SaveBoolean(H, StringHash("H"), StringHash("RemoveItems"), false)
призван удалить Все предметы из инвентаря Без проверки GetItemTypeId

либо использовать вариант который написал nazarpunk:

тут уже мне решать

function F_Pick_Item takes nothing returns nothing

set Cnt_Item_Init = 1
loop
exitwhen Cnt_Item_Init > Item_Init_Number_End
call SaveBoolean(H, StringHash("H"), StringHash("ItemUserDataSave"), true)
call SaveItemHandle(H, StringHash("H"), StringHash("ItemUserData"), GetManipulatedItem())

if GetItemTypeId(GetManipulatedItem()) == Item_Init[Cnt_Item_Init] then
set ItemUserDataMas[ItemUserDataAmount] = Cnt_Item_Init
endif

set Cnt_Item_Init = Cnt_Item_Init + 1
endloop

call F_H_Section_ItemUserData()

Я походу нашёл где ChatGPT обучается кодить...
я похож на ИИ?
даже мне стало интересно на что он способен :)

function F_H_Section_ItemUserData takes nothing returns integer
local item ItemUserData = LoadItemHandle(H, StringHash("H"), StringHash("ItemUserData"))
local integer I
set I = GetItemUserData(ItemUserData)
if LoadBoolean(H, StringHash("H"), StringHash("ItemUserDataSave")) then
call SaveInteger(H, StringHash("H"), StringHash("GetItemUserData"), I)
call SaveItemHandle(H, StringHash("H"), StringHash("ItemUserDataHandle"), ItemUserData)
call SaveInteger(H, StringHash("H"), StringHash("UserDataPlayerId"), GetPlayerId(GetItemPlayer(ItemUserData)))
call SaveInteger(H, StringHash("H"), StringHash("UserDataItemId"), GetItemTypeId(ItemUserData))
call SaveInteger(H, StringHash("H"), StringHash("ItemLevel"), GetItemLevel(ItemUserData))
call SaveBoolean(H, StringHash("H"), StringHash("ItemUserDataSave"), false)
endif
if ItemUserDataAmount < Size then
call SetItemUserData(ItemUserData, ItemUserDataMas[ItemUserDataAmount])
call SaveInteger(H, StringHash("H"), StringHash("ItemUserDataAmount")+ItemUserDataAmount, ItemUserDataMas[ItemUserDataAmount])
if LoadBoolean(H, StringHash("H"), StringHash("ItemUserDataIndicator")) then
set HRed[2] = GetRandomReal(0, 255)
set HGreen[2] = GetRandomReal(0, 255)
set HBlue[2] = GetRandomReal(0, 255)
call ItemAddIndicatorBJ(ItemUserData, HRed[2], HGreen[2], HBlue[2], 0)
endif
return I
else
call Text("|cFFFF0000ERROR: F_H_Section_ItemUserData - clear bad key|r")
set ItemUserDataAmount = Size - 1
return ItemUserDataAmount
endif
endfunction
constant integer Size = JASS_MAX_ARRAY_SIZE

спасибо за ответы, останусь на этом примере пожалуй
Принятый ответ
Чтобы оставить комментарий, пожалуйста, войдите на сайт.