Доброго времени суток! написал небольшую функцию на Jass которая проверяет полученные предметы.
возвращает true или false в зависимости от полученного предмета
здесь идет проверка если при вызове функции тип предмета не равен 0, это нужно чтобы исключить лишние предметы
так до 6 предметов которые соответствуют инвентарю и закрываю функцию
здесь я удаляю предмет который соответствует условиям
ну и тут я ее вызываю.
собственно вопрос, проверка предмета на наличие в инвентаре работает неправильно
именно вот первый предмет который соответствует индексу удаляется в любом случае
без проверки условий.
есть мысли что делаю неправильно? или чего-то не дописываю чтобы все работало нормально?

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

здесь тоже описывают что это функция утечна

переделал слегка функцию
function F_GetInventoryIndex takes unit u,integer id returns integer
local integer slot = 0
local integer cnt = 0
local item ite
loop
set ite = UnitItemInSlot(u,slot)
if ( ite != null ) and ( GetItemTypeId(ite) == id ) then
set cnt = cnt + 1
endif
set slot = slot + 1
exitwhen slot >= bj_MAX_INVENTORY
endloop
set ite = null
return cnt
endfunction

ну и тут идет проверка предмета
function F_Item_Check takes nothing returns nothing
local unit u = GetManipulatingUnit()
local integer id = GetItemTypeId(GetManipulatedItem())
if (id == udg_Item_Init[2]) then
if ( F_GetInventoryIndex(u, udg_Item_Init[2]) > 0 ) then
// если предметов больше 0 и GetItemTypeId = этому предмету то что угодно делать с ним
// в качестве индекса берется переменная типа тип Предмета с массивом
else
call F_Create_Item(u, udg_Item_Init[2])
endif
endif
endfunction
конечно можно использовать и конструкцию типа такого
if ( F_GetInventoryIndex(u, udg_Item_Init[2]) == 2 ) then
call UnitRemoveItem(u, udg_Item_Init[2])
endif

чтобы добавить ограничение для предмета данного типа

но это под RPG карты больше требуется

Ух какой ужос, меньше используй ГУИ, проверить можно по TypeId берем предмет в слоте и проверяем ид, если оно нужное - то удаляем, далее следующий слот если нужно проверить всё слоты, ну а систем на сборку артефактов на сайте была уйма. Потом если юнит получает предмет - то в триггере ты можешь узнать какой предмет он получил - GetManipulatedItem() его проверяй сразу, а не ищи по слотам.
ну дальше дело условий как говорится. спасибо.
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
19
2 года назад
0
Похожие вопросы:

ответ
Какие-то объекты могут создавать зависимости, осовбожегние хендла не значит, что объект чисто удален. В целом это всё уже из области псевдопрограммирования - не стоит волновться о таких мелочах. Create & Destroy работают достаточно хорошо. И да, объекты это все agent
type agent extends handle all reference counted objects

0
8
2 года назад
Отредактирован Centyrion
0
посмотрел на функцию UnitHasItemOfTypeBJ
function UnitHasItemOfTypeBJ takes unit whichUnit, integer itemId returns boolean
    return GetInventoryIndexOfItemTypeBJ(whichUnit, itemId) > 0
endfunction
проверяет если по типу предмета в инвентаре больше 0
GetInventoryIndexOfItemTypeBJ
function GetInventoryIndexOfItemTypeBJ takes unit whichUnit, integer itemId returns integer
    local integer index
    local item    indexItem

    set index = 0
    loop
        set indexItem = UnitItemInSlot(whichUnit, index)
        if (indexItem != null) and (GetItemTypeId(indexItem) == itemId) then
            return index + 1
        endif

        set index = index + 1
        exitwhen index >= bj_MAX_INVENTORY
    endloop
    return 0
endfunction

а если нет то возвращает 0

мне кажется что set index = 0 надо убрать отсюда и поставить другую переменную на +1

вместо return index + 1

