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++ Redistributables 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
20
1 год назад
0
А если помечать в комментариях, то кто будет их читать?
В нормальных ЯП есть аннотации, и IDE сразу начинает варнами сыпать.
Не самый правильный пример, ибо в ЯП есть неймспейсы, которыми можно "выпилить" устаревшие функции и т.д. Во всяких юнити/анриале и т.д. такое не получится сделать без костылей, да и там тоже не церемонятся на эту тему, оповещают на сайте, что будет выпилено и сразу выпиливают.
0
29
1 год назад
0
Во всяких юнити/анриале и т.д. такое не получится сделать без костылей
Ну я вот нагуглил аналог deprecated на С#. Он вроди с коробки есть, зачем костыли?
0
20
1 год назад
0
Во всяких юнити/анриале и т.д. такое не получится сделать без костылей
Ну я вот нагуглил аналог deprecated на С#. Он вроди с коробки есть, зачем костыли?
Ты опять приводишь примеры не связанные с джассом. Метод в С++ тоже можно объявить "устаревшим", а в джассе - это как сделаешь, магией? И ещё раз, когда что-то собираются удалить из движка (речь не об языках), то оно пишется что будет удалено и потом удаляется. Зайди на форум Unreal Engine что ли.
0
29
1 год назад
Отредактирован Волчачка
0
Можно просто сделать библиотеку deprecated.j как костыльный вариант, или написать компилятор куда функциональный чем jasshelper)
cJass
#include "deprecated.cj"
define {
deprecatedFunc(...) = freshFunc(...)
// ...
}
vJass
//!import "D:\\WC3Scripts\\deprecated.j"
library Deprecated
	constant	function deprecatedFunc takes <paremetrs> returns <value | nothing>
		<return|call> freshFunc( <paremetrs> ) | DoNothing()
	endfunction
endlibrary
Свой компилятор:
deprecated japi deprecatedNative1 replaced  freshNative1
deprecated japi deprecatedNative2(p1,p2,p3) replaced  freshNative2(p1,p2)
deprecated japi deprecatedNative3 remove
4
20
1 год назад
4
Вышла новая версия!

v1.0.18.74

  1. Новые Константы:
constant originframetype ORIGIN_FRAME_CURSOR_FRAME = ConvertOriginFrameType(44)
  1. Новые Нативные Функции:
native BitwiseGetBit takes integer number, integer bitIndex returns integer
native BitwiseGetByte takes integer number, integer byteIndex returns integer
native StringCount takes string s, string whichString, boolean caseSensitive returns integer
native StringTrimLeft takes string s, boolean caseSensitive returns string
native StringTrimRight takes string s, boolean caseSensitive returns string
native StringTrim takes string s, boolean caseSensitive returns string
native StringReverse takes string s, boolean caseSensitive returns string
native StringReplace takes string s, string whichString, string replaceWith, boolean caseSensitive returns string
native StringInsert takes string s, string whichString, integer whichPosition, boolean caseSensitive returns string
native GetTriggerSyncPlayer takes nothing returns player this is simply mimicking GetTriggerPlayer, added for simplicity.
native IsTextTagVisible takes texttag whichTextTag returns boolean
native IsTextTagSuspended takes texttag whichTextTag returns boolean
native IsTextTagPermanent takes texttag whichTextTag returns real
native GetTextTagX takes texttag whichTextTag returns real
native SetTextTagX takes texttag whichTextTag, real x returns nothing
native GetTextTagY takes texttag whichTextTag returns real
native SetTextTagY takes texttag whichTextTag, real y returns nothing
native GetTextTagZ takes texttag whichTextTag returns real
native SetTextTagZ takes texttag whichTextTag, real z returns nothing
native GetTextTagHeight takes texttag whichTextTag returns real
native SetTextTagHeight takes texttag whichTextTag, real height returns nothing
native GetTextTagLocation takes texttag whichTextTag returns location
native SetTextTagPositionLocation takes texttag whichTextTag, location whichLocation returns nothing
native GetTextTagColour takes texttag whichTextTag returns integer
native GetTextTagAlpha takes texttag whichTextTag returns integer
native SetTextTagAlpha takes texttag whichTextTag, integer alpha returns nothing
native GetTextTagVelocityX takes texttag whichTextTag returns real
native SetTextTagVelocityX takes texttag whichTextTag, real velX returns nothing
native GetTextTagVelocityY takes texttag whichTextTag returns real
native SetTextTagVelocityY takes texttag whichTextTag, real velY returns nothing
native GetTextTagVelocityZ takes texttag whichTextTag returns real
native SetTextTagVelocityZ takes texttag whichTextTag, real velZ returns nothing
native GetTextTagAge takes texttag whichTextTag returns real
native GetTextTagLifespan takes texttag whichTextTag returns real
native GetTextTagFadepoint takes texttag whichTextTag returns real
native GetTextTagShadowColour takes texttag whichTextTag returns integer
native SetTextTagShadowColour takes texttag whichTextTag, integer colour returns nothing
native GetTextTagShadowAlpha takes texttag whichTextTag returns integer
native SetTextTagShadowAlpha takes texttag whichTextTag, integer alpha returns nothing
native GetTextTagText takes texttag whichTextTag returns string
  1. Добавлены недостающие константы из предыдущей версии.
  2. Версия UjAPI теперь прописывается в главном меню Warcraft.
  3. Добавлена опция "Load Library" в главную секцию. Это включает/выключает подгрузку UjAPI.mpq и нативных функций.
