Warcraft III - Lua

Added by , published
Warcraft III - Lua - это mix, позволяющий creater'ам встраивать lua script'ы в свои карты. Некоторый стандартный функционал lua был ограничен в целях безопасности пользователей и игроков. В силу различий JASS и lua, некоторые нативные функции Warcraft III могут работать некорректно. Вы имеете возможность поспособствовать развитию проекта, написав об ошибках и багах.
Текущая версия: 1.1.4 (Ashenvale)
Версия lua: 5.4.3
Поддерживаемый патч игры: 1.26
» Список изменений
  • 1.1.4 (Ashenvale) - добавлены фреймы. Добавлен режим разработчика (-dev) со снятыми на lua ограничениями. Добавлен заперт на подключение к пользователям без мода и наоборот. Добавлен фикс широкоформатных экранов. Изменена карта-пример.
  • 1.1.3 (Beta) - оптимизирован код преобразования float2jReal. Исправлен вылет после попытки запуска триггера с ошибкой. Добавлен stack trace и всплывающее сообщение. Добавлено сообщение о критической ошибке, а именно отсутствие необходимого количества аргументов, при попытке вызова стандартных функций Warcraft III . Исправлена ошибка, из-за которой мог произойти десинк, так как сборщик мусора поспешно удалял значения. Исправлена ошибка с потерей аргументов во время переадресации вызова lua2jassnative.
» Имеющиеся функции
  • Стандартные JASS функции;
  • FrameAPI
// Исходные фреймы
ORIGIN_FRAME_GAME_UI,
ORIGIN_FRAME_WORLD_FRAME,
ORIGIN_FRAME_HERO_BAR,
ORIGIN_FRAME_HERO_BUTTON,
ORIGIN_FRAME_HERO_HP_BAR,
ORIGIN_FRAME_HERO_MANA_BAR,
ORIGIN_FRAME_HERO_BUTTON_INDICATOR, // Не определено
ORIGIN_FRAME_ITEM_BUTTON,
ORIGIN_FRAME_COMMAND_BUTTON,
ORIGIN_FRAME_SYSTEM_BUTTON, // Не определено
ORIGIN_FRAME_PORTRAIT,
ORIGIN_FRAME_MINIMAP,
ORIGIN_FRAME_MINIMAP_BUTTON,
ORIGIN_FRAME_TOOLTIP,
ORIGIN_FRAME_UBERTOOLTIP, // Не определено
ORIGIN_FRAME_CHAT_MSG,
ORIGIN_FRAME_UNIT_MSG,
ORIGIN_FRAME_TOP_MSG


// Точки фрейма
FRAMEPOINT_TOPLEFT,
FRAMEPOINT_TOP,
FRAMEPOINT_TOPRIGHT,
FRAMEPOINT_LEFT,
FRAMEPOINT_CENTER,
FRAMEPOINT_RIGHT,
FRAMEPOINT_BOTTOMLEFT,
FRAMEPOINT_BOTTOM,
FRAMEPOINT_BOTTOMRIGHT

// События фреймов
FRAMEEVENT_CONTROL_CLICK,
FRAMEEVENT_MOUSE_ENTER,
FRAMEEVENT_MOUSE_LEAVE,
FRAMEEVENT_MOUSE_UP,
FRAMEEVENT_MOUSE_DOWN, // Не работает, прям как в рефе.
FRAMEEVENT_MOUSE_WHEEL,
FRAMEEVENT_CHECKBOX_CHECKED,
FRAMEEVENT_CHECKBOX_UNCHECKED,
FRAMEEVENT_EDITBOX_BUTTON_DOWN,
FRAMEEVENT_EDITBOX_TEXT_CHANGED,
FRAMEEVENT_POPUPMENU_ITEM_CHANGED,
FRAMEEVENT_MOUSE_DOUBLECLICK,
FRAMEEVENT_SPRITE_ANIM_UPDATE,
FRAMEEVENT_SLIDER_VALUE_CHANGED,
FRAMEEVENT_DIALOG_CANCEL,
FRAMEEVENT_DIALOG_ACCEPT,
FRAMEEVENT_EDITBOX_ENTER

