13

» WarCraft 3 / Заряды способности

Bergi_Bear, если устраивает отображение зарядов только в случае выбора одного юнита, то можно сделать наследников параметров юнита, тогда они будут видны только одновременно с этим фреймом. Чтобы цифры не перекрывали кнопки, поставь им лвл меньше чем у кнопок. Но все равно придется детектить текущего выбранного юнита, чтобы знать чьи заряды отображать, но там ничего сложного через события SelecetedUnit и DeselectedUnit
13

» WarCraft 3 / [Lua] Совместная работа над WC3 проектами

ScorpioT1000, проблема в том что нет ни одного способа, который однозначно даст верный результат
13

» WarCraft 3 / [Lua] Совместная работа над WC3 проектами

NazarPunk, может не у всех так, но у меня нотации от sumneko в vscode захлебываются и перестаются адекватно работать на примерно 50-70 файлах. Аналогично с EmmyLua в PyCharm. На счет подхода к написаю кода соглашусь. Что для тебя ересь (require или ООП на lua), то для меня наиболее адекватное решение. Lua, конечно, не устареет быстро, но вот выкатят близы патч с возможностью использовать несколько .lua файлов, и все системы сборки станут неактуальны.
13

» WarCraft 3 / [Lua] Совместная работа над WC3 проектами

ScorpioT1000, командная разработка - крайне сложно огранизационно... Собрать команду, выбрать лидера, выбрать систему документирования кода. На данный момент ни EmmyLua, ни Lua 0.15.4 от sumneko не дают необходимых инструментов. Необходимо совместно разработать стандарт кодирования. А люди на добровольных неоплачиваемых началах не склонных уделять достаточное время подобным вещам. Нам всем гораздо интереснее процесс созидания, нежели грамотная его организация. А в связи с тем что сейчас идет бета тестирование, все разработанное может устареть с выходом релиза или даже просто нового патча.
13

» WarCraft 3 / [Lua] Совместная работа над WC3 проектами

NazarPunk, этот файл возвращает функцию Compile(src, dst). Функция ищет файл war3map.lua в папке src и выполняет его как обычный lua код. При этом на основе выполненных require (в файле war3map.lua, и в его зависимостях) создает список всех использованных файлов. Весь этот список объединяется в один файл war3map.lua и сохраняется в папке dst. Сохраняются они по следующему принципу:
package_files['package.name'] = function()
	...
end

package_files['other.package.name'] = function()
	...
end
Так же в игре становится доступна функция require, которая подгружает эти функции при первом использовании.
{src}/some/package.lua
local test = print
return test
{src}/wa3map.lua
local test = require('some.package')
...
function main()
	...
	test('Some text here.')
end
Такой код напечает 'Some text here.' при старте карты.
Так же в этом сборщике есть глобальные функции Compiletime(func, ...), IsCompiletime(), GetSrcDir(), GetDstDir(). они предназначены для работы с другими файлами карты.
Сейчас создание нового типа юнита выглядит так
local unit_type = Compiletime(function()
    ---@type ObjectEdit
    local ObjEdit = require('compiletime.ObjectEdit')
    local WeUnit = ObjEdit.Unit
    local unit_type = WeUnit.new(ObjEdit.getUnitId(), 'hfoo', 'JustDebugName')
    unit_type:setField(WeUnit.Field.Name, 'Paladin')
    unit_type:setField(WeUnit.Field.ArmorSoundType, 'Flesh')
    return unit_type:toRuntime()
end)
в конечном war3map.lua получается
local unit_type = {['name'] = 'JustDebugName',['id'] = 'x##$',['Name'] = 'Paladin',['base_id'] = 'hfoo',}
13

» WarCraft 3 / [Lua] Совместная работа над WC3 проектами

tysch_tysch, лови) С ограничениями, но с compiletime функцией, если есть интерес к подобному могу выложить еще и либу по редактированию w3u и w3a
Загруженные файлы
13

» WarCraft 3 / Как сделать анимированный фрейм за пределами 0.8x0.6?

Koladik, за пределами холста 0.8х0.6 могут быть только SIMPLEFRAME, SIMPLEBUTTON, SIMPLESTATUSBAR и SIMPLECHECKBOX(нерабочий).
13

» WarCraft 3 / Как сделать анимированный фрейм за пределами 0.8x0.6?

