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, вот так:
скриншоты

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

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

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
15
2 месяца назад
0
А можно как-то с помощью Unryze API организовать управление на джойстике?
Ответы (6)
1
20
2 месяца назад
1
DarkLigthing, если совсем делать нечего, то при желании - возможно. Но страдать такой вакханалией я не особо горю. :)
1
37
2 месяца назад
1
Unryze, там у винды есть универсальное апи, но тот же стим позволяет off-game controls, можно и без поддержки геймпада это делать
0
15
2 месяца назад
Отредактирован DarkLigthing
0
Unryze, Да, я понимаю что это маловостребовано ведь в кто играет в Wc3 на джойстиках. Просто сейчас все больше становятся актуальны портативные устройства как Steam Deck и теоретически карты, адаптированные под управление на подобных устройствах могли бы привлечь новых людей в Wc3. (:
0
37
2 месяца назад
0
DarkLigthing, steam deck работает на линуксе, а wine будет жрать аккум как не в себя
0
15
2 месяца назад
Отредактирован DarkLigthing
0
ScorpioT1000, Steam Deck работает на той OS которую ты туда захочешь поставить. Но по дефолту на ней действительно Linux семейства Arch Linux, который Valve адаптировала под свои нужды назвав SteamOS.
А wine это предшественник современной эмуляции, который называется Proton.
На моей деке, которой я уже пользуюсь как единственным пк стоит Windows 11 и батарейка это откровенно не проблема. Вот для портативного устройства x86 архитектура процессора это проблема для батарейки, лучше был бы ARM, но тогда игры с пк не запустились бы... А в целом это просто офигенная штука, для многих игр клавиатура и мышь по моему опыту это избыточность.
0
37
2 месяца назад
0
DarkLigthing, ну, мы же про стим дек для целевой аудитории говорим как стандартный стим ос с линуксом без подключенной зарядке на постоянке, x86 есть и на смартфонах, и кто-то даже ставил туда винду, но это единицы
2
20
2 месяца назад
2
Вышла новая версия!

v1.1.13.210

1. Исправлена внутренняя ошибка Id2S.
	Пометка: эта ошибка ломала Buff API для слк-оптимизированных карт.
5
20
4 недели назад
5
Вышла новая версия!

v1.1.14.214

1. Изменение типов:
	type effect												extends war3image
	type trackable											extends war3image
2. Новые Константы:
	constant abilityintegerfield		ABILITY_IF_BUTTON_POSITION_SPELLBOOK_X						= ConvertAbilityIntegerField('asbx') // Ability Instance only
	constant abilityintegerfield		ABILITY_IF_BUTTON_POSITION_SPELLBOOK_Y						= ConvertAbilityIntegerField('asby') // Ability Instance only
3. Новые Нативные Функции:
	native GetMouseMoveEventScreenAxisEnabled				takes nothing returns boolean
	native SetMouseMoveEventScreenAxisEnabled				takes boolean enable returns nothing // Enables GetTriggerPlayerMouseScreenX/Y, default: on.
	native GetMouseMoveEventWorldAxisEnabled				takes nothing returns boolean
	native SetMouseMoveEventWorldAxisEnabled				takes boolean enable returns nothing // Enables GetTriggerPlayerMouseWorldX/Y/Z, default: off.
	native GetMouseMoveEventDelay							takes nothing returns integer
	native SetMouseMoveEventDelay							takes integer delay returns nothing // delay is in ticks (ms), default: 10
	//
	native IsHandleDestroyed								takes handle whichHandle returns boolean // this returns internal state of the object, whenever it's nullptr or CAgentBaseAbs was removed.
	//
	native GetWar3ImageSprite								takes war3image whichWar3Image returns sprite
	native IsWar3ImageVisible								takes war3image whichWar3Image returns boolean
	native SetWar3ImageVisible								takes war3image whichWar3Image, boolean visible returns nothing
	native IsWar3ImageInvulnerable							takes war3image whichWar3Image returns boolean
	native SetWar3ImageInvulnerable							takes war3image whichWar3Image, boolean invulnerable returns nothing
	native GetWar3ImageX									takes war3image whichWar3Image returns real
	native GetWar3ImageY									takes war3image whichWar3Image returns real
	native GetWar3ImageZ									takes war3image whichWar3Image returns real
	native GetWar3ImagePositionLoc							takes war3image whichWar3Image returns location
	native SetWar3ImagePositionLoc							takes war3image whichWar3Image, location whichLocation returns nothing
	native SetWar3ImagePosition								takes war3image whichWar3Image, real x, real y returns nothing
	native SetWar3ImagePositionWithZ						takes war3image whichWar3Image, real x, real y, real z returns nothing
	native SetWar3ImageX									takes war3image whichWar3Image, real x returns nothing
	native SetWar3ImageY									takes war3image whichWar3Image, real y returns nothing
	native SetWar3ImageZ									takes war3image whichWar3Image, real z returns nothing
	native ResetWar3ImageZ									takes war3image whichWar3Image returns nothing // returns Z control to game.
	native GetWar3ImageHeight								takes war3image whichWar3Image returns real
	native SetWar3ImageHeight								takes war3image whichWar3Image, real height returns nothing
	native GetWar3ImageScreenX								takes war3image whichWar3Image returns real
	native GetWar3ImageScreenY								takes war3image whichWar3Image returns real
	native GetWar3ImageVertexColour							takes war3image whichWar3Image returns integer
	native SetWar3ImageVertexColour							takes war3image whichWar3Image, integer red, integer green, integer blue, integer alpha returns nothing
	native GetWar3ImageTimeScale							takes war3image whichWar3Image returns real
	native SetWar3ImageTimeScale							takes war3image whichWar3Image, real timeScale returns nothing
	native GetWar3ImageScale								takes war3image whichWar3Image returns real
	native SetWar3ImageScale								takes war3image whichWar3Image, real scale returns nothing
	native GetWar3ImageFacing								takes war3image whichWar3Image returns real
	native SetWar3ImageFacing								takes war3image whichWar3Image, real facing, boolean isInstant returns nothing
	native SetWar3ImageMatrixScale							takes war3image whichWar3Image, real x, real y, real z returns nothing
	native ResetWar3ImageMatrix								takes war3image whichWar3Image returns nothing
	native SetWar3ImageOrientationEx						takes war3image whichWar3Image, real yaw, real pitch, real roll, integer eulerOrder returns nothing
	native SetWar3ImageOrientation							takes war3image whichWar3Image, real yaw, real pitch, real roll returns nothing
	native GetWar3ImageYaw									takes war3image whichWar3Image returns real
	native SetWar3ImageYaw									takes war3image whichWar3Image, real yaw returns nothing
	native GetWar3ImagePitch								takes war3image whichWar3Image returns real
	native SetWar3ImagePitch								takes war3image whichWar3Image, real pitch returns nothing
	native GetWar3ImageRoll									takes war3image whichWar3Image returns real
	native SetWar3ImageRoll									takes war3image whichWar3Image, real roll returns nothing
	native GetWar3ImageModelObjectX							takes war3image whichWar3Image, string whichObject returns real
	native GetWar3ImageModelObjectY							takes war3image whichWar3Image, string whichObject returns real
	native GetWar3ImageModelObjectZ							takes war3image whichWar3Image, string whichObject returns real
	native GetWar3ImageModelObjectPositionLoc				takes war3image whichWar3Image, string whichObject returns location
	native GetWar3ImageCurrentAnimationId					takes war3image whichWar3Image returns integer
	native GetWar3ImageCurrentAnimationName					takes war3image whichWar3Image returns string
	native SetWar3ImageAnimationWithRarityByIndex			takes war3image whichWar3Image, integer animIndex, raritycontrol rarity returns nothing
	native SetWar3ImageAnimationWithRarity					takes war3image whichWar3Image, string animationName, raritycontrol rarity returns nothing
	native SetWar3ImageAnimationByIndex						takes war3image whichWar3Image, integer animIndex returns nothing
	native SetWar3ImageAnimation							takes war3image whichWar3Image, string animationName returns nothing
	native QueueWar3ImageAnimationByIndex					takes war3image whichWar3Image, integer animIndex returns nothing
	native QueueWar3ImageAnimation							takes war3image whichWar3Image, string animationName returns nothing
	native GetWar3ImageAnimationOffsetPercent				takes war3image whichWar3Image returns real
	native SetWar3ImageAnimationOffsetPercent				takes war3image whichWar3Image, real percent returns nothing
	//
	native SetAbilityOwningAbility							takes ability whichAbility, ability whichSpellbook returns nothing
	native SetAbilityOwningItem								takes ability whichAbility, item whichItem returns nothing
	//
	native GetFrameBlendMode								takes framehandle whichFrame, integer textureId returns blendmode // 0 for CSimpleRegions.
	native SetFrameBlendMode								takes framehandle whichFrame, integer textureId, blendmode whichBlendMode returns nothing
	native GetFrameHighlight								takes framehandle whichFrame, integer highlightId returns framehandle // Gets highlights of CControl
	native GetFrameHighlightTexture							takes framehandle whichFrame, integer highlightId returns string // If highlighframe type is sent, it will modify itself instead, if ccontrol or its children, then it will check possible highlights.
	native SetFrameHighlightTexture							takes framehandle whichFrame, integer highlightId, string texturePath, blendmode blendMode returns nothing // 0 - FOCUS | 1 - ON HOVER
4. Исправлена GetUnitStringField всегда возвращающая "Default String" с UNIT_SF_HERO_ABILITY_LIST.
5. Исправлена UNIT_SF_ABILITY_LIST всегда возвращающая "Default String" с UNIT_SF_HERO_ABILITY_LIST.
6. GetTriggerPlayerMouseWorldX/Y/Z теперь отключено по стандарту для сохранения 12 байтов нетКода. Используйте SetMouseMoveEventWorldAxisEnabled для того, чтобы включить эту опцию.
7. Исправлена OnCommandBarProcessKey не работающая со спеллбуками.
8. Исправлена обработка TRIGSTR_ в SetTextTagText.
9. Добавлен хук на CGameState::ToHandle.
10. Исправлена критическая ошибка с картами содержащими w3i от версии 1.29 и выше. Критическая ошибка связана с максимальным индексом игрока.
11. SetFramePriority более не работает с CSimpleRegions, так как они не имеют приоритет, а эта функция меняла blendmode.
2
20
3 недели назад
2
Вышла новая версия!

v1.1.14.215

1. Исправлена SetTextTagText не работающая с текстами отличными от TRIGSTR_ из-за предидущего исправления.
2. Исправлена Get/SetBlendMode с CSimpleFontString.
Этот комментарий удален
0
18
3 недели назад
0
Посмотрел тут инструкцию по установке. Не кажется ли, что она довольно громоздкая для аудитории? Особенно для молодых "зумеров", которые выросли на Google play и подобных сервисах, где установка делается в 1 клик? Они, если увидят подобную длинную установку, скажут, "что за кривая хрень" и не станут ничего ставить)) Возможно ли переделать установку так, чтобы после запуска установщика поиск путей, размещение файлов выполнялись сами собой? Плюс в идеале, чтобы заменялись файлы war3 exe и world editor exe на новые, с сохранением путей от ярлыков с рабочего стола? Чтобы юзер мог запускать игру как обычно, как привык, без поиска и запуска дополнительных exe? Я конечно понимаю, что это душно, но вряд-ли понравится, если ujapi будут юзать 3,5 олда (по крайней мере, я за последний год не видел карт на хгм, сделанных с помощью ujapi, максимум одну)
Ответы (2)
0
29
3 недели назад
Отредактирован nazarpunk
0
EugeAl, молодые зумеры и так не смогут пользоваться утилитой ибо там нужно думать через мозг. Коей способностью эволюция их обделила.
0
20
3 недели назад
0
EugeAl, карты есть, но меня это особо не заботит. Установка и так проще некуда, а твоя затея буквально странная… ибо не нужно менять никакие .exe файлы, и вообще ужапи должна ставиться в отдельную папку. 2024 год, тяжело разархивировать файлы в папку (это вся установка) и указать путь к игре/редактору (как-то с Magos люди справлялись). Ну и закончим тем, что вдруг у кого-то несколько сборок (как у меня) и автоматом выберется не та? Да и опять же, можно буквально копипастнуть путь напрямую, а не искать по папкам.
Ну блин, реально несерьёзно как-то заявлять о сложности установки.
0
13
3 недели назад
Отредактирован Borodach
0
И еще, хотя б краткая документация, а то много функций нужно по названию на "ощупь" пробовать как оно работает
Ответы (6)
0
29
3 недели назад
0
Borodach, никто тебя не останавливает. Пощупал функциию - написал статью как ей пользоваться. И самому шпаргалка и комьюнити полезно.
0
20
3 недели назад
0
Borodach, а документация на джасс от Близзард была? Я что-то не помню… а, вспомнил, нет, не было.
И опять же, минимальное знание английского языка - уже служит документацией, но, если ты готов расписать 2000+ нативок, еще и документацией, я готов на это посмотреть.
0
18
3 недели назад
0
nazarpunk, это верно, но им для игры придётся как то ставить утилиту )
Unryze, это для нас проще некуда. Для модмейкера проще некуда. Но обычный игрок совершенно другая категория. Его не заботят технические детали, да и не должны заботиться, его смысл потреблять продукт. Допустим, распаковать в папку с игрой и пользоваться - годится, равно как и установка в 1 клик, но не более. Иначе игрофирмы не делали бы никаких простых установок )
1
29
3 недели назад
1
EugeAl, ну так они играть то не смогут по вышеперечисленной причине.
0
28
1 неделю назад
0
Unryze, то, что Blizzard не создавала доку по жассу, не оправдывает отсутствие документации в этом проекте. Тем более, что jass изначально и не создавался для широкой публики (хотя и в этом случае отсутствие документации осуждаю). А вот в гуи документация +/- имеется.
Я могу посоветовать следующее: при создании новых функций сразу писать документацию к ним, а к старым постепенно добавлять.
0
20
1 неделю назад
0
PT153, ты готов писать описания 2000 нативкам, которые по факту своими именами поясняю то, за что они отвечают? Или я должен работу целой компании (в которой людям ещё и платят) делать в одиночку ещё и за "а мы попросим, но потом не прочитаем". Толку от этого комьюнити, если оно само не хочет ничего делать?
0
28
1 неделю назад
0
native GetHeroMaxLevelExperienceNeeded takes unit whichUnit returns integer
native GetHeroExperienceNeeded takes unit whichUnit, integer forLevel returns integer
Эти функции возвращают exp_required - exp_present или только exp_required? Если второе, то зачем тогда передаётся юнит?
Ответы (5)
0
28
1 неделю назад
0
Тесты показали, что возвращает exp_required, тогда передачу юнита можно убрать, от героя к герою эти значения не меняются.
Также, GetHeroExperienceNeeded возвращает неверные значения. Так, для уровня 1 будет возвращено 200, хотя все герои изначально имеют уровень 1, то есть верный ответ 0. Для уровня 0 и негативных значений также возвращается 200. Для уровня 2 вернётся 500, хотя для достижения второго уровня нужно 200. И так далее, как будто внутри функция увеличивает переданный уровень на единицу.
0
28
1 неделю назад
Отредактирован PT153
0
То, я что ожидаю от функции GetHeroExperienceNeeded:
Значение level <= 1 - возвращает 0.
level = 2 - возвращает 200 или другое значение из таблицы в константах.
level = 3 - 500 или другое значение по формуле/из таблицы.
level = 4 - 900 или другое значение по формуле/из таблицы.
И так далее.
0
20
1 неделю назад
Отредактирован Unryze
0
PT153, GetHeroMaxLevelExperienceNeeded возвращает сколько нужно ещё опыта до достижения уровня.
GetHeroExperienceNeeded - внутри движка требует юнита, чтобы проверить данные и провести пересчёты, ибо юнит может иметь флаг RoC и просчёт опыта будет по-другому.
//----- (6F207760) --------------------------------------------------------
int __stdcall Game::Data::GetExperienceNeededForLevel(int a1)
{
  int v1; // esi
  unsigned int v2; // eax

  v1 = a1;
  v2 = (unsigned int)Engine::Config::ReadInteger((int)"Misc", (int)"MaxHeroLevel", 0) - 1;
  if ( a1 - 1 > v2 )
    v1 = (v2 & ~((a1 - 1) >> 31)) + 1;
  return sub_6F00B0E0(v1 - 1);
}