framehandle GetOriginFrame(EOriginFrame originframe, integer index);
boolean LoadTOCFile(string filename);
framehandle GetFrameByName(string framename, integer id);
framehandle GetFrameParent(framehandle frame);
framehandle GetFrameChildrenCount(framehandle frame);
framehandle GetFrameChild(framehandle frame, integer index);
nothing TriggerRegisterFrameEvent(trigger trigger, framehandle frame, frameevent event);
framehandle CreateFrame(string baseframe, framehandle parentframe, framepointtype point, framepointtype relativepoint);
nothing SetFrameText(framehandle frame, string text);
string GetFrameText(framehandle frame);
nothing SetFrameTextColor(framehandle frame, integer red, integer green, integer blue, integer alpha); // red, green, blue, alpha < 256
real GetFrameTextHeight(framehandle frame);
nothing SetFrameFont(framehandle frame, string filename, real height, boolean flag);
nothing SetFrameWidth(framehandle frame, real width);
nothing SetFrameHeight(framehandle frame, real height);
nothing SetFrameSize(framehandle frame, real width, real height);
nothing SetFrameScale(framehandle frame, real scale);
nothing SetFrameAbsolutePoint(framehandle frame, framepointtype point, real offsetX, real offsetY);
nothing SetFramePoint(framehandle frame, framepointtype point, framehandle relativeframe, framepointtype relativepoint, real offsetX, real offsetY);
real GetFrameWidth(framehandle frame);
real GetFrameHeight(framehandle frame);
framepoint GetFramePointParent(framehandle frame, framepointtype point);
framepoint GetFramePointRelativePoint(framehandle frame, framepointtype point);
real GetFramePointX(framehandle frame, framepointtype point);
real GetFramePointY(framehandle frame, framepointtype point);
framehandle GetTriggerFrame();
real GetFrameValue(framehandle frame);
real GetTriggerFrameValue();
nothing SetFrameValue(framehandle frame, real value);
nothing SetFrameMinMaxValue(framehandle frame, real minValue, real maxValue);
nothing SetFrameStepSize(framehandle frame, real stepSize);
nothing SetFrameTexture(framehandle frame, string texFile, boolean flag);
nothing SetFrameEnable(framehandle frame, boolean enabled);
nothing ClickFrame(framehandle frame);
nothing SetFrameModel(framehandle frame, string modelFile, integer modeltype, boolean flag);
nothing DestroyFrame(framehandle frame);
nothing SetFrameVisible(framehandle frame, boolean visible);
nothing SetGameUIVisible(boolean visible);
nothing SetFrameCheck(framehandle frame, boolean check);
» Установка
Перенести war3_lua.mix в папку с игрой.
» Инструкция по эксплуатации
  1. Создать в карте (её архиве) папку Scripts. В неё перенесите blizzard.lua и common.lua. (Необязательно, позволяет использовать стандартные константы blizzard.j, common.j)
  2. Поместить ваш lua script в архив карты. Обязательно переименуйте его в war3map.lua!
  3. Наслаждайтесь игрой.
Для отображения ошибок в скриптах, запускайте Warcraft с параметром -debug.

Views: 308

x10azgmfx #1 - 1 month ago (изм. ) 4
Голосов: 4
Когда-то нибудь милишники смогут интерфейс забабахать, вместо использования диалогового окна.
Прикрепленные файлы
Bergi #2 - 1 month ago (изм. ) 1
Голосов: 1
Так, есть хорошие новости я смог подрубить сборку карты, пока что самый сырой вариант через внешний луа и Idea
карта в режиме папки, mpqtool, собирает карту в архив и через командную строку запускаем сразу варкарфт вместе с картой в обход меню
Прикрепленные файлы
GRYLLL #3 - 1 month ago 0
Голосов: 0
А совместимость с 1.31 в наличии?
Vladimir TVK #4 - 1 month ago 4
Голосов: 4
xgm.guru/files/2127/269661/comments/478399/2021-12-13_225820.jpg
Когда-то нибудь милишники смогут интерфейс забабахать, вместо использования диалогового окна.
Когда-нибудь клоуны перестанут приплетать милишников.

По сабжу: тема интересная, автору - моё уважение. Позже протестирую.
ScorpioT1000 #5 - 1 month ago 1
Голосов: 1
Поменял форматирование, если автор не против. Если против - могу вернуть.
Ev3nt #6 - 1 month ago 0
Голосов: 0
ScorpioT1000, благодарю.
x10azgmfx #7 - 1 month ago 0
Голосов: 0
Vladimir TVK, извини, я не клоун. А вот ты Токсичный, мерзкий милишник, который кроме оскорбленния больше ничем ответить не в состоянии.
Bergi #8 - 1 month ago 1
Голосов: 1
Ev3nt, Свяжись со мной, обнаружен ряд проблем надо вместе поработать.
» раскрыть
  1. Ты вырезал dofile? или я не пойму как его использовать
  2. Не работает print в чате игры, и вообще надо всю консоль перенаправить в чат
  3. Запакованная карта, не сохраняется в WE
  4. Карта приложенная в архив частично битая, если её распаковать и запаковать, то она не запускается вообще