Пометка: эта опция по стандарту включена и смена этой опции на уже запущенном Warctaft не будет работать.
  1. Добавлена опция "Load Library" для секции LUA. Это включает/выключает подгрузку библиотеки war3_lua.dll.
Пометка: эта опция по стандарту выключена и смена этой опции на уже запущенном Warctaft не будет работать.
  1. Добавлена "CLI" обработка в UjAPI, теперь каждый последующий запуск приложения UjAPI будет просто на просто отправлять аргументы запуска в уже запущенное приложение.
Пример 1: "D:\Files\Work Files\Programming\uJAPI\Release\UjAPILauncher.exe" -ujapi "dev" -lua "dev console nowarnings" -multiwindow -window -loadfile "Maps\Test\WorldEditTestMap.w3x"
Пометка 1: Это выполнит UjAPI и включит его режим разработчика, а так же включит луа с заданными к ней параметрами, игра будет в мультиоконном режиме и в режиме окна. Затем будет запущена карта заданная в loadfile аргументе.
Пример 2 (полный): "D:\Files\Work Files\Programming\uJAPI\Release\UjAPILauncher.exe" -ujapi "dev" -lua "dev console nowarnings" -multiwindow -window -launch "Warcraft" -gamepath "D:\Games\Warcraft III TFT\war3.exe" -loadfile "Maps\Test\WorldEditTestMap.w3x"
Пометка 2: Это выполнит всё, что описано в Примере 1, однако если присутствуют (-gamepath или -editorpath) оно также "переопределит" путь игры/редактора основываясь на аргументах поданных в них.
  1. CLI команды:
Пометка: пояснения команд будут в скобочках, вот так - (информация).
-justdoupdate (просто на просто выполнит форсированное скачивание последней версии и выполнит автообновление UjAPI, остальные команды будут проигнорированы).
-ujapi (даёт возможность переопределения некоторых базовых настроек UjAPI, пример: -ujapi "dev"), "" (кавычки) обязательны!
noload (отключает подгрузку UjAPI.mpq и UjAPI нативных функций).
dev (включает режим разработчика, который также включит консоль).
-lua (даёт возможность переопределения некоторых базовых настроек war3_lua.dll, пример: -lua "dev console nowarnings"), "" (кавычки) обязательны!
dev (включает режим разработчика).
console (включает консоль для луа ошибок и так далее).
nowarnings (отключает некоторые внутренние ошибки типов).
-multiwindow (включает режим Multi-Window и загружает необходимый модуль).
-window (запустит приложение в оконном режиме).
-launch (даёт возможность переопределения/указания пути для запуска игры или редактора, по стандарту будет запускаться игра, пример: -launch "Editor"), "" (кавычки) обязательны!
-gamepath (переопределяет и использует путь игры заданный в UjAPI Launcher, пример: -gamepath "D:\Games\Warcraft III TFT\war3.exe"), "" (кавычки) обязательны!
-editorpath (переопределяет и использует путь редактора заданный в UjAPI Launcher, пример: -editorpath "D:\Programs\WC3 Tools\JNPG-R1.4-Prometheus-Edition\NewGen WE.exe"), "" (кавычки) обязательны!
-loadfile (повторяет 1 в 1 метод запуска карт, путь до карты для игры ВСЕГДА относителен пути игры, однако для редактора нужно указывать ПОЛНЫЙ путь до карты).
  1. Добавлена -loadfile команда для секции World Editor, однако путь до карты НЕ относителен пути игры, нужно указывать полный путь до карты.
  2. Добавлена опция "Load Library" в секции World Editor.
  3. Добавлена опция "Dev Mode" в секции World Editor.