int __thiscall CUnit::GetLevelExperienceNeeded(uint32_t *this, int a1) // unit, level
{
  int result; // eax

  if ( this[124] )
    result = Game::Data::GetExperienceNeededForLevel(a1);
  else
    result = 0;
  return result;
}
int32_t CUnit::GetHeroExperienceNeeded( CUnit* unit, int32_t level )
{
	return ( pOffsets[ Enum::Offsets::GetHeroXPNeeded ] && CUnit::IsOkay( unit ) && CUnit::IsHero( unit ) && !CUnit::IsTower( unit ) ) ? this_call<int32_t>( pOffsets[ Enum::Offsets::GetHeroXPNeeded ], unit, level ) : NULL;
}
Индексации видать у них под капотом даже для уровней идут с нуля. Ты можешь идти оспаривать эту логику с Blizzard, мои ручки умыты.
Юнита в целом можно убрать, но нужно тогда менять оффсет, а мне немного лень, да и так в целом правильнее~.
0
28
1 неделю назад
0
Unryze, ну индексация если что легко правится и юзером, но почему для 0 и ниже возвращается первое значение?
1
20
6 дней назад
1
PT153, потому что внутри игры функция правит всё на нулевой индекс, посылая 1 -> 0, а ниже 0 правятся до 0.
0
20
21 час назад
Отредактирован Unryze
0
Вышла новая версия!

