Nelloy #1 - 5 дней назад (изм. ) 0
Голосов: +0 / -0

» WarCraft 3 Reforged / Триггерно заменить призываемого юнита (в ро)

Roy Mustang, интересное решение, но, к сожалению, поля, которые можно менять триггерно ограничены. Можно сделать отображение модели при использовании заклинания, но это задача не из простых.
Nelloy #2 - 1 неделю назад 0
Голосов: +0 / -0
Nelloy #3 - 1 неделю назад 0
Голосов: +0 / -0

» WarCraft 3 Reforged / Не могу найти в WarCraft 3 Reforged файл WorldEditStrings.txt

Никогда не пользовался, но может ищете этот файл "war3map.wts"?
Nelloy #4 - 1 неделю назад 1
Голосов: +1 / -0

» WarCraft 3 Reforged / War3 Ref: редактор игры не ставит кастомные декорации клиффов.

Не уверен, что это связано, но у меня похожий баг проявляется при использовании в триггерах типа "image". В win10 - все ок, а вот на линуксе с wine они тупо не отображаются. Проверьте появляются ли эти невидимые декорации в менеджере объектов, если да, то стоит проверить драйвера видеокарты.
Nelloy #5 - 2 недели назад (изм. ) 0
Голосов: +0 / -0

» WarCraft 3 Reforged / Как создать воду через триггеры?

Или использовать эффект с моделью воды.
Nelloy #6 - 2 недели назад (изм. ) 0
Голосов: +0 / -0

» WarCraft 3 Reforged / Спрятать хп/мп бар героя + его уровень в Reforged

Теоритически можно сделать круг выделения очень большим или очень маленьким, но не пробовал.
Upd: перечитал текст над картинкой...
Nelloy #7 - 4 недели назад 0
Голосов: +0 / -0
Nelloy #8 - 4 недели назад 4
Голосов: +4 / -0

» WarCraft 3 Reforged / Как "запаузить" любые действия с юнитом. (Не в прямом смысле)

Не устраивает на время передать героя нейтральному игроку?
Nelloy #9 - 1 месяц назад (изм. ) 2
Голосов: +2 / -0

» WarCraft 3 Reforged / Дебаггер Lua

Bergi_Bear, принтов там выходит 4-5 строк.
Есть класс Action с методом public:run(...). Для всех колбеков во всех системах использую его.
Похожую задачу решаю 3мя классами.
» Action
------=========
-- Include
--=========

local lib_path = Lib.curPath()
local lib_dep = Lib.curDepencies()

local Class = lib_dep.Class or error('')
---@type UtilsFunctions
local Functions = require(lib_path..'Functions') or error('')
local isTypeErr = Functions.isTypeErr or error('')
---@type UtilsSettings
local Settings = require(lib_path..'Settings') or error('')
local Log = Settings.default_logger or error('')

--=======
-- Class
--=======

local Action = Class.new('Action')
---@class Action
local public = Action.public
---@class ActionClass
local static = Action.static
---@type ActionClass
local override = Action.override
local private = {}

--========
-- Static
--========

---@alias Callback fun(vararg:any[]):any

---@param callback Callback
---@param owner any
---@param child Action | nil
---@return Action
function override.new(callback, owner, child)
    isTypeErr(callback, 'function', 'callback')
    if child then isTypeErr(child, 'Action', 'child') end

    local list = private.callback2list[callback]
    if list and list[owner] then
        return list[owner]
    end

    local instance = child or Class.allocate(Action)
    private.newData(instance, callback, owner)

    return instance
end

--========
-- Public
--========

---@return any
function public:run(...)
    if Settings.isDebug() then
        local success, result = pcall(private.data[self].callback, ...)
        if success then
            return result
        else
            Log:err(result)
        end
    else
        return private.data[self].callback(...)
    end
end

---@return any
function public:getOwner()
    return private.data[self].owner
end

--=========
-- Private
--=========

private.data = setmetatable({}, {__mode = 'k'})
private.callback2list = setmetatable({}, {__mode = 'v'})

---@param self Action
---@param callback Callback
---@param owner any
function private.newData(self, callback, owner)
    local priv = {
        callback = callback,
        owner = owner
    }

    private.data[self] = priv
    if not private.callback2list[callback] then
        private.callback2list[callback] = setmetatable({}, {__mode = 'v'})
    end
    local list = private.callback2list[callback]
    list[owner or ''] = self
