всем привет.
начал пилить несколько функций для создания предмета
но столкнулся с проблемой
ItemUserData неправильно работает в цикле
начал пилить несколько функций для создания предмета
но столкнулся с проблемой
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
для удобства занес эти Значения в Переменную типа Массив чтобы Оперировать с ними там где мне это нужно
и когда в инвентаре окажется Индекс этого предмета я буду знать что этот предмет мне нужен для Удаления
для этого есть функция
цикл от 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
а дальше Создание предмета ПО Индексу расположенный в 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
спасибо за ответы, останусь на этом примере пожалуй
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Тип предмета 'I03D', это 1227895620, если отнять 1227895619 тотполцчаешь 1
Вот у тебя I03D=1
А переменная с индектом 1 = 'I03D'
а то и так есть Тяжелые функции которые хочу Имплементировать в карту сохраняя и подгружая Значения из разных Массивов
Отредактирован Emafusail
цикл от 1 до всех предметов в карте призван Установить для Каждого Item_Init[Cnt_Item_Init]
Значение взятое из SetItemUserData
для удобства занес эти Значения в Переменную типа Массив чтобы Оперировать с ними там где мне это нужно
и когда в инвентаре окажется Индекс этого предмета я буду знать что этот предмет мне нужен для Удаления
для этого есть функция
а дальше Создание предмета ПО Индексу расположенный в Item_Init
даже мне стало интересно на что он способен :)