Пометка: #10 и #11 работают точно так же как такие же опции в Warcraft 3.
2
20
1 год назад
Отредактирован Unryze
2
Вышла новая версия!

v1.0.18.75

  1. Исправлены проблемы с полноэкранным режимом запуска игры.
2
31
2
у меня BlzSetUnitName фаталит.
0
20
1 год назад
Отредактирован Unryze
0
у меня BlzSetUnitName фаталит.
Почти все эти функции фаталят, знаю. Это уже исправлено в будущей версии, думаю сегодня загружу. (Точнее функции, которые редактируют поля, а не прямо все-все).
1
20
1 год назад
1
Вышла новая версия!

v1.0.19.78

  1. Новые Типы:
    type jassthread extends handle
  2. Новые Константы:
    constant widgetevent EVENT_WIDGET_DAMAGING = ConvertWidgetEvent(400)
    constant widgetevent EVENT_WIDGET_DAMAGED = ConvertWidgetEvent(401)
    constant abilityreallevelfield ABILITY_RLF_CAST_BACK_SWING = ConvertAbilityRealLevelField('acbs')
    constant abilityreallevelfield ABILITY_RLF_CAST_POINT = ConvertAbilityRealLevelField('acpt')
    constant unitintegerfield UNIT_IF_AGILITY_BONUS = ConvertUnitIntegerField('uag+') Get Only
    constant unitintegerfield UNIT_IF_INTELLIGENCE_BONUS = ConvertUnitIntegerField('uin+') Get Only
    constant unitintegerfield UNIT_IF_STRENGTH_BONUS = ConvertUnitIntegerField('ust+') Get Only
    constant unitrealfield UNIT_RF_HEALTH_FROM_BONUS_STRENGTH = ConvertUnitRealField('uhs+') Get Only
    constant unitrealfield UNIT_RF_MANA_FROM_BONUS_INTELLIGENCE = ConvertUnitRealField('umi+') Get Only
    constant unitrealfield UNIT_RF_DEFENSE_BONUS = ConvertUnitRealField('udf+') Get Only
    constant unitrealfield UNIT_RF_SPEED_BONUS = ConvertUnitRealField('umv+') Get Only
    constant unitweaponintegerfield UNIT_WEAPON_IF_ATTACK_DAMAGE_BONUS = ConvertUnitWeaponIntegerField('ud1+') Get Only | this is the + (Green) or - (Red) value next to attack.
    constant unitweaponrealfield UNIT_WEAPON_RF_ATTACK_SPEED_BONUS = ConvertUnitWeaponRealField('us1+') Get Only
  3. Новые Нативные Функции:
    Jass VM Natives
    native GetJassMainThread takes nothing returns jassthread
    native GetJassCurrentThread takes nothing returns jassthread
    native RunJassScriptEx takes string parentScriptFile, string helperScriptFile, string jassScriptFile returns jassthread
    native RunJassScript takes string helperScriptFile, string jassScriptFile returns jassthread
    native RunJassScriptSimple takes string jassScriptFile returns jassthread
    native StopJassThread takes jassthread thread returns boolean
    native GetJassGlobalInteger takes jassthread thread, string variableName returns integer
    native GetJassGlobalReal takes jassthread thread, string variableName returns real
    native GetJassGlobalString takes jassthread thread, string variableName returns string
    native GetJassGlobalHandle takes jassthread thread, string variableName returns handle
    native GetJassGlobalBoolean takes jassthread thread, string variableName returns boolean
    native SetJassGlobalInteger takes jassthread thread, string variableName, integer value returns boolean
    native SetJassGlobalReal takes jassthread thread, string variableName, real value returns boolean
    native SetJassGlobalString takes jassthread thread, string variableName, string value returns boolean
    native SetJassGlobalHandle takes jassthread thread, string variableName, handle value returns boolean
    native SetJassGlobalBoolean takes jassthread thread, string variableName, boolean value returns boolean

    native GetWidgetModel takes widget whichWidget returns string
    native TriggerRegisterWidgetEvent takes trigger whichTrigger, widget whichWidget, widgetevent whichWidgetEvent returns event
    native SetSpecialEffectPlayerColour takes effect whichEffect, playercolor color returns nothing
    native SetSpecialEffectMaterialTexture takes effect whichEffect, string textureName, integer materialId, integer textureIndex returns nothing
    native SetSpecialEffectTexture takes effect whichEffect, string textureName, integer textureIndex returns nothing
    native SetSpecialEffectReplaceableTexture takes effect whichEffect, string textureName, integer textureIndex returns nothing
    native SetTrackablePlayerColour takes trackable whichTrackable, playercolor color returns nothing
    native SetMissilePlayerColour takes missile whichMissile, playercolor color returns nothing
    native SetMissileMaterialTexture takes missile whichMissile, string textureName, integer materialId, integer textureIndex returns nothing
    native SetMissileTexture takes missile whichMissile, string textureName, integer textureIndex returns nothing
    native SetMissileReplaceableTexture takes missile whichMissile, string textureName, integer textureIndex returns nothing
    native SetFrameSpritePlayerColour takes framehandle whichFrame, playercolor color returns nothing
    native GetFrameSpriteAlpha takes framehandle whichFrame returns integer
    native SetFrameSpriteMaterialTexture takes framehandle whichFrame, string textureName, integer materialId, integer textureIndex returns nothing
    native SetFrameSpriteTexture takes framehandle whichFrame, string textureName, integer textureIndex returns nothing
    native SetFrameSpriteReplaceableTexture takes framehandle whichFrame, string textureName, integer textureIndex returns nothing
    native GetUnitInSelectionByIndex takes player whichPlayer, integer index returns unit
    native GetLastUnitInSelection takes player whichPlayer returns unit
  4. UNIT_IF_INTELLIGENCE теперь возвращает правильное значение.
  5. Добавлены эти поля во внутренний обработчик Get/SetUnitField:
    UNIT_IF_AGILITY_PERMANENT
    UNIT_IF_INTELLIGENCE_PERMANENT
    UNIT_IF_STRENGTH_PERMANENT
    UNIT_IF_AGILITY_WITH_BONUS
    UNIT_IF_INTELLIGENCE_WITH_BONUS
    UNIT_IF_STRENGTH_WITH_BONUS
  6. Добавлены эти поля во внутренний обработчик GetUnitField:
    UNIT_IF_AGILITY_BONUS
    UNIT_IF_INTELLIGENCE_BONUS
    UNIT_IF_STRENGTH_BONUS
    UNIT_RF_HEALTH_FROM_BONUS_STRENGTH
    UNIT_RF_MANA_FROM_BONUS_INTELLIGENCE
    UNIT_RF_DEFENSE_BONUS
    UNIT_RF_SPEED_BONUS
    UNIT_WEAPON_IF_ATTACK_DAMAGE_BONUS
    UNIT_WEAPON_RF_ATTACK_SPEED_BONUS
  7. Исправлено GetTriggerFrame возвращающее всегда null.
  8. BlzSetSpecialEffectColorByPlayer теперь закрашивает временные(командные) текстуры, как оно и должно было.
  9. Исправлена критическая ошибка со всеми BlzSetField.
  10. ABILITY_ILF_TARGET_TYPE добавлена во внутренний обработчик SetAbilityField.
  11. Исправлена критическая ошибка от ORIGIN_FRAME_BUFF_BAR_INDICATOR, добавлена проверка действительности, так как игра не создаёт сразу все индикаторы.
    Пояснение: игра по стандарту создаёт лишь 1 индикатор, затем, когда у игры нет "свободных" индикаторов, она создаёт ещё 1 вплоть до 7.
  12. Исправлены некоторые "опечатки" среди OSKEY_ переменных, причиной послужила моя мышка, которая устраивает дабл клик, потому при табуляциях, часть букв была удалена/заменена и так далее.
  13. Исправлено Missile API, оно "перестало работать" после поспешных исправлений/переделок.
  14. Исправлены BUFF_SF поля, теперь они возвращают реальное значение, а не "<null>".
  15. Добавлены эти поля Заклинаний во внутренний обработчик Get/SetAbilityField:
    ABILITY_RLF_CASTING_TIME
    ABILITY_RLF_CAST_BACK_SWING
    ABILITY_RLF_CAST_POINT.
