UjAPI

Добавлен , опубликован
Лауреат премии 2023 года


Данный ресурс работает ТОЛЬКО с патчами 1.24e/1.26а/1.27a/1.27b/1.28f

Как пользоваться?

  1. Распакуйте все файлы из архива, желательно в отдельную папку, вот так:
скриншоты
  1. Запустите UjAPI.exe.
    • Если же у вас приложение не запускается, то скачайте и установите: .NET Framework 4.7.2.
    • Если же ни в игре, ни в World Editor UjAPI не работает, то скачайте и установите: C++ Redistributable 2012
  2. Установите путь для Warcraft 3, вот так:
скриншоты
  • Можно указать и на Frozen Throne.exe или же на Warcraft III.exe (но рекомендуется использовать именно war3.exe для патчей 1.27б и ниже).
  • На патче 1.28.5(f) рекомендуется использовать непосредственно Warcraft III.exe.
  1. Установите путь для World Editor, вот так:
скриншоты
  • Рекомендуется использовать JNGP версии Прометея: скачать
  • Пароль от архива: JNGP
4.1 Для удобства, добавления подсветки/автозаполнения, скачайте: [UjAPI] TESH Подсветка (спасибо DevilVsLife и Nazarpunk) и просто положите его в папку tesh/data вот так:
скриношоты
  1. Готово, вы можете теперь смело запускать как игру, так и World Editor через UjAPI Launcher.
    • Для использования оконного режима в Warcraft III нажмите галочку на "Additional command line arguments" и в появившееся окно, пропишите -window, вот так:
скриншоты

Полезные файлы