v1.1.15.218

UjAPI.dll

1. Новые Константы:
	constant frameeventtype				FRAMEEVENT_FRAME_ITEM_CHANGED								= ConvertFrameEventType(10)
	constant controlstyleflag 			CONTROL_STYLE_DRAW											= ConvertControlStyleFlag(32)
2. Новые Нативные Функции:
	native BitwiseShiftLeftLogical							takes integer i, integer bitsToShift returns integer
	native BitwiseShiftRightLogical							takes integer i, integer bitsToShift returns integer
	//
	native CountUnitAbilities								takes unit whichUnit, boolean alsoCountBuffs returns integer
	native CountUnitBuffs									takes unit whichUnit returns integer
	//
	native GetBuffOwningAbility								takes buff whichbuff returns ability // experimental
	native SetBuffOwningAbility								takes buff whichBuff, ability whichAbility returns nothing // experimental
	//
	native SetProjectileSourceAbility						takes projectile whichProjectile, ability whichAbility returns nothing
	//
	native GetFrameChildrenCountEx							takes framehandle whichFrame, integer listId returns integer // listId: CFrames: 0 for default | 1 for layouts (will return CLayer) | CSimpleFrames 0 - 6 | CSimpleRegions any number, as they only have 1 child node.
	native GetFrameChildEx									takes framehandle whichFrame, integer listId, integer index returns framehandle
	native GetFrameTextAlignmentValue						takes framehandle whichFrame, integer id returns real // CSimpleFontString: 0 - x, 1 - y | CTextFrame: 0 - x, 1 - y, 2 - x Shadow, 3 - y Shadow, 4 = FontJustificationOffset
	native SetFrameTextAlignmentValue						takes framehandle whichFrame, integer id, real offset returns nothing
	native GetTriggerFrameTargetFrame						takes nothing returns framehandle