Мне известен только костыльный метод... Делать на основе SIMPLEFRAME , а анимацию проигрывать таймером, заменяя текстуру
13

» WarCraft 3 / Reforged: изменение характеристик боевой единицы

А разве BlzSetUnitIntField не работает? С критами и уворотами в абилках у меня работало
13

» WarCraft 3 / [Lua] Микрофриз при получении способности

Принятый ответ
Видимо у спосбности много уровней. Чтобы избежать микрофриза при получении, создайте юнита в начале игры, дайте ему способность и удалите его.
13

» WarCraft 3 / Вопрос физической сложности проверки карты

Я бы посоветовал попробовать разделить скрипты на отдельные элементы, не привязанные к конкретному игроку
13

» WarCraft 3 / двумерный массив lua

Drulia_san, написать систему хештаблиц на языке основанном на хештаблицах...
13

» WarCraft 3 / Preload

file_path = 'DebugLogs\\Log.bat'
PreloadGenClear()
PreloadGenStart()
Preload("\" )\r\n\tcall DisplayTimedTextToPlayer( GetLocalPlayer(), 0, 0, 30, \"Done2\" )\r\n\tcall Preload( \"")
PreloadGenEnd(file_path)
Preloader(file_path)
Так же не смог создать файл с расширением .bat
13

» WarCraft 3 / constant native Convert...

То есть теоретически на этой основе можно сделать мемхак для 1.29+ ?
13

» WarCraft 3 / Триггеры

NazarPunk, потому что так реализация систем выглядит проще, соответственно проще потом доработать. Особенно, когда количество ненативных функций для какого-то типа данных начинает переваливать за три десятка.
13

» WarCraft 3 / Триггеры

PT153, отсутсвие вара под рукой
Пока оставлю так, если доберусь до теста, напишу...
Trigger - обертка над нативным триггером
function runFuncInDebug(func, ...)
    if Settings.debug then 
        local success, result = pcall(func, ...)
        if success then
            return result
        else
            Debug(result) -- print to local player
            return nil
        end
    else
        return func(...)
    end
end

function Trigger:execute()
    local original = _G.GetTriggeringTrigger
    GetTriggeringTrigger = function() return self.__trigger_obj end
    runFuncInDebug(TriggerExecute, self.__trigger_obj)
    GetTriggeringTrigger = original
end
13

» WarCraft 3 / Какими способами может быть отменено прицеливание способностью?

Bergi_Bear, патч 1.31 мультиплеер с муи.
1 - это определяю легко. У юнита стоит способность-пустышка с мгновенным применением и тем же хоткеем, что у оригинала. При использовании пустышки выдается событие "Targeting start", пустышка меняется на оригинал и прожимается соответсвующий хоткей для владельца юнита локально. Событие выдано, игрок целится - цель достигнута.
2 - да, примерно так и делаю. Для эффектов нет необходимости синхронизировать положение, поэтому заранее создаю пул эффектов для всех игроков и манипулирую нужными локально.
3 - при использовании оригинальной способности все действительно тривиально.
4 - упустим возможноть игровой отметы прицеливания, такие как сайленс, с ними проблем возникнуть не должно. Пока выяснил, что целящийся игрок может отменить прицеливание клавишей Esc и ПКМ (f10 и другие системные пока не проверял). Патч 1.31 позволяет это отслеживать, так что дело за тестами, чтобы выловить все возможности отмены.
Дело в общем-то в том, что я не делаю какую-то конкретную способность, а пилю свою систему каста, которой должно хватить на любые мои хотелки. Пока думаю должно хватить следующих событий:
  • UnitStartTargetingSpell
  • UnitTargetingSpell (вызывается по таймеру с периодом 0.03125)
  • UnitFinishedTargetingSpell
  • UnitStartCastingSpell
  • UnitCastingSpell (вызывается по таймеру с периодом 0.03125)
  • UnitCancelCastingSpell (отмена применения игроком)
  • UnitInterruptedCastingSpell (прерывание противником, например, сайленс, стан)
  • UnitFinishCastingSpell
13

» WarCraft 3 / Какими способами может быть отменено прицеливание способностью?

Bergi_Bear, 8gabriel8, Сделал через отслеживание нажатия Esc, ПКМ и еще нескольких событий, в том числе храню выбранных юнитов. Отследить наличие кнопки Cancel не смог.