`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Этот комментарий удален
20
Эх, а ведь он ещё индексаторами типов не пользовался. Без спойлеров
31
Unryze, Тогда я не врубаюсь, как писать код ручного перебора, без first of group... Какое условие вешать на цикл и какой объект заносить в локалку? Пример бы.
наверное, как-нибудь так...
выбираешь нужную группу, к примеру через HandleListEnumUnitsInRect
у тебя на руках будет группа HandleList
first of group - это первый элемент листа по индексу [0]
и просто прогоняешь цикл от индекса [0] до [размер HandleList (наверняка есть метод получения размера группы) - 1]
или вон нативка есть.
native HandleListForEach takes handlelist whichHandleList, code c returns nothing
ну это как я понял...
23
Alan_Gu, ну да, похоже на то. Плюс упомянуто выше про Get by index. Только вот последняя нативка, которая HandleListForEach - она как аналог ForGroup - она неудобная в плане того, что туда нельзя загружать аргументы, без хеш таблиц, массивов и глобальных переменных. Поэтому что у неё Функция в виде аргумента.
20
Alan_Gu, ну да, похоже на то. Плюс упомянуто выше про Get by index. Только вот последняя нативка, которая HandleListForEach - она как аналог ForGroup - она неудобная в плане того, что туда нельзя загружать аргументы, без хеш таблиц, массивов и глобальных переменных. Поэтому что у неё Функция в виде аргумента.
HandleListForEach сделан для тех, кому не хочется заниматься переборами и перетасковками. Да и опять же, что мешает сделать код вот так:
local integer size = HandleListGetCount( list )
local integer i = 0
local agent a = null

loop
	exitwhen i == size
	set a = HandleListGetAgentByIndex( list, i )
	
	// действия пройдут по всему списку, и не нужно делать FirstOfList и удалять из группы, чтобы следующий хендл занял его позицию
	
	set i = i + 1
endloop
Зачем усложнять себе жизнь? Я думал это было и так понятно, но видать костыли групп очень вжились. :D
П.С. Я только заметил, что я не добавил именно получение хендла по индексу, добавлю и обновлю в ближайшее время. Хотя на деле agent == handle как я и писал выше, но будет удобнее таки с ними.

Эх, а ведь он ещё индексаторами типов не пользовался. Без спойлеров
Есть методы получения размера определённых типов, что позволит делать одинаковый код по логике и не париться про индексы разных типов в одном листе, надо будет я блин заполню UjAPI тему примерами, чтобы ты уже перестал без понимания "осуждать" то, что реально удобнее, чем ты себе представляешь.
23
Unryze, Спасибо! Теперь понятно)) так костыль группы - это единственная альтернатива фор групп, чтобы передать аргументы каждому юниту, вот и используется)
А примеры - это очень хорошо, чтобы люди имели понимание, как то или другое использовать. Особенно если название функции не совсем понятное на первый взгляд или непонятное.
20
Unryze, Спасибо! Теперь понятно)) так костыль группы - это единственная альтернатива фор групп, чтобы передать аргументы каждому юниту, вот и используется)
Потому я и дал методы, которые позволяют обходить костыли...
А примеры - это очень хорошо, чтобы люди имели понимание, как то или другое использовать. Особенно если название функции не совсем понятное на первый взгляд или непонятное.
Ну, всё следовало примеру групп + расширение их, но видать в виду обилия функций, можно запутаться.
Этот комментарий удален
20
Вышла новая версия! Прокрутить к ресурсу

v1.0.21.85

  1. Новые Константы:
    constant targetflag TARGET_FLAG_SELF = ConvertTargetFlag(4096)
    constant targetflag TARGET_FLAG_PLAYER_UNITS = ConvertTargetFlag(8192)
    constant targetflag TARGET_FLAG_ALLIED = ConvertTargetFlag(16384)
    constant targetflag TARGET_FLAG_FRIEND = ConvertTargetFlag(24576) ALLIED | PLAYER_UNITS
    constant targetflag TARGET_FLAG_NEUTRAL = ConvertTargetFlag(32768)
    constant targetflag TARGET_FLAG_ENEMY = ConvertTargetFlag(65536)
    constant targetflag TARGET_FLAG_NOT_SELF = ConvertTargetFlag(122880) ENEMY | NEUTRAL | FRIEND
    constant targetflag TARGET_FLAG_VULNERABLE = ConvertTargetFlag(1048576)
    constant targetflag TARGET_FLAG_INVULNERABLE = ConvertTargetFlag(2097152)
    constant targetflag TARGET_FLAG_HERO = ConvertTargetFlag(4194304)
    constant targetflag TARGET_FLAG_NON_HERO = ConvertTargetFlag(8388608)
    constant targetflag TARGET_FLAG_ALIVE = ConvertTargetFlag(16777216)
    constant targetflag TARGET_FLAG_DEAD = ConvertTargetFlag(33554432)
    constant targetflag TARGET_FLAG_ORGANIC = ConvertTargetFlag(67108864)
    constant targetflag TARGET_FLAG_MECHANICAL = ConvertTargetFlag(134217728)
    constant targetflag TARGET_FLAG_NON_SUICIDAL = ConvertTargetFlag(268435456)
    constant targetflag TARGET_FLAG_SUICIDAL = ConvertTargetFlag(536870912)
    constant targetflag TARGET_FLAG_NON_ANCIENT = ConvertTargetFlag(1073741824)
    constant targetflag TARGET_FLAG_ANCIENT = ConvertTargetFlag(2147483648)
    constant targetflag TARGET_FLAG_EMPTY = ConvertTargetFlag(4294967295)

    constant abilityrealfield ABILITY_RF_AURA_REFRESH_TIME = ConvertAbilityRealField('artm')
    constant abilityintegerlevelfield ABILITY_ILF_TARGETS_ALLOWED = ConvertAbilityIntegerLevelField('atar')

    constant playerunitevent EVENT_PLAYER_UNIT_ATTACK_FINISHED = ConvertPlayerUnitEvent(317)
    constant unitevent EVENT_UNIT_ATTACK_FINISHED = ConvertUnitEvent(316)
  2. Новые Нативные Функции:
    native IsAbilityTargetAllowed takes ability whichAbility, widget whichWidget returns boolean
    native GetSpecialEffectModelObjectPositionX takes effect whichEffect, string whichObject returns real
    native GetSpecialEffectModelObjectPositionY takes effect whichEffect, string whichObject returns real
    native GetSpecialEffectModelObjectPositionZ takes effect whichEffect, string whichObject returns real
    native GetSpecialEffectModelObjectPositionLoc takes effect whichEffect, string whichObject returns location
    native GetTrackableModelObjectPositionX takes trackable whichTrackable, string whichObject returns real
    native GetTrackableModelObjectPositionY takes trackable whichTrackable, string whichObject returns real
    native GetTrackableModelObjectPositionZ takes trackable whichTrackable, string whichObject returns real
    native GetTrackableModelObjectPositionLoc takes trackable whichTrackable, string whichObject returns location
    native GetWidgetModelObjectPositionX takes widget whichWidget, string whichObject returns real
    native GetWidgetModelObjectPositionY takes widget whichWidget, string whichObject returns real
    native GetWidgetModelObjectPositionZ takes widget whichWidget, string whichObject returns real
    native GetWidgetModelObjectPositionLoc takes widget whichWidget, string whichObject returns location
    native GetDestructableModelObjectPositionX takes destructable whichDestructable, string whichObject returns real
    native GetDestructableModelObjectPositionY takes destructable whichDestructable, string whichObject returns real
    native GetDestructableModelObjectPositionZ takes destructable whichDestructable, string whichObject returns real
    native GetDestructableModelObjectPositionLoc takes destructable whichDestructable, string whichObject returns location
    native GetItemModelObjectPositionX takes item whichItem, string whichObject returns real
    native GetItemModelObjectPositionY takes item whichItem, string whichObject returns real
    native GetItemModelObjectPositionZ takes item whichItem, string whichObject returns real
    native GetItemModelObjectPositionLoc takes item whichItem, string whichObject returns location
    native GetUnitModelObjectPositionX takes unit whichUnit, string whichObject returns real
    native GetUnitModelObjectPositionY takes unit whichUnit, string whichObject returns real
    native GetUnitModelObjectPositionZ takes unit whichUnit, string whichObject returns real
    native GetUnitModelObjectPositionLoc takes unit whichUnit, string whichObject returns location
    native GetProjectileModelObjectPositionX takes projectile whichProjectile, string whichObject returns real
    native GetProjectileModelObjectPositionY takes projectile whichProjectile, string whichObject returns real
    native GetProjectileModelObjectPositionZ takes projectile whichProjectile, string whichObject returns real
    native GetProjectileModelObjectPositionLoc takes projectile whichProjectile, string whichObject returns location
    Frame API
    native GetFrameCheckState takes fremehandle whichFrame returns boolean
    native SetFrameCheckState takes framehandle whichFrame, boolean isCheck returns nothing
    native GetTriggerFrameMouseButton takes nothing returns mousebuttontype
    native RegisterFrameMouseButton takes framehandle whichFrame, mousebuttontype whichButton, boolean isAdd returns nothing
  3. Исправлены CLI команды, которые порой не посылались/приходили с ошибкой.
  4. Исправлена ошибка "дочерних" приложений UjAPI, которая мешала им посылать CLI команды главному приложению.
  5. Исправлена IsTextTagVisible, которая возвращала инверсное значение.
  6. Исправлена CastAbilityTarget вызывающая критическую ошибку при применении на поддерживаемой целевом заклинании.
  7. Переделана SetUnitSelectable, теперь она более не имитирует "смерть", чтобы достигнуть невыделяемого/ненаводимого состояния.
  8. SetFrameTexture теперь работает с CSimpleButton/CCommandButton/CSimpleCheckBox.
  9. CSimpleCheckBox теперь поддерживается, так же добавлена поддержка CLICK/CHECK событий, вместе с RegisterFrameMouseButton.
  10. CONTROL_CLICK и MOUSE_DOUBLECLICK события теперь могут быть применены к CListBoxWar3 фреймам.
  11. Исправлены почти все ABILITY_RLF_ поля, которые имеют цифру в конце их typeId, они теперь должны работать как и задумывалось.
29
native GetFrameCheckState takes fremehandle whichFrame returns boolean
native SetFrameCheckState takes framehandle whichFrame, boolean isCheck returns nothing
Ооо, это что нужно рефе было, но теперь это есть в ujapi ^^
Устанавливать чекстатус.
29
ScorpioT1000, да, они самые, я как-то говорил про них анрайзу, что близзарды не запилили установку чекстатуса заранее.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.