end

return static
» ActionList
--=========
-- Include
--=========

local lib_path = Lib.curPath()
local lib_dep = Lib.curDepencies()

local Class = lib_dep.Class or error('')
---@type ActionClass
local Action = require(lib_path..'Action') or error('')
---@type UtilsFunctions
local Functions = require(lib_path..'Functions') or error('')
local isTypeErr = Functions.isTypeErr or error('')

--=======
-- Class
--=======

local ActionList = Class.new('ActionList')
---@class ActionList : Handle
local public = ActionList.public
---@class ActionListClass : HandleClass
local static = ActionList.static
---@type ActionListClass
local override = ActionList.override
local private = {}

--========
-- Static
--========

---@param owner any
---@param child ActionList | nil
---@return ActionList
function override.new(owner, child)
    if child then isTypeErr(child, ActionList, 'child') end

    local instance = child or Class.allocate(ActionList)
    private.newData(instance, owner)

    return instance
end

--========
-- Public
--========

---@param callback Callback
---@return Action
function public:add(callback)
    isTypeErr(callback, 'function', 'callback')
    local priv = private.data[self]

    local action = Action.new(callback, priv.owner)
    table.insert(priv.actions, action)

    return action
end

---@param action Action
---@return boolean
function public:remove(action)
    isTypeErr(action, Action, 'action')

    local priv = private.data[self]
    if action:getOwner() ~= priv.owner then return false end

    for i = 1, #priv.actions do
        if priv.actions[i] == action then
            table.remove(priv.actions, i)
            return true
        end
    end

    return false
end

---@param pos number
---@return Action | nil
function public:get(pos)
    return private.data[self].actions[pos]
end

---@return number
function public:count()
    return #private.data[self].actions
end

--- Remove all actions from list.
function public:clear()
    private.data[self].actions = {}
end

--- Run all actions.
---@return table<Action, any>
function public:run(...)
    local priv = private.data[self]

    local res = {}
    for i = 1, #priv.actions do
        res[priv.actions[i]] = priv.actions[i]:run(...)
    end

    return res
end

--=========
-- Private
--=========

private.data = setmetatable({}, {__mode = 'k'})

---@param self ActionList
---@param owner any
function private.newData(self, owner)
    local priv = {
        owner = owner,
        actions = {}
    }
    private.data[self] = priv
end

return static
» Trigger
--=========
-- Include
--=========

local lib_path = Lib.curPath()
local lib_dep = Lib.curDepencies()

local Class = lib_dep.Class or error('')
---@type UtilsLib
local UtilsLib = lib_dep.Utils or error('')
local ActionList = UtilsLib.ActionList or error('')
local isTypeErr = UtilsLib.isTypeErr or error('')

---@type HandleClass
local Handle = require(lib_path..'Base') or error('')

--=======
-- Class
--=======

local Trigger = Class.new('Trigger', Handle)
---@class Trigger : Handle
local public = Trigger.public
---@class TriggerClass : HandleClass
local static = Trigger.static
---@type TriggerClass
local override = Trigger.override
local private = {}

--========
-- Static
--========

---@param child Trigger | nil
---@return Trigger
function override.new(child)
    if child then isTypeErr(child, Trigger, 'child') end

    local instance = child or Class.allocate(Trigger)
    instance = Handle.new(CreateTrigger(), DestroyTrigger, instance)
    private.newData(instance)

    return instance
end

--========
-- Public
--========

---@param callback Callback
---@return Action
function public:addAction(callback)
    return private.data[self].action_list:add(callback)
end

---@param action Action
---@return boolean
function public:removeAction(action)
    return private.data[self].action_list:remove(action)
end

---@return number
function public:countActions()
    return private.data[self].action_list:count()
end

---Function removes all actions from trigger without removing trigger.
function public:clearActions()
    private.data[self].action_list:clear()
end

---Function executes trigger like event do.
function public:execute()
    TriggerExecute(self:getData())
end