3. Исправлена поддержка отрицательных чисел с сеттерами цифровых полей, ранее они обрабатывались без знака.
4. CListBox API теперь работает с CMenu.
5. CListBox API теперь работает с CPopupMenu.
6. CListBox API теперь работает с CRadioGroup.
7. GetFrameTextColourEx теперь работает с CListBoxItem.
8. SetFrameTextColourEx теперь работает с CListBoxItem.
9. SetFrameFont теперь работает с CTimerTextFrame.
10. SetFrameFont теперь работает с CListBoxItem.
11. SetFrameTextAlignment теперь работает с CTimerTextFrame.
12. SetFrameTextAlignment теперь работает с CListBoxItem.
13. SetFrameTextVerticalAlignment теперь работает с CTimerTextFrame.
14. SetFrameTextVerticalAlignment теперь работает с CListBoxItem.
15. SetFrameTextHorizontalAlignment теперь работает с CTimerTextFrame.
16. SetFrameTextHorizontalAlignment теперь работает с CListBoxItem.
17. FRAMEEVENT_POPUPMENU_ITEM_CHANGED теперь работает с CListBox.
18. AddFrameListItem теперь работает с CRadioGroup.
19. FRAMEEVENT_POPUPMENU_ITEM_CHANGED теперь работает с CRadioGroup.
20. Исправлено SetLightningTargetX устанавливающее x источника, вместо цели.
21. Исправлено SetLightningTargetY устанавливающее y источника, вместо цели.
22. Исправлено SetLightningTargetZ устанавливающее z источника, вместо цели.
23. Исправлено SetLightningTargetPositionLoc устанавливающее позицию источника, вместо цели.
24. Исправлено GroupContainsUnit всегда возвращающее true.
25. Перенесён весь внутренний код jFramea API во FrameAPI. Это пометка для себя, данное изменение не должно повлиять ни на что.
26. Исправлено BlzSetUnitMaxMana устанавливающее максимальное здоровье вместо маны.
27. Исправлено не работающее SetFrameTextHorizontalAlignment.
28. Исправлено SetFrameTextColourEx для CSimpleFontString.

Launcher

1. CLI теперь может обрабатывать эти warcraft 3 комманды: d3d, opengl, swtnl, classic, datadir, gametype, fullscreen.
2. Добавлена опция Dev Mode для AngelScript.
3. Добавлена опция Console для AngelScript.
4. Добавлена опция No Warnings для AngelScript.
5. Добавлена опция "dev" CLI команда для AngelScript.
6. Добавлена опция "console" CLI команда для AngelScript.
7. Добавлена опция "nowarnings" CLI команда для AngelScript.
8. Добавлен модуль FastMenu.dll в Modules.
9. Добавлена опция Fast Menu для Launcher.
10. Добавлена -fastmenu CLI команда для Launcher.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.