функция создания предмета работает корректно
Загруженные файлы
1
32
2 года назад
1
Ух какой ужос, меньше используй ГУИ, проверить можно по TypeId берем предмет в слоте и проверяем ид, если оно нужное - то удаляем, далее следующий слот если нужно проверить всё слоты, ну а систем на сборку артефактов на сайте была уйма. Потом если юнит получает предмет - то в триггере ты можешь узнать какой предмет он получил - GetManipulatedItem() его проверяй сразу, а не ищи по слотам.
0
8
2 года назад
Отредактирован Centyrion
0
quq_CCCP:
да я этим сейчас и занимаюсь, насчет Type Id воспользуюсь но для проверки заряда предмета
local item i=GetManipulatedItem()
local item gi
local unit u=GetTriggerUnit()
local integer id=GetItemTypeId(i)
call UnitRemoveItem(u,i)
if((GetInventoryIndexOfItemTypeBJ(u,id)>0))then
call SetItemCharges(gi,(GetItemCharges(gi)+GetItemCharges(i)))
call RemoveItem(i)
else
call UnitAddItem(u,i)
endif

событие тоже будет такой при получении предмета,
меня смущает функция
GetInventoryIndexOfItemTypeBJ

переделаю и скажу результат

теперь вызов условия
Загруженные файлы
0
8
2 года назад
Отредактирован Centyrion
0
тут собственно когда юнит приобретает предмет идет проверка если это не Усиливающий предмет
и сохранение HandleId в хэш таблице

и условие
разобрались

тут вызывается



тут идет проверка если герой получил предмет типа Усиливающие
ну и условие
function F_Item_Stack_Cond takes nothing returns boolean
return (GetItemCharges(GetManipulatedItem()) > 0) and (GetItemType(GetManipulatedItem()) == ITEM_TYPE_CHARGED) and (GetManipulatedItem()!=GetItemOfTypeFromUnitBJ(GetManipulatingUnit(),GetItemTypeId(GetManipulatedItem()))) and (UnitHasItemOfTypeBJ(GetManipulatingUnit(),GetItemTypeId(GetManipulatedItem()))==true)
endfunction

можно совершенствовать но это потом

также получаем Id полученного предмета что и нужно

но id будет работать только для Усиливающих предметов
Загруженные файлы
0
8
2 года назад
Отредактирован Centyrion
0
здесь тоже описывают что это функция утечна

переделал слегка функцию
function F_GetInventoryIndex takes unit u,integer id returns integer
local integer slot = 0
local integer cnt = 0
local item ite
loop
set ite = UnitItemInSlot(u,slot)
if ( ite != null ) and ( GetItemTypeId(ite) == id ) then
set cnt = cnt + 1
endif
set slot = slot + 1
exitwhen slot >= bj_MAX_INVENTORY
endloop
set ite = null
return cnt
endfunction

ну и тут идет проверка предмета
function F_Item_Check takes nothing returns nothing
local unit u = GetManipulatingUnit()
local integer id = GetItemTypeId(GetManipulatedItem())
if (id == udg_Item_Init[2]) then
if ( F_GetInventoryIndex(u, udg_Item_Init[2]) > 0 ) then
// если предметов больше 0 и GetItemTypeId = этому предмету то что угодно делать с ним
// в качестве индекса берется переменная типа тип Предмета с массивом
else
call F_Create_Item(u, udg_Item_Init[2])
endif
endif
endfunction
конечно можно использовать и конструкцию типа такого
if ( F_GetInventoryIndex(u, udg_Item_Init[2]) == 2 ) then
call UnitRemoveItem(u, udg_Item_Init[2])
endif

чтобы добавить ограничение для предмета данного типа

но это под RPG карты больше требуется

Ух какой ужос, меньше используй ГУИ, проверить можно по TypeId берем предмет в слоте и проверяем ид, если оно нужное - то удаляем, далее следующий слот если нужно проверить всё слоты, ну а систем на сборку артефактов на сайте была уйма. Потом если юнит получает предмет - то в триггере ты можешь узнать какой предмет он получил - GetManipulatedItem() его проверяй сразу, а не ищи по слотам.
ну дальше дело условий как говорится. спасибо.
Принятый ответ
Чтобы оставить комментарий, пожалуйста, войдите на сайт.