---@param var_name string
---@param opcode limitop
---@param limitval number
function public:addVariableEvent(var_name, opcode, limitval)
    isTypeErr(var_name, 'string', 'var_name')
    isTypeErr(opcode, 'limitop', 'opcode')
    isTypeErr(limitval, 'number', 'limitval')
    TriggerRegisterVariableEvent(self:getData(), var_name, opcode, limitval)
end

---@param timeout number
---@param periodic boolean
function public:addTimerEvent(timeout, periodic)
    TriggerRegisterTimerEvent(self:getData(), timeout, periodic)
end

---@param timer timer
function public:addTimerExpireEvent(timer)
    TriggerRegisterTimerExpireEvent(self:getData(), timer)
end

---@param game_state gamestate
---@param opcode limitop
---@param limitval number
function public:addGameStateEvent(game_state, opcode, limitval)
    TriggerRegisterGameStateEvent(self:getData(), game_state, opcode, limitval)
end

---@param dialog dialog
function public:addDialogEvent(dialog)
    TriggerRegisterDialogEvent(self:getData(), dialog)
end

---@param button button
function public:addDialogButtonEvent(button)
    TriggerRegisterDialogButtonEvent(self:getData(), button)
end

---@param game_event gameevent
function public:addGameEvent(game_event)
    TriggerRegisterGameEvent(self:getData(), game_event)
end

---@param region region
function public:addEnterRegion(region)
    TriggerRegisterEnterRegion(self:getData(), region)
end

---@param region region
function public:addLeaveRegion(region)
    TriggerRegisterLeaveRegion(self:getData(), region)
end

---@param trackable trackable
function public:addTrackableHitEvent(trackable)
    TriggerRegisterTrackableHitEvent(self:getData(), trackable)
end

---@param trackable trackable
function public:addTrackableTrackEvent(trackable)
    TriggerRegisterTrackableTrackEvent(self:getData(), trackable)
end

---@param player_event_type playerevent
---@param player player
function public:addPlayerEvent(player_event_type, player)
    TriggerRegisterPlayerEvent(self:getData(), player, player_event_type)
end

---@param player_unit_event playerunitevent
---@param player player
function public:addPlayerUnitEvent(player_unit_event, player)
    TriggerRegisterPlayerUnitEvent(self:getData(), player, player_unit_event, nil)
end

---@param player player
---@param alliancetype alliancetype
function public:addPlayerAllianceChange(player, alliancetype)
    TriggerRegisterPlayerAllianceChange(self:getData(), player, alliancetype)
end

---@param player player
---@param player_state playerstate
---@param opcode limitop
---@param limitval number
function public:addPlayerStateEvent(player, player_state, opcode, limitval)
    TriggerRegisterPlayerStateEvent(self:getData(), player, player_state, opcode, limitval)
end

---@param player player
---@param message string
---@param exact_match boolean
function public:addPlayerChatEvent(player, message, exact_match)
    TriggerRegisterPlayerChatEvent(self:getData(), player, message, exact_match)
end

---@param widget widget
function public:addDeathEvent(widget)
    TriggerRegisterDeathEvent(self:getData(), widget)
end

---@param unit unit
---@param unit_state unitstate
---@param opcode limitop
---@param limitval number
function public:addUnitStateEvent(unit, unit_state, opcode, limitval)
    TriggerRegisterUnitStateEvent(self:getData(), unit, unit_state, opcode, limitval)
end

---@param unit_event unitevent
---@param unit unit
function public:addUnitEvent(unit_event, unit)
    TriggerRegisterUnitEvent(self:getData(), unit_event, unit)
end

---@param unit unit
---@param range number
function public:addUnitInRange(unit, range)
    TriggerRegisterUnitInRange(self:getData(), unit, range)
end

---@param frame framehandle
---@param frame_event frameeventtype
function public:addFrameEvent(frame, frame_event)
    BlzTriggerRegisterFrameEvent(self:getData(), frame, frame_event)
end

---@param player player
---@param prefix string
---@param from_server boolean
function public:addPlayerSyncEvent(player, prefix, from_server)
    BlzTriggerRegisterPlayerSyncEvent(self:getData(), player, prefix, from_server)
end

