Добавлен , опубликован

Основы Интерфейса

Содержание:
Когда-то меня попросили сделать инвентарь с примером, но я это без особого рвения не хотел делать.
Мне как-то Hate в дискарде подкинул идею попробовать как сделать перетаскивание по слоту ПКМ итем. Какой то пацан с хайва смог сделать. Bergi еще спрашивал. Меня унесло куда-то делать инвентарь.
Вот есть примерная наработка она показывает, что нет ничего невозможного. Правда, я настолько ленив, что все время делал понемногу, а потом после успешного продвижения откладывал, вместо того, чтобы продолжать доделывать.
Инвентарь пока не доработан, тк мне уже надоел варкрафт. мб попозже доделаю. Но все основное уже есть для работы фейкового инвентаря. ему необходимо сделать несколько вещей:
  1. добавить пассивки через BonusMode. не хватает пока пассивок.
некоторые интересные нативки для итемов
---@param whichItem item
---@param abilCode integer
---@return boolean
function BlzItemRemoveAbility(whichItem, abilCode) end	-- (native)

---@param whichItem item
---@param abilCode integer
---@return boolean
function BlzItemAddAbility(whichItem, abilCode) end	-- (native)
ранее я забил вручную бд абилок для итемов, тк невозможно было получить ид. в новом патче 1.33 завезли нативку BlzGetAbilityId для ниже перечисленных, которые могут список крутить. однако, оно выдает ability. Как раз BlzGetAbilityId конвентирует ability в id
---@param whichItem item
---@param index integer
---@return ability
function BlzGetItemAbilityByIndex(whichItem, index) end	-- (native)

---@param whichItem item
---@param abilCode integer
---@return ability
function BlzGetItemAbility(whichItem, abilCode) end	-- (native)

---@param whichUnit unit
---@param abilId integer
---@return ability
function BlzGetUnitAbility(whichUnit, abilId) end	-- (native)

---@param whichUnit unit
---@param index integer
---@return ability
function BlzGetUnitAbilityByIndex(whichUnit, index) end	-- (native)
  1. убрать стандартный интерфейс. Рекомендация: Кнопки интерфейса (в частности от коммандной панели и инвентаря) рекомендуется не убирать и не прятать, а перетащить за пределы экрана, так чтобы их не видно было на экране. Причины: активные способности активируются горячей клавишей hotkey, прицелы вызываются также вызываются hotkey, итемы первых двух-трех слотов используются. почему нельзя прятать кнопки, так вы не сможете вызывать кнопки через хоткеи (уже не помню точно, тк давно делал):
  • первый слот инвентаря: при наведении на фейковый слот, пересоздает итем из фейкового выделенного слота. для чтения филда для отрисовки подсказки/иконки и пр
  • второй слот инвентаря: перед получении приказа на дроп во втором создается итем. этом итем он выкинет или ..
  1. немного потестить на сэйв/лоад и синхронизацию. ничего сложного нет. хотя мб переделаю позже.
Уникальность наработки:
  1. можно указать координаты фейкового инвентаря и перенести.
  2. можно указать размеры инвентаря, указать кол-во столбцов и строк. Задний фон расширяется за слотами. Нумерация слотов начинается с верхнего левого края.
  3. можно переносить ПКМ слоты инвентаря
  4. заряды. можно настроить чарды. автоматически складывается в один стек при подборе однотипные итемы. ПКМ можно объединять чарды в один стэк. также планировал разделять чарды колесиком мыши (у фрейма есть событие на ловлю прокрутки колесика. не реализовал идею, мб кому нибудь пригодится идея). введены константы для зарядов, какие настройки нужно включить
  1. добавлена перезарядка предмета. особое внимание, тут у кулдауна есть свои константы:
как устроена механика дефолтного кд (сам тестил и сравнивал)
Чтоб вы знали: в дефолтном варике существует два независмых кд итема:
-кд юнита (его можно назвать общим кд предмета)
-кд итема (их в дефолтном инвентаре может быть 6)
В основном эта два независимых параметра, определяющие хранение времени кд. Главенствует в основном кд юнита, поскольку этот штраф распространяется на все точно такие же предметы. То есть юнит не может несколько однотипных предметов юзать за раз.
Заметки:
  • Если юзнуть предмет, то все кд однотипные сбрасываются, и запускают новые кд. Сделано это случайно или специально, можно только догадываться. Но, кажется игра не допускает, чтобы у юнита в инвентаре у однотипных были разные кд. Иначе, можно было другим путем, складывать кд. Но тогда надо смотреть, чтобы игрок не складывал кд итему по много раз.
  • Если выбросить/удалить предмет, но при этом у него еще не завершился кд. Кд юнита сохраняется (это при условии, что не осталось никаких предметов, пример: герой выпив бутылку => само зелье исчезает). При подборе любого однотипного итема (не важно был у него кд или не был), вас заставят завершить кд юнита.
  • Если бы кулдаун распространялся только на предметах, то это было бы логично и просто. Юзнул, кд пошел. В игре часто вижу одноразовые итемы: предмет был одноразовым, герой выпил бутылку, тогда она исчезла бы. Но кулдаун на одноразовых это просто боль. Что делать с этим? у удалившего итема кд должен был исчезнуть. По идее в варкрафте, это решается только общим кулдауном юнита. При подборе нового предмета, кд придеться подождать когда откатится кд.
Теперь, давайте-ка разберемся, что же такое у нас кд итем. Это точно такой же штраф. Создан, чтобы юниты игрока не могли применять один и тот же предмет по нескольку раз. Пример, взял один герой применил, выбросил/отдал другому => другой повторил, отдал третьему. И так далее. Дисбаланс. А так у предмета остается некий штраф. При получении другой юнит не сможет использовать предмет сразу, а придеться подождать штраф. Однако, если у юнита есть кд юнита, а получаем итем с кд итема, но кд не суммируются => в механике вара новый итем получает точно такойж кд юнита, то кд итема сбрасывается.
хранится кд в бд
бд о тек кол-ве пройденного времени кулдауна. при дропе сохраняем по хэндлук итема инфу о кд
cooldawn_current_item = {}
cooldawn_base_item = {}
бд о тек кол-ве пройденного времени кулдауна. при использовании последнего итема, который исчезает. штраф кд нужно сохранить
-- пройденное текущее время (сколько прошло)
cd_elapsed_time_for_unit = {}
-- оставшее время (сколько осталось)
cd_remaining_time_for_unit = {}
-- установленное время
cd_set_time_for_unit = {}
  • При подборе итема однотипные предметы стэкаются в один слот
  • Можно ли объединить в один стэк в инвентаре при переносе ПКМ
  • Существуют ли ограничения итемов
константы для кд итемов
Решил сделать несколько констант:
константа cd_in_one_slot
cd_in_one_slot = true/false
Применить кд только на один слот после юза итема, или иначе кд запускается у всех однотипных
Если cd_in_one_slot=да (true), то штраф вводится на один предмет, который активировали:
кд после удаления итема
  • Если бы кулдаун распространялся только на предметах, то это было бы логично и просто. Юзнул, кд пошел. В игре часто вижу одноразовые итемы: предмет был одноразовым, герой выпил бутылку, тогда она исчезла бы. Но кулдаун на одноразовых это просто боль. Что делать с этим? у удалившего итема кд должен был исчезнуть. По идее в варкрафте, это решается только общим кулдауном юнита. При подборе нового предмета, кд придется подождать когда откатится кд.
константа cd_is_removed_after_use.
При исчезновении итема кд сохранить на юнита (да/нет). При использовании одноразового итема предмет может исчезать после применении итема, кд можно не сохранять. Работает, если cd_in_one_slot = true. Что делать с кд итема, если оно исчезнет? в таком случае, кд просто не сохраняется
Если cd_in_one_slot=нет (false), то вводим штрафы на все однотипные предметы юнита:
  • Если юзнуть предмет, то все кд однотипные сбрасываются, и запускают новые кд. Используйте константы cooldown_override для настройки параметра, определяющий можно сбрасывать имеющие кд или нет.
  • Если выбросить/удалить предмет, но при этом у него еще не завершился кд. Кд юнита сохраняется (это при условии, что не осталось никаких предметов, пример: герой выпив бутылку => само зелье исчезает). При подборе любого однотипного итема (не важно был у него кд или не был), вас заставят завершить кд юнита.
