Всем привет, можно ли как то узнать, какие бонусы даёт предмет, получить id абилки, например?
`
ОЖИДАНИЕ РЕКЛАМЫ...
9
MACOH, пришлось по ломать голову и информации вообще никакой толком нет в интернете, как эта функция работает.
В общем на 1.26 ты прав, это бд, а вот на 2.0 это можно решить с помощью данного кода
function Trig_Melee_Initialization_Actions takes nothing returns nothing
local item i = GetManipulatedItem()
local integer iloop = 0
//call PolledWait(1)
//set i = CreateItem('ratc', 55, 55)
//call PolledWait(1)
loop
    call BJDebugMsg("Index "+I2S(iloop)+" = "+GetObjectName(BlzGetAbilityId(BlzGetItemAbilityByIndex(i,iloop))))
set iloop = iloop + 1    
exitwhen iloop == 7
endloop
set i = null
endfunction

//===========================================================================
function InitTrig_Melee_Initialization takes nothing returns nothing
    set gg_trg_Melee_Initialization = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Melee_Initialization, EVENT_PLAYER_UNIT_PICKUP_ITEM )
    call TriggerAddAction( gg_trg_Melee_Initialization, function Trig_Melee_Initialization_Actions )
endfunction
Сама функция BlzGetItemAbilityByIndex очень сырая и считывает Абилку, только если её подняли, однако, если просто создать предмет и получить Id по индексу, то выдаст null.
Так же есть ситуации, когда индекс по абилке не выдаст вообще на примере итема "Львиный рог Штормграда", сумею предположить, что функция дружит только со способностями, которые н5е относятся к героям.
Копая дальше улетаю в тупик, если делать систему инвентаря на более 6 итемов, то опять надо делать БД, ибо способность не считать, если он не у юнита, либо делать жеский костыль, через дамика и давать ему предметы для получения характеристик итема, а далее наделять этими бонусами основного героя.
Загруженные файлы
Ответы (6)
3
Smeto К сожалению не сижу на рефандете и не знаю местный функционал. А зачем считывать абилки с предметов, если не секрет? И справится ли эта функция со спеллбуками? Возможно есть обходные пути для задумки
9
MACOH, для того, что бы сделать инвентарь более 6 предметов и не создавать базу данных на предметы, которые уже есть.
7 итем и так далее будет же не в 6 стандартных слотах, да и в целом при переделывании, убирать куда то во фреймы, а тут при поднятии будем считывать характеристики предмета, вместо бд и давать их герою
16
Smeto, инвентарь > 6 предметов уже само по себе костыль, т.к. нативных средств нет
9
MACOH, красиво, спасибо за вариант, выглядит интересно, гляну чуть позже
10
Ydav, нативные средства есть на ujapi, относительно недавно сделали возможным увеличение обычного инвенторя из коробки вплоть до 10к слотов, но соответственно надо будет доп слоты выводить фреймами, но уже намного лучше чем костылить свой инвентарь и тд)
32
На 1.26 мемхак, позволит alilist предметов и юнитов смотреть.
23
Вариант есть, который бы сработал и в 1.26, без мемхаков и без базы данных, но все же советовал бы сделать через базу данных.
Способности предмета наследуются юнитами, которые держат их в инвентаре. На основе этого факта можно сделать довольно костыльное решение твоей задачи:
  1. Создать предмет того же типа, что ты и проверяешь.
  2. Дать его даммику с инвентарем.
  3. Проверить на GetUnitAbilityLevel(dummy,RAWcode)
  4. В качестве RAWcode перебирай все возможные значения кодов твоих и стандартных абилок, с минимального значения, по максимально встречаемый в твоей карте. Например, если ты используешь только кастомные значения, то это будет сначала 'A000' потом 'A000'+1 и т.д.
  5. Этот перебор неэффективен с точки зрения оптимизации, плюс возможно достижения лимита на исполнение операций в одном потоке. Так что если твой диапазон допустимых кодов абилок слишком большой, нужно будет разбить потоки.
  6. Удачные проверки занеси в отдельный массив. Это и будет твой список абилок.
  7. Удали временно созданный предмет и даммик (если не пользуешься глобальным даммиком).
Ответы (4)
9
makkad, вот, спасибо, интересный вариант решения, минусы услышат…
Так не хотелось делать БД…350 итемов…Но похоже придётся )
26
Smeto, ты можешь сделать заполнение этой БД единоразово в момент инициализации карты, и будешь иметь полный список предметов/абилок (главное правильно это всё оформить и заполнить).
23
Важное уточнение. Из минусов этого варианта, что им не учесть число одинаковых абилок на предметах. Т.е. если у предмета есть две абилки с одинаковыми кодами "Сила +1", которые в сумме повышают герою силу на 2, то этот вариант даст информацию что у него есть только по крайней мере одна такая абилка. Поэтому, если будешь реализовывать этот вариант, то нужно при кастомизации предметов не давать им идентичные абилки.
26
makkad, кстати ДА, очевидная проблема... я о ней не подумал только лишь потому, что сам не имею привычки выдавать предметам одинаковые абилки ради получения бонуса х2, вместо того что бы выдать сразу абилку с нужным бонусом.
16
Вообще, тут действительно проще делать через БД. Бонусы предметов же все равно можно поделить на несколько категорий (характеристики, модификаторы), и давать уже бонус при взятии и убирать при снятии. Этот подход куда более гибкий, потому что можно увеличивать\уменьшать бонусы от предметов в любой момент. И раз сам предмет будет пустышкой, то дать невидимый предмет ничего не стоит
10
В UjAPI это доступно из коробки. Правда в экспериментальной версии, обращайся к Unryze
  1. Fully rewritten CAbilityInventory, now it supports up to 10000 items.
    Note: this change is highly experimental, so crashes may happen, which will be fixed accordingly.
  2. CAbilityInventory now resizes itself based on ITEM_CAPACITY field, which can be higher than 6.
    NOTE: use SetAbilityBaseIntegerLevelFieldById( AbilityId, ABILITY_ILF_ITEM_CAPACITY, LEVEL, COUNT ) if you do NOT want to edit fields via WE.
  3. InventoryBar can now be resized according to SetFrameGridSize.
constant playerunitevent EVENT_PLAYER_UNIT_ACQUIRED_TARGET = ConvertPlayerUnitEvent(278)
constant playerunitevent EVENT_PLAYER_UNIT_TARGET_IN_RANGE = ConvertPlayerUnitEvent(279)
constant playerunitevent EVENT_PLAYER_UNIT_MOVE_ITEM_SLOT = ConvertPlayerUnitEvent(280)
constant playerunitevent EVENT_PLAYER_UNIT_STACK_ITEM = ConvertPlayerUnitEvent(319)
constant unitevent EVENT_UNIT_MOVE_ITEM_SLOT = ConvertUnitEvent(297)
constant unitevent EVENT_UNIT_STACK_ITEM = ConvertUnitEvent(318)
constant native GetTriggerItemTargetItem takes nothing returns item
constant native GetTriggerItemSourceSlot takes nothing returns integer
constant native GetTriggerItemTargetSlot takes nothing returns integer
constant native GetAbsorbedItem takes nothing returns item
constant native GetAbsorbingItem takes nothing returns item
constant native GetAbsorbedItemWasAbsorbed takes nothing returns boolean
constant native GetStackingItemSource takes nothing returns item
constant native GetStackingItemSourcePreviousCharges takes nothing returns integer
constant native GetStackingItemTarget takes nothing returns item
constant native GetStackingItemTargetPreviousCharges takes nothing returns integer
constant native GetStackingItemTargetAddedCharges takes nothing returns integer
constant native SetTriggerItemAllowMoveSlot takes boolean isMove returns nothing
constant native SetTriggerItemAllowStack takes boolean isStack returns nothing
Загруженные файлы
Ответы (1)
10
Ну и соответственно абилки получить тоже можно, гетеры все есть
Чтобы оставить комментарий, пожалуйста, войдите на сайт.