0
18
1 год назад
0
Unryze, а что делает jassthread? Не совсем понимаю, для чего он и его нативки.
0
19
1 год назад
0
EugeAl, можешь свои потоки создавать. Что это даёт? Ну, допустим ты сможешь разбить код карты на несколько скриптов, а потом подключать их по-отдельности. Надеюсь, я правильно всё понял.
0
18
1 год назад
0
Ev3nt, а, понял. Только не понятно, зачем. Другое дело, если бы создавать внешний файл с кодом, типа bj, это да, имеет смысл. Особенно для кампаний.
1
20
1 год назад
1
EugeAl, это что то для тех, кто работал с прелоадом
2
20
1 год назад
2
EugeAl, можешь свои потоки создавать. Что это даёт? Ну, допустим ты сможешь разбить код карты на несколько скриптов, а потом подключать их по-отдельности. Надеюсь, я правильно всё понял.
Всё верно.
EugeAl:
Ev3nt, а, понял. Только не понятно, зачем. Другое дело, если бы создавать внешний файл с кодом, типа bj, это да, имеет смысл. Особенно для кампаний.
Позволяет сделать пресеты (отдельно живущий код и т.д.) и не захламлять общий код, подгрузил нужный скрипт, выполнил - отключил когда нужно.
По большей части я это добавил для избавления от косого прелоада ну и просто потому, что могу (а если точнее, чего добру пропадать?)
EugeAl, это что то для тех, кто работал с прелоадом
Угу.
0
13
1 год назад
0
BlzFrameGetChild(ORIGIN_FRAME_COMMAND_BAR, 0) и GetFrameChild(ORIGIN_FRAME_COMMAND_BAR, 0) ссылается на фрейм(расположение кнопки) х3 у2, а не х3 у3. х3 у3 не видно никаким индексом в диапазоне от -1 до 11.
OSKEY_LEFT и RIGHT, UP, DOWN не работают, но так понимаю в 1.19.78 работает.Обновление в дискорде и гитхабе нет, а с сайта блочит вирус( отключал антивирус и брандмауэр). Windows 7
0
29
1 год назад
0
Borodach, ты имеешь ввиду индексацию с единицы?