---@param player player
---@param key oskeytype
---@param meta_key integer
---@param key_down boolean
function public:addPlayerKeyEvent(player, key, meta_key, key_down)
    BlzTriggerRegisterPlayerKeyEvent(self:getData(), player, key, meta_key, key_down)
end

--=========
-- Private
--=========

private.data = setmetatable({}, {__mode = 'k'})

---@param self Trigger
function private.newData(self)
    local priv = {
        action_list = ActionList.new()
    }
    private.data[self] = priv

    TriggerAddAction(self:getData(), function() priv.action_list:run() end)
end

return static

Но тут ничего не понятно стороннему человеку, как мне кажется.
Nelloy #10 - 1 месяц назад (изм. ) 0
Голосов: +0 / -0

» WarCraft 3 Reforged / Дебаггер Lua

Bergi_Bear, Да будет молчать, но pcall требует накладных расходов. Я ее использую немного по-другому, и заметил, что достаточно сильно пролагивает при выдаче ошибки с вложенностью больше 3. А значит функция не бесплатная.
Nelloy #11 - 1 месяц назад 0
Голосов: +0 / -0

» WarCraft 3 Reforged / Дебаггер Lua

Еще флаг дебага добавил бы, а так супер
Nelloy #12 - 2 месяца назад 0
Голосов: +0 / -0
Nelloy #13 - 4 месяца назад 0
Голосов: +0 / -0

» WarCraft 3 Reforged / [lua] Каст бар

Bergi_Bear, создание фрейма лучше перенести в инициализацию, а при необходимости его прятать/показывать.
Nelloy #14 - 4 месяца назад 3
Голосов: +3 / -0

» WarCraft 3 Reforged / Несколько вопросов об утечках

1, 2. Утечки бывают разные, какие-то более тяжелые, какие-то менее. Стоит попробовать потестить на слабом компе, например в VirtualBox. А стоит ли это фиксить зависит от длительности сессии игры.
  1. Насколько знаю - нет.
  2. Хендл - ССЫЛКА на почти любой объект на карте: юниты, декорации и даже элементы интерфейса, в т.ч. стандартные. Счетчик лишь показывает количество этих ссылок. Утечками же можно считать только необоснованное увеличение их количества. Чаще всего это вызвано тем, что остались ссылки на пустые объекты.
Nelloy #15 - 4 месяца назад (изм. ) 0
Голосов: +0 / -0

» WarCraft 3 Reforged / Цикл от 1 до 5 не всегда до 5-ти

Дело в недостатке вашего понимая. Выложите кусок кода или скриншот с проблемной частью триггера, тогда можно будет поговорить предметно.
Nelloy #16 - 4 месяца назад 0
Голосов: +0 / -0

» WarCraft 3 Reforged / Экспорт/импорт информации между картой и сервером

Теоретически в плюс к хостботу можно сделать генерацию .bat файла ( с накоплением статистики по всем играть с участием данного игрока) и просить игроков его запустить для отправки статистики и/или для заявки на бан игрока.
Nelloy #17 - 7 месяцев назад 1
Голосов: +1 / -0
Nelloy #18 - 8 месяцев назад (изм. ) 0
Голосов: +0 / -0

» WarCraft 3 Reforged / Какая проверка будет наиболее подходящей выхода юнита из круга

Можно заполнить этот "овал" регионами с пересечениями. При входе в регион добавлять к счетчику для юнита +1, при выходе -1. Тогда если юнит не находится ни в одном регионе, его счетчик равен 0. А пронумеровав регионы степенями двойки и прибавляя/вычитая эти номера из счетчика можно еще и определить последний регион в котором был юнит.
Если твоя арена имеет форму близкую к овалу, можно использовать формулу для эллипса. Точно не припомню, но надо найти константы двух его фокусов и его "радиус", а условием пребывания юнита внутри эллипса будет что сумма расстояний до этих фокусов меньше, чем "радиус" эллипса.
Nelloy #19 - 8 месяцев назад (изм. ) 0
Голосов: +0 / -0

» WarCraft 3 Reforged / что то не так с LUA

Pashka5, немного упростил. Для того чтобы протестировать функцию, нужно вызвать savetyRun(функция, ее аргументы), тогда при получении ошибки она будет напечатана в чат. Если в последних патчах попробовать вызвать функцию collectgarbage, то получишь однозначный ответ, что ее не существует.
P.S. внутри pcall удобно использовать функцию error, про нее можно почитать в мануалах к луа

