Добавлен , опубликован
Для какой версии: 131+
Для какого языка: Lua
Назначение: Выводит сообщения об ошибке, причину и номер строчки в файле war3map.lua, где искать ошибку
Содержание:
local realTimerStart = TimerStart
TimerStart = function(timer, duration, repeating, callback)
	local pcallback = function()
		if callback == nil then return end
		local status, err = pcall(callback)
		if not status then
			print(err)
		end
	end
	realTimerStart(timer, duration, repeating, pcallback)
end

local realTriggerAddAction = TriggerAddAction
TriggerAddAction = function(trig, callback)
	local pcallback = function()
		local status, err = pcall(callback)
		if not status then
			print(err)
		end
	end
	realTriggerAddAction(trig, pcallback)
end
Установка: Скопировать код себе в карту в любое место
Примеры использования:
Пример №1
Делаем намеренную и частую ошибку, например забыли передать аргумент
A=nil+1
Предположим, у нас есть простенькая или не очень функция с кучей аргументов или минимум двумя
function sum(a,b)
	return a+b
end
Она понятно что делает, это просто пример и вот мы хотим её использовать
print(sum(1))
И ой, кажется случайно забыли передать второй аргумент, ни родной редактор ни vscode ни idea в режиме луа не выдадут никакой ошибки, потому что луа - язык с динамической типизаций, вот они проблемы это типизации. Надо быть на 200% внимательным чтобы не совершать таких ошибок.
По факту код без аргумента превращается в
print(sum(1,nil))
А внутри происходит
return a+nil
Что равно просто остановке выполнения потока, а чё-то мой код сохранился без ошибок, а карта не работает
А вот и то самое сообщение, где искать ошибку и почему она произошла
Карта от этого особо не сломается, но большое накопление таких ошибок способно вызывать фаталы или же десинхронизацию, особенно если поток прерывает внутри действий локального игрока
Пример №2
Поменяем аргументы в функции местами (случайно, по запаре, а последний вообще забудем написать)
Верный код
CreateUnit(Player(0),FourCC('hpea'),0,0,180)
Наш код с ошибкой
CreateUnit(FourCC('hpea'),Player(0),0,0)
Ну и разумеется получаем ошибку, что неправильно передали игрока, в какой строке и в каком аргументе
код для теста
function sum(a,b)
	return a+b
end
do --Инициализация
	TimerStart(CreateTimer(), 0.1, false, function()
		print(sum(1))
		--CreateUnit(Player(0),FourCC('hpea'),0,0,180)
		--CreateUnit(FourCC('hpea'),Player(0),0,0)
	end)
end
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
29
GetLocalPlayer:
это просто провал.
Этот "провал" называется полиморфизмом. Причем истинной формой полиморфизма.
Нет не называется, причем тут полиморфизм?

Sergarr:
Я, конечно, знал, что динамическая типизация - это зло, но то, что Lua скомпилирует и запустит без выдачи ошибок функцию с заведомо недостаточным числом аргументов - это просто провал. Как такими языками программирования можно пользоваться в 2020-м году? Это, типа, фича такая, чтобы люди на грабли наступали побольше?
Т.к. синтаксического различия между обращением к локальной и глобальной переменной нет, то в случае несуществующей локальной переменной идет обращение к глобальной таблице переменных _G. На этапе компиляции нельзя понять есть или нет там определенная переменная.
22
ну а есть и продвинутый консоль для тестирование в игре
github.com/warcraft-iii/lib-console чтобы такой применить нужен установить github.com/warcraft-iii/warcraft-vscode в vscode и установить зависимость консоль
Не для слабонервных конечно =)

Тогда и можно ввыбрать из vscode режит разработчика или релиз
во время релиз убирает все рутинные работы проверка кода и всякие фичи в оптимизацию

А также укажет именно на файл где вы работаете src с нужным номер ошибки чем искать в итоговый результат в карте.

например main.lua ошибка будет там указано номер ошибки как и ты открыл редактор и писал
4
Почему при добавлении этого кода появляется такая странная ошибка? Причем тут стартовые локации? И ведь есть же endblock?
Загруженные файлы
4
prog:
Никита21, у вас карта точно в Lua режиме?
а как узнать? Карту отдал Anufis, я захотел починить под рефордж, там половина триггеров гуи, половина луа
24
Никита21, возможно, вы путаете lua и jass, это два разных языка. В картах до рефоржа не было и не могло быть lua. Переключение карты между jass и lua делается в настройках карты. Одновременно jass и lua в одной карте работать не могут и переключение между режимами возможно только если в карте нет кода в активных триггерах - если переводить уже существующую карту, то сперва делается переключение режима при удаленных/отключенных триггерах, потом переносятся триггеры и потом переписывается jass код в lua код вручную.
4
Все я понял, я действительно перепутал, карта сделана на jass, спасибо огромное!)

а может вы знаете, есть ли способ или утилита, узнать в каком месте возникает ошибка если карта крашится? При условии что карта сделала на jass под 1.26, а запустить её надо в рефордже
33
алгоритмы поиска крашей для рефорджа такие же как и для 126 патча. И этому посвящено последние 15 лет этого
сайта. Советую начать xgm.guru/p/wc3/articles, если делать как там написано, то крашей у вас не будет
4
Bergi_Bear:
алгоритмы поиска крашей для рефорджа такие же как и для 126 патча. И этому посвящено последние 15 лет этого
сайта. Советую начать xgm.guru/p/wc3/articles, если делать как там написано, то крашей у вас не будет
мне дали открытую карту с 1.26, которую я пытаюсь сделать рабочей на рефордже. В самой карте была сложная система автоматической загрузки персонажа через подключение локальных файлов. Систему загрузки я убрал и вот теперь пытаюсь дальше понять что еще может быть не так. Мемхака в карте нет
33
Но все эти проблемы не имеют никакого отношения к данной теме
4
Bergi_Bear:
Но все эти проблемы не имеют никакого к данной теме
очень полезные ответы, спасибо
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.