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
18
1 год назад
0
Kokomi, Загуглил. Посмотрел примеры из Педивикии. Выглядят они как большая функция, в которой через разные условия вызываются другие функции с различающимися аргументами. Большая функция и есть интерфейс?
0
20
1 год назад
0
EugeAl, не идут примеры в мою сонную голову.
По факту интерфейс это просто набор методов, которые должен реализовывать класс. То есть если в классе прописано, что он реализует интерфейс - он обязан иметь все те же функции, которые прописаны в нем.
1
29
1 год назад
Отредактирован nazarpunk
1
не идут примеры в мою сонную голову.
interface Point {
	method setPosition(x, y);
}

interface Unit impliements Point {
	method setPosition(x, y){
		SetUnitX(this, x)
		SetUnitY(this, y)
	}
}

interface Effect impliements Point {
	method setPosition(x, y){
		SetEffectX(this, x)
		SetEffectY(this, y)
	}
}
0
8
1 год назад
0
EugeAl, мне кажется, без полиморфизма не понять все преимущества их использования. Если брать пример выше, то можно иметь один метод, который двигает\отталкивает и т.д., и в качестве аргумента ему можно задать Point. В таком случае, в него можно будет передавать и юниты, и эффекты, и предметы, он будет работать с ними одинаково, просто исходя из того, что все они - Point.
0
18
1 год назад
Отредактирован EugeAl
0
Kokomi, nazarpunk, build, Судя по всему, это что-то вроде типа функции. То есть функции, также как и объекты, имеют тип и наследование, только вместо handle -> widget -> unit здесь идёт function -> method -> interface -> class. Я правильно понимаю?
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
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.