30

» WarCraft 3 / [lua] Предотвращаем создание утечек GUI

Как закончишь с локациями, сделай убивание тупых BJ
Обязательно, одну уже переписал и заинлайнил функции, чтоб лишний раз не вызывать)
function CreateNUnitsAtLocFacingLocBJ(count, unitId, whichPlayer, loc, lookAt)
	GroupClear(lastCreatedGroup)
	local face = math.deg(math.atan(lookAt[2] - loc[2], lookAt[1] - loc[1]))
	for i = 1, count do
		lastCreatedUnit = CreateUnit(whichPlayer, unitId, loc[1], loc[2], face)
		GroupAddUnit(lastCreatedGroup, lastCreatedUnit)
	end
	return lastCreatedGroup
end
30

» WarCraft 3 / Нестандартные Модели.

Я уверен, что вы найдете решение проблемы.
Решение то прям на странице модели:
Чтобы использовать другую текстуру, переименуйте ее в BearSkinBrown.blp
У вас какой путь к текстуре в редакторе?
Загруженные файлы
30

» WarCraft 3 / [lua] Предотвращаем создание утечек GUI

Ты просто переписал код на JASS2 на Lua, функции же идентичны по что.
Копипастил всё подряд, потом уберу лишний вызов функции. PT153:
Нужно переделать AngleBetweenPoints()
Переделал уже
---@param locA table
---@param locB table
---@return real
function AngleBetweenPoints(locA, locB)
	return math.deg(math.atan(locB[2] - locA[2], locB[1] - locA[1]))
end
Я бы не стал пока так писать, потому что это лишь в теории. А для таких утверждений нужна практика.
Добавил волшебное слово "возможно"))
То предложение странно звучит, JASS2 тоже ЯП, так-то. Но у JASS2 нет функциональщины (как и у многих других ЯП), а в Lua есть.
Исправил.
30

» WarCraft 3 / [lua] Предотвращаем создание утечек GUI

Может, благодаря тому, что в lua есть функциональное программирование?
Может и по этому))
Всё же ты часть нативок превращаешь в код, что выполняется на виртуальной машине.
Но и часть BJ будет переписана, надеюсь в итоге будет плюс.
Create Units Facing Point
А в чём тут разница?
Разница с чем?
Неверное название статьи. Не удаляем, а предотвращаем их создание.
Исправил.
Передачу nil потерял, не?
Если не передавать аргумент, то функция примет nil, незачем лишний раз писать.
30

» WarCraft 3 / [lua] Предотвращаем создание утечек GUI

Автоматически удалям утечки Gui?
Ну да. Переопеделив функции так, что все объекты доступны сборщику мусора lua, можно не запариваться с утечками и тыкать в менюшечки))
30

» WarCraft 3 / ZinC: Кровавый взрыв

как мне туда подставить, не понимаю джасс
Я же функцию вывел, для удобства
// Проверка целей
    function checkTarget(unit caster, unit target) -> boolean {
        return (
			IsUnitEnemy(target, GetOwningPlayer(caster)) // <---------------------------- Цель враг
			&&
            !IsUnitType(target, UNIT_TYPE_UNDEAD) // Не нежить
            &&
            !IsUnitType(target, UNIT_TYPE_STRUCTURE) // Не здание
            &&
            !IsUnitType(target, UNIT_TYPE_MECHANICAL) // Не механический
            &&
            !IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) // Восприимчив к магии
        );
    }

функцию то вывел, а вот в коде она не использовалась. Исправил ресурс.
30

» WarCraft 3 / Размножение

Про версию, я бы предложил просто принять за данное, что речь идет о последней актуальной версии, если автором темы не указано иного.
Я даю ответы исходя из этого, но есть же ещё вариант jass/lua
30

» WarCraft 3 / Набор предметов для проэкта "Последняя Надежда"

Меня эти переменые мозок ломают.
Что в переменных такого сложного, чтоб они мозг ломали?
30

» WarCraft 3 / Набор предметов для проэкта "Последняя Надежда"

даммикаст при физической атаке
Нужно по возможности избегать даммикаста, да и событие при атаке довольно заезжено.
надо описание поменять
С описанием предметов/заклинаний и прочего я не особо дружу, поэтому просто буду копировать предложенное из комментариев))
Шикарно).
Как видите, код там простой и на lua намного проще делать заклинания, чем на GUI.
30

» WarCraft 3 / Триггерный спелл с действием только на определённый тип юнитов

Принятый ответ
Я смотрел, и такого условия у меня нет.
Меньше корявыми русификаторами нужно пользоваться, оно находится здесь:
Загруженные файлы
30

» WarCraft 3 / Эволюция юнита через проверку уровня

предыдущий способ это был яркий пример овероптимизации а на событии происходящем достаточно редко
Можно и по старинке без оптимизаций))
TriggerAddAction(levelTrigger, function()
	local hero   = GetTriggerUnit()
	local heroId = GetUnitTypeId(hero)
	local level  = GetUnitLevel(hero)
	
	if heroId == FourCC('Her0') and level >= 3 then
		MorphUnitTo(hero, FourCC('Her1'))
	elseif heroId == FourCC('Her1') and level >= 5 then
		MorphUnitTo(hero, FourCC('Her2'))
	elseif heroId == FourCC('Her2') and level >= 7 then
		MorphUnitTo(hero, FourCC('Her3'))
	end
end)
я делал в качестве способностей порядок равкода
Мне тоже лень заполнять простыни баз данных и если есть возможность, то использую магию равкодов)
8gabriel8:
NazarPunk, а если temp не создавать и удалять, то морфа не будет?
Ой, дошло. Не для каждого уровня есть равкод.
Можно скомбинировать способы
MORPH                     = {}
MORPH[FourCC('Her1') + 3] = true
MORPH[FourCC('Her3') + 5] = true
MORPH[FourCC('Her7') + 7] = true

