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
20
1 год назад
0
EugeAl, мы смотрим сейчас взглядом функциональщика. Возьмем пример nazarpunk. К примеру у нас есть абилка огненный вихрь сян лин (вокруг персонажа крутится обруч, который наносит урон при пересечении с персонажами). По большому счету нам все равно что вокруг кастера крутить - юнит, эффект, или хоть texttag. Так вот при инициальзации абилки вместо конкретной реализации можно передать как параметр Point. Способность будет пользоваться переданным инстансом Point чтобы толкать его вокруг кастера. А уже конкретная реализация этих методов будет взаимодействовать с игрой, вызывая нужные методы с нужными параметрами
2
20
1 год назад
Отредактирован Unryze
2

v1.0.12.58

  1. Новые Константы:
constant integer CHAT_RECIPIENT_ALL = 0
constant integer CHAT_RECIPIENT_ALLIES = 1
constant integer CHAT_RECIPIENT_REFEREES = 2
constant integer CHAT_RECIPIENT_OBSERVERS = 2
constant integer CHAT_RECIPIENT_PRIVATE = 3
constant unitweaponintegerfield UNIT_WEAPON_IF_ATTACKS_ENABLED = ConvertUnitWeaponIntegerField('uaen')
  1. Новые Нативные Функции:
native DisplayChatMessage takes player whichPlayer, integer recipient, string message returns nothing
native DisplayTimedChatMessage takes player whichPlayer, integer recipient, string message, real duration returns nothing
native SetSpecialEffectAnimationOffsetPercent takes effect whichEffect, real percent returns boolean
native SetTrackableAnimationOffsetPercent takes trackable whichTrackable, real percent returns boolean
native SetWidgetAnimationOffsetPercent takes widget whichWidget, real percent returns boolean
native SetDestructableAnimationOffsetPercent takes destructable whichDestructable, real percent returns boolean
native SetItemAnimationOffsetPercent takes item whichItem, real percent returns boolean
native SetUnitAnimationOffsetPercent takes unit whichUnit, real percent returns boolean
native SetMissileAnimationOffsetPercent takes missile whichMissile, real percent returns boolean
  1. SetFrameSpriteAnimationOffset изменена на SetFrameSpriteAnimationOffsetPercent.
  2. Исправлены все нативные функции связанные с "таблицами", они все были нерабочими.
  3. Исправлена критическая ошибка при выходе/перезагрузке карты когда какой-либо фрейм был создан через нативные функции CreateFrame, CreateSimpleFrame и CreateFrameByType с дублированием contextId.
    Пояснение: это значит, что если Вы создали фрейм вот так: CreateFrame( "SomFrame", gameUI, 0, 0 ) и создадите фрейм ещё раз через CreateFrame( "SomFrame", gameUI, 0, 0 ), то оно на деле "выкинет" предыдущий фрейм, однако этой проблемы больше нет.
0
37
1 год назад
Отредактирован ScorpioT1000
0
nazarpunk, плохой пример. Тут как раз аггрегация должна быть. Точек у юнита может быть много для разных целей

Интерфейс - это контракт в первую очередь. Когда мы пишем функционал для применения в различных ситуациях, описываем контракты, по которым функционал заявляет свою работу
Виджет мог бы таким послужить, если бы близзы не реализовывали функции-клоны для наследников виджета. А раз реализовали - значит, они отличаются и это не очень похоже на наследование/реализацию
1
20
1 год назад
1
nazarpunk, плохой пример. Тут как раз аггрегация должна быть. Точек у юнита может быть много для разных целей

Интерфейс - это контракт в первую очередь. Когда мы пишем функционал для применения в различных ситуациях, описываем контракты, по которым функционал заявляет свою работу
Виджет мог бы таким послужить, если бы близзы не реализовывали функции-клоны для наследников виджета. А раз реализовали - значит, они отличаются и это не очень похоже на наследование/реализацию
Не совсем так с виджетами. Просто у юнитов есть больше данных, нежели у разрушаемых и предметов (они используют CSpriteMini), но большая часть функционала идентична. Потом я и добавил целый пак виджетАПИ, который фактически объединяет всё нужное/общее, если лень типизировать. Но до реального интерфейса там кот наплакал... :(
0
18
1 год назад
0
Kokomi, ну если посмотреть на этот пример, то получается, что в функции типа interface можно добавить в виде аргумента другую функцию типа interface, а в функцию типа method можно добавить обычные функции. Что то вроде call Execute Func, куда можно любую строку вставить, и создать базу функций в виде string массива. Но вообще, по честному говоря, я запутался. Слишком тяжело, имхо, разбираться во всех этих наворотах, да и ошибиться намного легче...
0
20
1 год назад
0
EugeAl, это не функция типа интерфейс, а объект, реализующий интерфейс. В JASS это все сложно представить и как-то юзать. Я бы посоветовал немного поковырять Java или C#, если будет скучно - JS
0
18
1 год назад
0
Kokomi, Окей.
0
8
1 год назад
0
EugeAl, интерфейс это скорее абстрактный тип, но не функция, он только содержит их сигнатуры, а реализация ложится на тех, кто наследует интерфейс.
3
20
1 год назад
3
Такой вопрос (только к тем, кто использует джасс), добавлять ли возможность ExecuteFunc/Code с вариативными аргументами таким образом:
function Multiply takes integer num, real multiplier returns real
	return num * multiplier
endfunction

function TestSomething takes nothing returns nothing
local real result = 0.
call PushInteger( 100 )
call PushReal( 1.5 )
set result = VarToReal( ExecuteVariedFunc( "Multiply" ) )
endfunction
Это уже конечно "велосипед" (зато какой). То бишь ExecuteVariedFunc будет возвращать хендл типа Var, который можно будет кастить в другие типы. Думаю это всё явно лишнее, но интересно что скажете.

v1.0.12.59

  1. Исправлена критическая ошибка на 1.28.5.
Пояснение: данная ошибка была связана с выполнением какого-либо действия, допустим нажатия системных фреймов, выделением юнита и так далее. Обычное движение мышки и камеры не вызывало ошибки.
  1. Исправлены CastAbilityGround и CastAbilityTarget нативные функции.
Дополнение: НЕ ИСПОЛЬЗУЙТЕ эти функции без какой-либо задержки из main функции, так как игра может не успеть подготовить события под этим заклинания и т.д.
  1. Исправлена критическая ошибка при создании фреймов в lua через war3_lua.dll.
0
19
1 год назад
0
Такой вопрос (только к тем, кто использует джасс), добавлять ли возможность ExecuteFunc/Code с вариативными аргументами таким образом:
Скопировать в буфер
А почему бы и нет? Выглядит неплохо, я только за.
0
29
1 год назад
0
Думаю это всё явно лишнее, но интересно что скажете.
А функцию можно аргументом передать?
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.