но так понимаю в 1.19.78 работает.Обновление в дискорде и гитхабе нет
Как это нет? Попробуй скриптом из этой статьи скачать.
0
20
1 год назад
0
BlzFrameGetChild(ORIGIN_FRAME_COMMAND_BAR, 0) и GetFrameChild(ORIGIN_FRAME_COMMAND_BAR, 0) ссылается на фрейм(расположение кнопки) х3 у2, а не х3 у3. х3 у3 не видно никаким индексом в диапазоне от -1 до 11.
Диапазон начинается от 0 (откуда вообще -1?) и внутренний код, который используется для получения кнопок используется во ВФЕ, там как-то проблем с этим не наблюдалось, собственно...)
OSKEY_LEFT и RIGHT, UP, DOWN не работают, но так понимаю в 1.19.78 работает.Обновление в дискорде и гитхабе нет, а с сайта блочит вирус( отключал антивирус и брандмауэр). Windows 7
Что значит не работают? Все кнопки работают и их код не был тронут. Эта версия и есть в данный момент последняя, и на гитхабе она тоже лежит.
0
13
1 год назад
0
Нашел "кнопку" обновления. И сейчас при установке флажка "LoadLibrary" крашит варкрафт. Путь на war3.exe указан.
Если не стоит, то карта не открывается с одной глобальной
framehandle Frame
0
29
1 год назад
0
Borodach, чует моё сердце, такое название зарезервировано.
0
13
1 год назад
Отредактирован Borodach
0
Название примерное, смысл что любые "доп. услуги" из UJAPI не откроют карту.
0
20
1 год назад
Отредактирован Unryze
0
BlzFrameGetChild(ORIGIN_FRAME_COMMAND_BAR, 0) и GetFrameChild(ORIGIN_FRAME_COMMAND_BAR, 0) ссылается на фрейм(расположение кнопки) х3 у2, а не х3 у3. х3 у3 не видно никаким индексом в диапазоне от -1 до 11.
И да, забыл добавить, Y2 ограничение имеет, откуда Y3? Напоминаю, что столбов (X) 4 (0-3) а строк (Y) 3 (0-2). И получается 4 * 3 = 12 (11 индекс). А ты хочешь получить 4 * 4 = 16ый индекс, вопрос откуда и куда.
Borodach:
Название примерное, смысл что любые "доп. услуги" из UJAPI не откроют карту.
Краш лог в студию, я не могу угадать что и как может крашить, когда у других пользователей такой проблемы нет. Ну и версию варкрафта - тоже гадать не особо хочется.
0
13
1 год назад
0
И да, забыл добавить, Y2 ограничение имеет, откуда Y3? Напоминаю, что столбов (X) 4 (0-3) а строк (Y) 3 (0-2). И получается 4 * 3 = 12 (11 индекс). А ты хочешь получить 4 * 4 = 16ый индекс, вопрос откуда и куда.
Я ошибся с обозначением х,у. Позиция х2 и у2 = Child(0). -1 индекс указал чисто проверить, думал если Child(0) = x2;y2 и Child(10) = x0;y0 то -1 может быть x3;y2
ОШИБКА
This application has encountered a critical error:

FATAL ERROR!

Program:	D:\Games\WarCraft3\Warcraft 3 Frozen Throne\war3.exe
Exception:	0xC0000005 (ACCESS_VIOLATION) at 0023:0222279A

The instruction at '0x0222279A' referenced memory at '0x00000010'.
The memory could not be 'read'. 
0
20
1 год назад
0
-1 не может быть ни в каком случае, акстись.
0
14
1 год назад
Отредактирован host_pi
0
Unryze
Планируется ли поддержка карт, для которых требуется JN Loader ?
Например карты от корейца z1z1z1 (скачка карт ниже) - он делает уникальные интересные карты, при этом всегда они многопользовательские. т.е. заточены на командную работу. и т.к. ирина их не поддерживает - остается только один вариант RadminVPN, но там пинг очень плохой (если много игроков). Поэтому идеальным вариантом была бы поддержка JN карт на ирине.
Как это проще сделать?
  1. переписывать все нативки или
  2. может как то можно подключить dll от JN лоадера? может быть в UjAPILauncher.exe можно добавить путь к папке JN лоадера и он его как посредник подключит через себя к ирине?
  3. или может быть Kirill78 и Kokomi смогут прикрутить JN Loader к ирине? Чтобы запускать через JN loader.exe и справа от создания карты выбрать что-то типа "JN"
Мы уже 2 или 3 года играем в карты от z1z1z1, и последнее время он делает только для JN, в которые нипаиграть на ирине с нормальным пингом. При этом мы всегда покупаем випку на всю команду и приходится играть в его карты старых версий "до-JN" эпохи
Также есть и другие игроки, так называемые "игроки в корейские RPG", которые тоже играют через JN loader в корейские карты
Вот пример карт от z1z1z1 (Скачивать карты на синюю кнопку):
  1. m16tool.xyz/Game/8BitRaidId - 8 BIT RAID - кооперативный 2D платформер с убийством боссов
  2. m16tool.xyz/Game/OM150/Main/Main - 주황버섯의 소개팅 - Orange Mushroom Story Blind Date - 2D action головоломки
  3. m16tool.xyz/Game/DM/Main/Main - Death Maze - 3D хоррор лабиринт
или все 3 карты одной ссылкой www.mediafire.com/?59w9pnbo4wwk845 (тут есть скриншоты карт, по которым можно убедиться в их уникальности и непохожести на обычные карты для варкрафта)
  1. JN Loader (только для warcraft 1.28.5.7680 + multifont) github.com/BlacklightsC/JassNative/releases/latest/download/JNLo... или m16.pw
я вчера проверял все 3 карты на UjAPI 1.0.19.78 - ни одна не запустилась, карта не инициализировалась и не дошла до выбора команд в лобби (а с JN loader они конечно же запускаются прекрасно)
0
20
1 год назад
0
JN использует слишком много небезопасных нативок, множество из них необходимы для карт, потому полной поддержки не будет, это слишком муторно и не принесёт буквально никакой пользы. Из JN полноценно поддерживаются лишь эти нативки:
BitOr
BitAnd
BitXor
BitShiftL
BitShiftR
JNI2R
JNR2I
JNGetMaxAttackSpeed
IsReplayMode
IsHostPlayer
JNStringPos
JNStringReverse
JNStringTrim
JNStringTrimStart
JNStringTrimEnd
JNStringCount
JNStringContains
JNStringReplace
JNStringInsert
JNStringSub
JNStringLength
Говоря проще, JN поддержку я наверное даже уберу, ибо от неё больше проблем, чем пользы ибо 99% карт использует банально небезопасные функции, некоторые даже используют JNProcessStart и JNGetModuleHandle (это очень-очень опасные штуки, которые если же в МемХаке ещё как-то ограничены, то на С++ стороне можно сделать много неприятных приколов).
Потому правильнее будет переписать карту, ибо всё что с Dz и даже больше UjAPI умеет и возможностей куда больше чем на обеих платформах вместе взятых, да и в новой версии будет ещё больше функционала.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.