Например, savetyRun(collectgarbage, "collect")
Nelloy #20 - 8 месяцев назад (изм. ) 0
Голосов: +0 / -0

» WarCraft 3 Reforged / что то не так с LUA

В патче 1.32 ликвидировали ручной сборщик мусора

Чтобы увидеть ошибку можно использовать обертку
function savetyRun(func,...)
        local success, result = pcall(func, ...)
        if success then
            return result
        else
            print(result)
        end
end
Nelloy #21 - 8 месяцев назад (изм. ) 0
Голосов: +0 / -0

» WarCraft 3 Reforged / lua переменная и таблица

Pashka5, можно так:
local TABLE
function someFunction()
    TABLE = TABLE or {}
    for i=0,10 do
        TABLE[i]="assa"
    end
end
Таким образом если TABLE == nil, будет инициализирована новая таблица. Но не стоит экономить на спичках во время пожара.
Nelloy #22 - 8 месяцев назад 0
Голосов: +0 / -0

» WarCraft 3 Reforged / Проверка приближения даммика

Borodach, тогда лучше давать абилку с нужной дальностью и отлавливать ее
Nelloy #23 - 8 месяцев назад 0
Голосов: +0 / -0

» WarCraft 3 Reforged / Релиз Reforged, оценки метакритиков, блогеры не могут ошибаться

PornoMishka, отсутсвие сохранений - главная проблема, например, в SunkenCity уже не поиграешь...
Nelloy #24 - 8 месяцев назад 0
Голосов: +0 / -0

» WarCraft 3 Reforged / Релиз Reforged, оценки метакритиков, блогеры не могут ошибаться

Zetox, не проверял, но слышал можно. И виртуалка не нужна, теперь можно несколько окон открывать
Nelloy #25 - 9 месяцев назад 0
Голосов: +0 / -0

» WarCraft 3 Reforged / garbagecollect

prog, хм... Даже в голову не приходило, пожалуй при таком раскаде вовсе откажусь от автосборки такого мусора
Nelloy #26 - 9 месяцев назад 0
Голосов: +0 / -0

» WarCraft 3 Reforged / Новые туториалы

Туториалов по lua в сети много, и Nazar регулярно добавляет наглядные примеры в наработки.
Nelloy #27 - 9 месяцев назад 0
Голосов: +0 / -0

» WarCraft 3 Reforged / ООП lua

NazarPunk, да, ООП ради ООП. Да он только создает лишнюю нагрузку и да в wc3 можно спокойно жить без него. Вообще ООП нахер не нужен и иногда только усложняет. Мне так проще видеть структуру проекта и определять необходимый функционал, плюс это ограничивает некоторые мои ошибки. Зачем используется, например, glib? Который вообще весьма уродлив, на мой взгляд.
Nelloy #28 - 9 месяцев назад (изм. ) 0
Голосов: +0 / -0

» WarCraft 3 Reforged / ООП lua

ScorpioT1000, в луа это можно решить либами на основе таблиц. Тут больше в мировоззрении дело и в поставленной задаче. Где-то удобнее ООП, где-то функциональное...
Nelloy #29 - 9 месяцев назад (изм. ) 0
Голосов: +0 / -0

» WarCraft 3 Reforged / ООП lua

ScorpioT1000, да, было бы неплохо всю инфу по lua разжевать и залить в одно место. А я только пару дней назад узнал, что у функции error есть второй параметр, который крайне необходим в реалиях wc3
Nelloy #30 - 9 месяцев назад 0
Голосов: +0 / -0

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

NazarPunk, и заряды в комплекте, отличный вариант
Nelloy #31 - 9 месяцев назад (изм. ) 0
Голосов: +0 / -0

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

Bergi_Bear, действительно, не пришло в голову... Можно попробовать на фреймы кнопок абилок повесить скрытие зарядов, а на кнопку 11 скрытие/показ в зависимости от текущего состояния. Но все эти навороты приводят к тому что через замену иконок проще, правда нужно много иконок.
Nelloy #32 - 9 месяцев назад 0
Голосов: +0 / -0

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

