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: 954

4
Голосов: 4
Ruti Ragnason 478399 - 5 months ago (изм. ) 4
Голосов: 4
Когда-то нибудь милишники смогут интерфейс забабахать, вместо использования диалогового окна.
Uploaded files
1
Голосов: 1
Bergi 478416 - 5 months ago (изм. ) 1
Голосов: 1
Так, есть хорошие новости я смог подрубить сборку карты, пока что самый сырой вариант через внешний луа и Idea
карта в режиме папки, mpqtool, собирает карту в архив и через командную строку запускаем сразу варкарфт вместе с картой в обход меню
0
Голосов: 0
GRYLLL 478418 - 5 months ago 0
Голосов: 0
А совместимость с 1.31 в наличии?
Это сообщение удалено
1
Голосов: 1
ScorpioT1000 478423 - 5 months ago 1
Голосов: 1
Поменял форматирование, если автор не против. Если против - могу вернуть.
0
Голосов: 0
Ev3nt 478430 - 5 months ago 0
Голосов: 0
ScorpioT1000, благодарю.
0
Голосов: 0
Ruti Ragnason 478435 - 5 months ago 0
Голосов: 0
Vladimir TVK, извини, я не клоун. А вот ты Токсичный, мерзкий милишник, который кроме оскорбленния больше ничем ответить не в состоянии.
1
Голосов: 1
Bergi 478440 - 5 months 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 или мемхаке

Разобрался с подсветкой, это у меня просто руки были кривые
Uploaded files
0
Голосов: 0
Ev3nt 478443 - 5 months ago (изм. ) 0
Голосов: 0
Bergi_Bear, постараюсь вечером выйти на связь. Спасибо за фидбек.

Да, dofile я выключил, но ты всегда можешь подключать другие скрипты путём require. Они грузятся из архива карты.
2
Голосов: 2
Kirill78 478446 - 5 months ago 2
Голосов: 2
Ev3nt, все таки и эту штуку оставил. Земля пухом нормальному алгоритму контрольки
0
Голосов: 0
SomnusUltima 478447 - 5 months ago 0
Голосов: 0
Создать в карте (её архиве) папку Scripts. В неё перенесите blizzard.lua и common.lua. (Необязательно, позволяет использовать стандартные константы blizzard.j, common.j)
Поместить ваш lua script в архив карты. Обязательно переименуйте его в war3map.lua!
подскажите нупу что значит то "создать в архиве"?. Это как?
0
Голосов: 0
Ev3nt 478449 - 5 months ago 0
Голосов: 0
SomnusUltima, используя MpqEdtior или что-то с таким же функционалом.
0
Голосов: 0
EugeAl 478678 - 5 months ago 0
Голосов: 0
Вопрос к автору: А как вы сделали, чтобы старый варик распознавал файлы common.lua и blizzard.lua именно как код, а не простой текст с неизвестным назначением? Неужели в варике были изначально прописаны такие команды для распознавания?
0
Голосов: 0
Ev3nt 478690 - 5 months ago 0
Голосов: 0
EugeAl, нет. Это стандартный функционал lua, я просто чуть-чуть откорректировал функции, чтобы файлы читались из карты.
0
Голосов: 0
EugeAl 478704 - 5 months ago (изм. ) 0
Голосов: 0
Ev3nt, Но ведь патч 1.26 не поддерживает lua. Только jass. Не рефоржед, обычный. Или всё же поддерживает? Не пойму что то.
0
Голосов: 0
Ev3nt 478707 - 5 months ago 0
Голосов: 0
EugeAl, всё верно, её пришлось добавлять самому.
0
Голосов: 0
EugeAl 478708 - 5 months ago 0
Голосов: 0
Ev3nt, Вот, мне это и интересно. Что за магия?) Это ведь по идее, надо менять исходный код, чтобы прописать туда нужные команды... И по аналогии, возможно ли таким макаром присобачить к варику плагины для других ЯП? Например, жабы или питона (java, python) или ещё чего нибудь? Или сделать мультиязыковой плагин?
0
Голосов: 0
Ev3nt 478721 - 5 months ago 0
Голосов: 0
EugeAl, да.
0
Голосов: 0
ScorpioT1000 478724 - 5 months ago 0
Голосов: 0
EugeAl, можно даже превратить твой пк в майнер или ботнет, это же мемхак, тут к варику отношения уже мало.
0
Голосов: 0
EugeAl 478728 - 5 months ago 0
Голосов: 0
Ev3nt, круто было бы, если бы кто нибудь замутил что то подобное. Мне кажется, это привлекло бы много кодеров к моддингу варика...
ScorpioT1000, понятно)
0
Голосов: 0
Bergi 478729 - 5 months ago 0
Голосов: 0
EugeAl, как бы уже давно,
к сожалению к модингу привлекает только возможность заработать, а тут её нет или усилия не стоят того
0
Голосов: 0
EugeAl 478732 - 5 months ago 0
Голосов: 0
Bergi_Bear, Мда, посмотрел, всё очень печально. Похоже, что никому это просто не нужно (
0
Голосов: 0
PT153 482072 - 4 months ago 0
Голосов: 0
Kirill78, ирина поддерживает этот проект?
3
Голосов: 3
Ev3nt 482087 - 4 months ago (изм. ) 3
Голосов: 3
PT153, официально - Кирилл ничего не говорил. На деле - да, мы с ним тестили, всё работает.
0
Голосов: 0
N1ghtSiren 483877 - 3 months ago 0
Голосов: 0
сможешь добавить кое какой функционал из мемхака?
SetItemBaseIconPathById(itemid, iconpath)
SetItemBaseNameById(itemid, itemname)
SetItemBaseUbertipById(itemid, description)
GetUnitArmour(u)
SetUnitMaxLife(u, RMaxBJ(1, life))
SetUnitMaxMana(u, RMaxBJ(0, mana))
SetUnitBaseDamage(u, damage)
SetUnitArmour(u, armour)
SetUnitLifeRegen(u, life_regen)
SetUnitManaRegen(u, mana_regen)
0
Голосов: 0
Enemy1PK 486072 - 3 weeks ago 0
Голосов: 0
Интересно, но как-то смысла особо нет с таким функционалом. Если каждому пользователю нужно скачивать и закидывать файл, то проще запускать Варик с поддержкой dzapi, таким образом будет и lua и крутые апишки и даже китайские карты будут запускаться, намного больше смысла.
2
Голосов: 2
Vlod 486075 - 3 weeks ago 2
Голосов: 2
Это Open Source проект
А в dzapi рекомендуется перезапускать вар после игры