Нашли вместе с ScorpioT1000 баг парсера - наличие %S или %s в любой части луа-кода приводит к падению редактора. Было бы здорово если бы кто-то зарепортил это на хайв и близам.
H, я пока не озадачивался автоматизацией инжекта кода в карту - пишу в vscode с плагинами рекомендоваными на хайве. Весь код пишу в одном большом файле и по мере необходимости переношу вручную в блоки кода в редакторе, а дальше стандарно для WE. Криво, но мне пока хватает, нормальная среда разработки экономит достаточно времени, чтобы эти дополнительные ручные действия окупались, в сравнении с работой прямо в WE. Если буду что-то более серьезное чем тест новых возможностей делать, то может и подумаю о чем-то большем.
Еще немного Lua вам в ленту. ForGroup, Lua и кложуры.
function TestLib.TestGroup(g)
print("group test start")
local a = 42
local i = 0
ForGroup(g, function()
local u = GetEnumUnit()
print('i='..i..' a='..a.." "..GetHandleId(u).." "..GetUnitName(u))
i = i +1
end)
print("group test end")
end
Результат
На очереди таймеры...
Lua, таймеры и кложуры
TestLib.TimerCounter=0
function TestLib.TestTimers()
local t1 = CreateTimer()
local i = 0
local a = 42
local x = TestLib.TimerCounter
print('start timer '..x)
TimerStart(t1, 1, true, function()
print('timer '..x..' tick '..i..' a='..a)
i = i +1
end)
TestLib.TimerCounter = TestLib.TimerCounter+1
end
Еще один юз-кейс BlzChangeMinimapTerrainTex - террейн, который динамически меняется в пределах фиксированного набора состояний, для которых можно заранее нарисовать текстуру миникарты.
Там короче проблема появляется, в том, что если я начинаю чарджить, то анимации нет, в РО указывается только анимация, котороая будет проигрываться только после самого каста спелла.
Что-то странное, потому как я именно на канале делал скилы такого типа, без управления анимацией триггерно, да и в стандартных настройках канал должен работать подобным образом - запускать длительную channel анимацию.
ScorpioT1000, даже если я пропустил изменения и она уже кропает текстуру миникарты под отрезаную область, возможность проставить кастомную текстуру динамически всеравно будет востребована хотябы ради того чтобы детализация миникарты не зависела от размера области.
Nelloy, нативная многопоточность от Lua, скорее всего, будет отключена близами, если еще не отключена, как уже отключено все IO.
Следующее на очереди к проверке - функция BlzChangeMinimapTerrainTex
Это не так круто и полезно, как работа с полями всего и вся, но вротмненоги, если она работает, то насколько же приятней станет делать и играть карты с несколькими локациями в одной карте!
upd: BlzChangeMinimapTerrainTex работает. На входе принимает путь до текстуры.
exAres, у нас есть Lua и кони наши быстры... А если серьезно - это все сильно зависит от реальных условий в карте - одно дело два десятка героев снабдить кастомным уроном и кастомной системой статов, и совсем другое - пару сотен юнитов у каждого из двадцати игроков.
Bergi_Bear,
Из интересного - работает изменение типа цели у юнита, возможно и у атаки но атаку еще не проверил. Но я уже и не вспомню можно ли это было менять раньше без этой нативки и как оно соотносится с классификациями, которые проставляются отдельно и у которых другой список значений. А вот и нет - для атаки ситуация аналогична попытке получить тип атаки - нули на выходе, возможно дело таки в индексах.
Из того что еще проверял и что работает - броня. Работает как сумма белой и зеленой брони без изменения зеленой.
Проверил тип атаки - не доделано, судя по всему - возвращает ноль как текущий тип атаки, независимо от реального типа атаки. Или там что-то совсем не логичное в индекс атаки передавать надо. Но ставлю на то, что это и дальше не заведется, если близов не пинать активно - там явно мало поменять флаг, как и для движения.
Тип движения - число меняется, поведение юнита - нет. Скорее всего, мало поменять этот флаг, при живом юните. И, насколько я помню, с мемхаком аналогично было - еще какие-то махинации требовались помимо изменения этого флага.
Тип атаки и базовый урон - попробую, параметры оружия не трогал руками еще.
Кто там жаловался что для юнитов совсем не меняются поля новыми нативками? Только что пошел проверил - работает. Все поля не перебирал, естественно, но те что руками трогал отлично меняются. Единственное что - новое значение получается с учетом бонусов т.е. если у героя в инвентаре кольцо защиты на +2 и герою выставить новой нативкой броню в 2, то без кольца она станет равна нулю - меняется сумма белого и зеленого значений, без изменения зеленого значения.
PrincePhoenix, не так много вещей в варе которые могут создаваться или редактироваться локально, ничего нового, да это лишняя память, но зато меньше гемороя с синхронизацией.
Кстати, может кто знает, как сделать кнопку, после нажатии которой работала клавиатура ?
Теоретически - снимать с неё фокус по нажатию через BlzFrameSetFocus(frame, flag). Еще можно попробовать полностью запрещать фокус самому фрейму кнопки, но не факт что выйдет.
quq_CCCP, посмотри те карты которые кидал pro100master на третьей странице комментов - какраз начиная с этого PTR это уже не трекабли, а полноценные фреймы интерфейсные.
upd2: искуственных ограничений на длину lua-строки не обнаружено. Но вполне вероятно, что при передаче в нативки происходит конверт в JASS строку и отбрасывание лишнего.
Apotheosis, карта на хайве - пока продвинутый аналог дгуя, а не новые интерфейсные нативки, как на сриншоте, насколько я знаю, а люди хотят именно новые нативки.
H, я что-то пропустил? С каких пор у вара есть еще одна VM помимо JASS? Я всегда был уверен что JASS-машина дальше дергает нативную реализацию в движке, которая отвечает за хранение данных, генерацию событий и все остальное. Ну и обычно встраивание Lua делают не через компиляцию в сторонний байткод, а через каллбеки в С/С++ код.
Набросал то о чем писал выше - прототип "системы" хранения произвольных данных по хендлу. Никакой безопасности, да и функционал есть куда расширять, но даже в таком виде это намного лучше любой системы хранения данных которыми я пользовался в своих старых картах.
local DataStorage = {}
function DataStorage:new (o)
o = o or {}
setmetatable(o, DataStorage)
DataStorage.__index = function (table, key) table[key] = {} return table[key] end
return o
end
function DataStorage:Reset(h)
local data = self[h]
local count = #data
for i=0, count do data[i]=nil end
end
function DataStorage:Purge(h)
self[h] = nil
end
local HandleData = DataStorage:new() -- для хендлов
local ProtoData = DataStorage:new() -- для равкодов
Пример использования. Ничего интересного, просто ведет подсчет сколько раз функция была вызвана для каждого юнита и выводит это на экран.
function TestLib.TestUnit(u)
print(u)
local h = GetHandleId(u)
print("handle "..h)
local data = HandleData[h]
if (data.num==nil)then --поле num еще не было использовано для этого хендла, задаем начальное значение
data.num=0
end
data.num = data.num+1
print("counter "..data.num)
end
Работает "из коробки", без сторонних утилит и парсеров, выполняется на Lua-машине. Производительность руки не дошли проверить, но опыт работы с Lua подсказывает мне, что будет быстрее чем vJass.
» WarCraft 3 / Официально стал доступен PTR 1.31
» WarCraft 3 / Официально стал доступен PTR 1.31
» WarCraft 3 / Официально стал доступен PTR 1.31
Ред. prog
» WarCraft 3 / Официально стал доступен PTR 1.31
Ред. prog
» WarCraft 3 / Официально стал доступен PTR 1.31
» WarCraft 3 / Официально стал доступен PTR 1.31
» WarCraft 3 / Запретить атаковать
» WarCraft 3 / Официально стал доступен PTR 1.31
Ред. prog
» WarCraft 3 / Официально стал доступен PTR 1.31
Это не так круто и полезно, как работа с полями всего и вся, но вротмненоги, если она работает, то насколько же приятней станет делать и играть карты с несколькими локациями в одной карте!
Ред. prog
» WarCraft 3 / Запретить атаковать
» WarCraft 3 / Официально стал доступен PTR 1.31
» WarCraft 3 / Официально стал доступен PTR 1.31
Ред. prog
» WarCraft 3 / Официально стал доступен PTR 1.31
Из интересного - работает изменение типа цели у юнита, возможно и у атаки но атаку еще не проверил. Но я уже и не вспомню можно ли это было менять раньше без этой нативки и как оно соотносится с классификациями, которые проставляются отдельно и у которых другой список значений. А вот и нет - для атаки ситуация аналогична попытке получить тип атаки - нули на выходе, возможно дело таки в индексах.
Ред. prog
» WarCraft 3 / Официально стал доступен PTR 1.31
Ред. prog
» WarCraft 3 / Официально стал доступен PTR 1.31
» WarCraft 3 / Официально стал доступен PTR 1.31
» WarCraft 3 / Официально стал доступен PTR 1.31
» WarCraft 3 / Официально стал доступен PTR 1.31
Ред. prog
» WarCraft 3 / Официально стал доступен PTR 1.31
» WarCraft 3 / Официально стал доступен PTR 1.31
Ред. prog
» WarCraft 3 / Официально стал доступен PTR 1.31
upd1: многострочная запись работает
» WarCraft 3 / Официально стал доступен PTR 1.31
» WarCraft 3 / Официально стал доступен PTR 1.31
Обработка ошибок через pcall и xpcall пока близами не выпилена и исправно работает.
Ред. prog
» WarCraft 3 / Официально стал доступен PTR 1.31
Ред. prog
» WarCraft 3 / Официально стал доступен PTR 1.31