Bergi_Bear, если устраивает отображение зарядов только в случае выбора одного юнита, то можно сделать наследников параметров юнита, тогда они будут видны только одновременно с этим фреймом. Чтобы цифры не перекрывали кнопки, поставь им лвл меньше чем у кнопок. Но все равно придется детектить текущего выбранного юнита, чтобы знать чьи заряды отображать, но там ничего сложного через события SelecetedUnit и DeselectedUnit
Nelloy #33 - 9 месяцев назад 0
Голосов: +0 / -0

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

ScorpioT1000, да, иначе код будет работать только на третью ночь после Ивана Купалы.
Nelloy #34 - 9 месяцев назад 2
Голосов: +2 / -0

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

ScorpioT1000, проблема в том что нет ни одного способа, который однозначно даст верный результат
Nelloy #35 - 9 месяцев назад 0
Голосов: +0 / -0

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

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

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

ScorpioT1000, командная разработка - крайне сложно огранизационно... Собрать команду, выбрать лидера, выбрать систему документирования кода. На данный момент ни EmmyLua, ни Lua 0.15.4 от sumneko не дают необходимых инструментов. Необходимо совместно разработать стандарт кодирования. А люди на добровольных неоплачиваемых началах не склонных уделять достаточное время подобным вещам. Нам всем гораздо интереснее процесс созидания, нежели грамотная его организация. А в связи с тем что сейчас идет бета тестирование, все разработанное может устареть с выходом релиза или даже просто нового патча.
Nelloy #37 - 9 месяцев назад (изм. ) 0
Голосов: +0 / -0

» WarCraft 3 Reforged / [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',}
Nelloy #38 - 9 месяцев назад (изм. ) 0
Голосов: +0 / -0

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

tysch_tysch, лови) С ограничениями, но с compiletime функцией, если есть интерес к подобному могу выложить еще и либу по редактированию w3u и w3a
Прикрепленные файлы
Nelloy #39 - 10 месяцев назад 0
Голосов: +0 / -0

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

Koladik, за пределами холста 0.8х0.6 могут быть только SIMPLEFRAME, SIMPLEBUTTON, SIMPLESTATUSBAR и SIMPLECHECKBOX(нерабочий).
Nelloy #40 - 10 месяцев назад 0
Голосов: +0 / -0

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

Мне известен только костыльный метод... Делать на основе SIMPLEFRAME , а анимацию проигрывать таймером, заменяя текстуру
Nelloy #41 - 10 месяцев назад 0
Голосов: +0 / -0

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

Любопытно... Я бы тогда менял описание юнита а золото снимал триггерно
Nelloy #42 - 10 месяцев назад 0
Голосов: +0 / -0

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

А разве BlzSetUnitIntField не работает? С критами и уворотами в абилках у меня работало
Nelloy #43 - 10 месяцев назад 1
Голосов: +1 / -0

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

Видимо у спосбности много уровней. Чтобы избежать микрофриза при получении, создайте юнита в начале игры, дайте ему способность и удалите его.
Nelloy #44 - 11 месяцев назад 1
Голосов: +1 / -0

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

Я бы посоветовал попробовать разделить скрипты на отдельные элементы, не привязанные к конкретному игроку
Nelloy #45 - 11 месяцев назад 0
Голосов: +0 / -0

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

Drulia_san, написать систему хештаблиц на языке основанном на хештаблицах...
Nelloy #46 - 11 месяцев назад 0
Голосов: +0 / -0

» WarCraft 3 Reforged / 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
Nelloy #47 - 1 год назад 0
Голосов: +0 / -0

» WarCraft 3 Reforged / constant native Convert...

То есть теоретически на этой основе можно сделать мемхак для 1.29+ ?
Nelloy #48 - 1 год назад (изм. ) 2
Голосов: +2 / -0

» WarCraft 3 Reforged / [lua] Фрэймы

Отличный набор инфы по UI !
Прикрепленные файлы
Nelloy #49 - 1 год назад (изм. ) 0
Голосов: +0 / -0
Nelloy #50 - 1 год назад 0
Голосов: +0 / -0

» WarCraft 3 Reforged / BLP -> PNG/JPG консольный конвертер

PT153, например, чтобы ресурсы автоматически внутри ide конвертировать