TriggerAddAction(levelTrigger, function()
	local hero    = GetTriggerUnit()
	local newHero = MORPH[GetUnitTypeId(hero) + GetUnitLevel(hero)]
	if newHero ~= nil then
		MorphUnitTo(hero, newHero)
	end
end)
А вместо true можно записать что-то полезное.
30

» WarCraft 3 / Эволюция юнита через проверку уровня

хорошее решение, но мне что-то не нравится
Тогда можно использовать магию равкодов)
TriggerAddAction(levelTrigger, function()
	local hero    = GetTriggerUnit()
	local newHero = GetUnitTypeId(hero) + GetUnitLevel(hero)
	local temp    = CreateUnit(newHero, Player(PLAYER_NEUTRAL_PASSIVE), 0, 0, 0);
	if temp ~= nil then
		RemoveUnit(temp)
		MorphUnitTo(hero, newHero)
	end
end)
30

» WarCraft 3 / Эволюция юнита через проверку уровня

то есть нужно по триггеру с уровнем для каждого типа юнитов
Можно не плодить триггеры и просто заполнить таблицу
MORPH                 = {}
MORPH[FourCC('Her0')] = { [3] = FourCC('Her1') }
MORPH[FourCC('Her1')] = { [5] = FourCC('Her2') }
MORPH[FourCC('Her3')] = { [7] = FourCC('Her4') }

TriggerAddAction(levelTrigger, function()
	local hero    = GetTriggerUnit()
	local newHero = MORPH[GetUnitTypeId(hero)][GetUnitLevel(hero)]
	if newHero ~= nil then
		MorphUnitTo(hero, newHero)
	end
end)
30

» WarCraft 3 / Размножение

то можно сделать скрытый спеллбук с аурой восстановления маны
На последнем патче можно вообще не заморачиваться со способностями, а просто менять поле UNIT_RF_MANA_REGENERATION.
30

» WarCraft 3 / Эволюция юнита через проверку уровня

Но он будет получать морф,при получении любого уровня,а мне нужно именно чтобы когда достигал определенного уровня он получал морф.
Так сложно дописать условие?
Действие:
если уровень = 3 морфим в это
если уровень = 5 морфим в то
если уровень = 7 морфим в сё
30

» WarCraft 3 / Размножение

Можно вообще не заморачиваться с бафом, а дать крестьянке способность завести ребетёнка и при касте на крестьянина таймером отсчитать кд и заспавнить ребёнка.
30

» WarCraft 3 / Можно ли уничтожить hashtable?

это лимит одновременных живых хеш таблиц или таблиц вообще включая убитые?
После InitHashtable() дороги назад нет, так что 257ой вызов просто не пройдёт.
нас просто в детстве (в 2007 или когда там хештаблицы появились) , запугали, что больше 1 нельзя и так пошло, но уже никто и не вспомнит почему
Насколько я помню из-за того что таблица тяжёлая и с её огромным диапазоном значений делать несколько просто нет смысла. Есть даже наработка которая позволяет иметь одну таблицу на все случаи жизни.
30

» WarCraft 3 / Можно ли уничтожить hashtable?

Ну если ты скажешь как перевести полторы сотни тысяч строк кода cJass на луа с сохранением комментариев, имен переменных и отступов, то буду рад перейти на луа
Достать war3map.j, сконвертировать в lua, ужаснуться кривости кода и переписать начисто.
Сколько раз мне написать что мне нужна отдельная таблица на каждый экземпляр структуры, и даже на каждый массив внутри структуры
Не забывайте о лимите в 256 таблиц на игру. А вообще такой подход очень пахнет велокостылями.
30

» WarCraft 3 / Размножение

Запускаете таймер и проверяете наличие бафа и текущую ману.
30

» WarCraft 3 / [lua] Двигаем снаряды

но лень и хочу подождать выхода ремастера
лень злая штука, а вот врятли в ремастере сильно что-то изменится.
Вообще, странно, что за 17 лет игры об этом мало информации.
Так потому-что никто статьи не пишет, последняя статья от 26.06.2017 JASS: Курс молодого бойца и новичёк при прочтении сломает себе мозг ещё в предисловии. Единственная информация о событиях была найдена здесь:
раскрыть
Unit - A unit Begins casting an ability – Это событие запускает триггер сразу же после каста спелла (Прим. перев. Мана еще не проплачена, кулдаун еще не начался). Это значит, что такое событие может и должно применяться только для запуска триггеров проверки дополнительных условий (проверка возможен ли каст в данный момент, например, расстояние между кастером и целью слишком мало и так далее). Если вы используете это событие как основное событие каста спелла, ловкие игроки получают возможность сжульничать и запустить триггер спелла, без начала кулдауна и проплаты маны.
Unit - A unit Starts the effect of an ability – Это событие запускает триггер в тот момент, когда спелл уже скастован, кулдаун уже начался и мана проплачена. Это событие идеально подходит для запуска триггера спелла.
Unit - A unit Finishes casting an ability – Это событие запускает триггер в момент, когда юнит завершил кастовать спелл. Это полезно в случаях когда, например, вам нужно удалить юнита, который скастовал определенный спелл, и вы хотите быть уверены, что эффект спелла появится. Например, вам нужно удалить юнита, кастующего спелл Heal, вы должны использовать именно это событие, иначе цель не будет вылечена.
30

» WarCraft 3 / Характеристика предмета

PT153, тоже о торнадо подумал, только там ещё нужно в разрешённых целях указать Сам воин.
Загруженные файлы