константа cooldown_override (показывает как взаимодействуют штрафы при использовании)
ooldown_override = 0,1,2. Показывает как изменяются штрафы кд при использовании итема.
  • 0 (0 - дефолт => сброс всех кд). При использовании предмета установить новый общий кд всем однотипам. Работает при cd_in_one_slot=нет
  • 1 (не трогает однотипы с кд: сброс). Тоже самое, что и в первом, но с некоторым отличием: общий кд задаем только однотипам без кд. Однотипы с кд не трогаем. Работает при cd_in_one_slot=нет
  • 2 (добавить новый кд). Всем однотипам прибавляем (не устанавливают, а прибавляют!!) новый кд.
константа cd_stacking_penalties (показывают как взаимодействуют штрафы при получении)
cd_stacking_penalties = 0. Показывает как объединяются штрафы при получении предмета. Работает при cd_in_one_slot=нет.
  • 0 (дефолт => задать подобранному общий кд юнита). Повторяет механику игры. Механика игры такова: Так как у нас распространяется на все однотипные итемы общий кд юнита. Но если такой кд отсутсвует (не запущен), юнит может подобрать предмет с активированным кем-то кд предмета. То у него может пойти кд предмета (не на всех, а только на этом). Но если общий кд юнита запущен, то кд предмета сбрасывается (не важно был тут кд итема или не был, все равно задавют общий кд), и ему задают текущий общий кд.
свойства 0 аргумента
  • при получении однотипного установить общий кд юнита, если он есть. Иначе, можно поставить кд итема, если этот тоже есть.
  • при использовании сбрасывает всем однотипным кд. работает при константе cooldown_override = 0. Иначе при cooldown_override = 1 сброс происходит только у тех однотипных, которых нет кд.
  • при дропе итема запись на хэндл времени как кд итема.
  • 1 (кд юнита добавить при получении). Можно объединить два штрафа: тек штраф юнита, и штраф предмета. Время кд у итема будет больше.
свойства 1 аргумента
  • при получении однотипного сложить общий кд юнита + кд итема => если они конечно есть.
  • использование и дроп повторяет параметры дефолта 0.
  • 2 (кд юнита не распространяет штраф на подобранный, установить кд юнита): подобранному не задают новый штраф только в том случае, если кд на тип итема не запущена, иначе смотрим, чтобы:
свойства 2 аргумента
  • при получении предмета проверяем наличие кд юнита на тип, и наличие других однотипов в инвентаре. Если кд юнита запущен, и есть другие однотипы, то тогда не нужно устанавливать новому штраф. Иначе, если кд юнита запущен, то нет других однотипов => задать новому кд юнита.
  • использование и дроп повторяет параметры дефолта 0.
  • 3 (кд юнита не распространяет штраф на подобранный, сложить кд юнита и итема):
свойства 3 аргумента
  • здесь все тоже самое, что и во 2 варианте. Только сохраняется кд итема. Если запущен кд юнита, то складываются два параметра.
  • can_drop_during_cooldown = false можно ли предмет выкинуть, если кд запущен = да/нет
  • cd_dropped_item_has_timer_disabled = true Кд перестает идти у выброшенного предмета?
Как идея: можно использовать дабл клик (двойной щелчок), который реализует вашу любую задумку. Это тоже хорошая и уникальная возможность для фреймворка. Пример , где в далеком прошлом, я без фреймов пробовал изобрести велосипед. К сожалению, не очень хорошо. С приходом инструментариев в реф, вы сможете легко восполнить этот пробел. Еще помните, что в стандартном инвентаре активные способности итема с прицелом в цель-точку с дабл кликом в сам итем могут вызывать каст в точку кастера. Я сам к сожалению, не внес эту задумку.
Внимание: после выхода патча 1.33 работа триггеров может быть поломана. События наведения сломаны, входа или выхода курсора мыши работают уже не так. Ивент Leave вроде не работает. Ивент Enter периодически каждую сек отображает находится ли курсор внутри. Либо ждать, когда близзард переделают, или самим переделать

Содержание
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
27
2 года назад
0
Рецензия на публикацию
Очень хорошая наработка. 👍
1
37
2 года назад
1
Стоит выделить в отдельную статью
0
27
2 года назад
0
я еще считаю, что как статья оно не готова. буду дорабатывать по ходу. сейчас просто лень. сама наработка инвентаря это просто большая работа.
0
27
1 год назад
0
Перетаскивание ячеек www.hiveworkshop.com/threads/inventory-1-0-2.347464
Чтобы оставить комментарий, пожалуйста, войдите на сайт.