Тут скорее всего я что-то делаю не так, но нужно, чтобы ты подсказал ну и пожелания на будущее:
  1. Наверное надо переименовать blizzard и common из папки скриптс, потому что это конфликтует с подсветкой синтаксиса луа из рефа+ автозаполнение...
  2. Разумеется нужно добавить весь мемхак, без него это кусок чистого (+ мышка) 1.26 на луа - бесполезный кусок.... г.., не знаю как тебя помочь тут
  3. Добавить запаковку / распаковку, я слабый и в ряд ли сам смогу, просто без режима папки это будет рак, писать скрипты в 1 единственный файл war3map.lua такое себе занятие. Можно всё украсть отсюда

Ещё вот что заметил, Command Button Effect Utility Functions и прочего нет в 1.26 или мемхаке

Разобрался с подсветкой, это у меня просто руки были кривые
Прикрепленные файлы
Ev3nt #9 - 1 month ago (изм. ) 0
Голосов: 0
Bergi_Bear, постараюсь вечером выйти на связь. Спасибо за фидбек.

Да, dofile я выключил, но ты всегда можешь подключать другие скрипты путём require. Они грузятся из архива карты.
Kirill78 #10 - 1 month ago 2
Голосов: 2
Ev3nt, все таки и эту штуку оставил. Земля пухом нормальному алгоритму контрольки
SomnusUltima #11 - 1 month ago 0
Голосов: 0
Создать в карте (её архиве) папку Scripts. В неё перенесите blizzard.lua и common.lua. (Необязательно, позволяет использовать стандартные константы blizzard.j, common.j)
Поместить ваш lua script в архив карты. Обязательно переименуйте его в war3map.lua!
подскажите нупу что значит то "создать в архиве"?. Это как?
Ev3nt #12 - 1 month ago 0
Голосов: 0
SomnusUltima, используя MpqEdtior или что-то с таким же функционалом.
Прикрепленные файлы
EugeAl #13 - 4 weeks ago 0
Голосов: 0
Вопрос к автору: А как вы сделали, чтобы старый варик распознавал файлы common.lua и blizzard.lua именно как код, а не простой текст с неизвестным назначением? Неужели в варике были изначально прописаны такие команды для распознавания?
Ev3nt #14 - 4 weeks ago 0
Голосов: 0
EugeAl, нет. Это стандартный функционал lua, я просто чуть-чуть откорректировал функции, чтобы файлы читались из карты.
EugeAl #15 - 4 weeks ago (изм. ) 0
Голосов: 0
Ev3nt, Но ведь патч 1.26 не поддерживает lua. Только jass. Не рефоржед, обычный. Или всё же поддерживает? Не пойму что то.
Ev3nt #16 - 4 weeks ago 0
Голосов: 0
EugeAl, всё верно, её пришлось добавлять самому.
EugeAl #17 - 4 weeks ago 0
Голосов: 0
Ev3nt, Вот, мне это и интересно. Что за магия?) Это ведь по идее, надо менять исходный код, чтобы прописать туда нужные команды... И по аналогии, возможно ли таким макаром присобачить к варику плагины для других ЯП? Например, жабы или питона (java, python) или ещё чего нибудь? Или сделать мультиязыковой плагин?
Ev3nt #18 - 4 weeks ago 0
Голосов: 0
EugeAl, да.
ScorpioT1000 #19 - 4 weeks ago 0
Голосов: 0
EugeAl, можно даже превратить твой пк в майнер или ботнет, это же мемхак, тут к варику отношения уже мало.
EugeAl #20 - 4 weeks ago 0
Голосов: 0
Ev3nt, круто было бы, если бы кто нибудь замутил что то подобное. Мне кажется, это привлекло бы много кодеров к моддингу варика...
ScorpioT1000, понятно)
Bergi #21 - 4 weeks ago 0
Голосов: 0
EugeAl, как бы уже давно,
к сожалению к модингу привлекает только возможность заработать, а тут её нет или усилия не стоят того
EugeAl #22 - 4 weeks ago 0
Голосов: 0
Bergi_Bear, Мда, посмотрел, всё очень печально. Похоже, что никому это просто не нужно (