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

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

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

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Этот комментарий удален
23
Посмотрел тут инструкцию по установке. Не кажется ли, что она довольно громоздкая для аудитории? Особенно для молодых "зумеров", которые выросли на Google play и подобных сервисах, где установка делается в 1 клик? Они, если увидят подобную длинную установку, скажут, "что за кривая хрень" и не станут ничего ставить)) Возможно ли переделать установку так, чтобы после запуска установщика поиск путей, размещение файлов выполнялись сами собой? Плюс в идеале, чтобы заменялись файлы war3 exe и world editor exe на новые, с сохранением путей от ярлыков с рабочего стола? Чтобы юзер мог запускать игру как обычно, как привык, без поиска и запуска дополнительных exe? Я конечно понимаю, что это душно, но вряд-ли понравится, если ujapi будут юзать 3,5 олда (по крайней мере, я за последний год не видел карт на хгм, сделанных с помощью ujapi, максимум одну)
Ответы (2)
30
EugeAl, молодые зумеры и так не смогут пользоваться утилитой ибо там нужно думать через мозг. Коей способностью эволюция их обделила.
20
EugeAl, карты есть, но меня это особо не заботит. Установка и так проще некуда, а твоя затея буквально странная… ибо не нужно менять никакие .exe файлы, и вообще ужапи должна ставиться в отдельную папку. 2024 год, тяжело разархивировать файлы в папку (это вся установка) и указать путь к игре/редактору (как-то с Magos люди справлялись). Ну и закончим тем, что вдруг у кого-то несколько сборок (как у меня) и автоматом выберется не та? Да и опять же, можно буквально копипастнуть путь напрямую, а не искать по папкам.
Ну блин, реально несерьёзно как-то заявлять о сложности установки.
18
И еще, хотя б краткая документация, а то много функций нужно по названию на "ощупь" пробовать как оно работает
Ответы (6)
30
Borodach, никто тебя не останавливает. Пощупал функциию - написал статью как ей пользоваться. И самому шпаргалка и комьюнити полезно.
20
Borodach, а документация на джасс от Близзард была? Я что-то не помню… а, вспомнил, нет, не было.
И опять же, минимальное знание английского языка - уже служит документацией, но, если ты готов расписать 2000+ нативок, еще и документацией, я готов на это посмотреть.
23
nazarpunk, это верно, но им для игры придётся как то ставить утилиту )
Unryze, это для нас проще некуда. Для модмейкера проще некуда. Но обычный игрок совершенно другая категория. Его не заботят технические детали, да и не должны заботиться, его смысл потреблять продукт. Допустим, распаковать в папку с игрой и пользоваться - годится, равно как и установка в 1 клик, но не более. Иначе игрофирмы не делали бы никаких простых установок )
30
EugeAl, ну так они играть то не смогут по вышеперечисленной причине.
28
Unryze, то, что Blizzard не создавала доку по жассу, не оправдывает отсутствие документации в этом проекте. Тем более, что jass изначально и не создавался для широкой публики (хотя и в этом случае отсутствие документации осуждаю). А вот в гуи документация +/- имеется.
Я могу посоветовать следующее: при создании новых функций сразу писать документацию к ним, а к старым постепенно добавлять.
20
PT153, ты готов писать описания 2000 нативкам, которые по факту своими именами поясняю то, за что они отвечают? Или я должен работу целой компании (в которой людям ещё и платят) делать в одиночку ещё и за "а мы попросим, но потом не прочитаем". Толку от этого комьюнити, если оно само не хочет ничего делать?
28
native GetHeroMaxLevelExperienceNeeded takes unit whichUnit returns integer
native GetHeroExperienceNeeded takes unit whichUnit, integer forLevel returns integer
Эти функции возвращают exp_required - exp_present или только exp_required? Если второе, то зачем тогда передаётся юнит?
Ответы (5)
28
Тесты показали, что возвращает exp_required, тогда передачу юнита можно убрать, от героя к герою эти значения не меняются.
Также, GetHeroExperienceNeeded возвращает неверные значения. Так, для уровня 1 будет возвращено 200, хотя все герои изначально имеют уровень 1, то есть верный ответ 0. Для уровня 0 и негативных значений также возвращается 200. Для уровня 2 вернётся 500, хотя для достижения второго уровня нужно 200. И так далее, как будто внутри функция увеличивает переданный уровень на единицу.
28
То, я что ожидаю от функции GetHeroExperienceNeeded:
Значение level <= 1 - возвращает 0.
level = 2 - возвращает 200 или другое значение из таблицы в константах.
level = 3 - 500 или другое значение по формуле/из таблицы.
level = 4 - 900 или другое значение по формуле/из таблицы.
И так далее.
20
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, мои ручки умыты.
Юнита в целом можно убрать, но нужно тогда менять оффсет, а мне немного лень, да и так в целом правильнее~.
28
Unryze, ну индексация если что легко правится и юзером, но почему для 0 и ниже возвращается первое значение?
20
PT153, потому что внутри игры функция правит всё на нулевой индекс, посылая 1 -> 0, а ниже 0 правятся до 0.
20
Вышла новая версия! Прокрутить к ресурсу

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.
35
Запустили конкурс наработок xgm.guru/p/ujapi/ujapi-konkurs-narabotok-2024 вливайтесь
3
Мне нравится эта идея.
Проект может решить проблему ванильного варкрафта с недостающим функционалом.
Надеюсь у автора не опустятся руки.
Для развития проекта неплохо бы сделать подробную документацию по функциям. Так как отсутствие таковой отталкивает новичков, а старички рано или поздно закончатся.
Ответы (2)
30
Для развития проекта неплохо бы сделать подробную документацию по функциям.
Никто тебя не останавливает.
3
nazarpunk,
Я не знаю, всегда ли ты так пишешь\писал - но твои сообщения очень странные.
  1. Я не жаловался, что меня кто-то останавливает.
Но, скорее всего, у тебя такая манера общения, которую я могу назвать бескультурной\провокационной. И на самом деле, ты имел в виду это "Если у тебя есть желание, то ты можешь сделать это. Мы бы были тебе благодарны!".
Если это так, то на это я уже ответил, вот тут "Для развития проекта неплохо бы сделать подробную документацию по функциям. Так как отсутствие таковой отталкивает новичков, а старички рано или поздно закончатся.".
  1. Я новичок, который 3 дня тыкается в документацию и у него с трудом получается что-либо.
Я тот, кому нужна помощь, а не тот, кто может оказать её (по крайней мере в оформлении документации я точно не могу помочь).
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.