Добавлен , опубликован
Статья
Раздел:
Основы
Для какой версии: 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
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
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:
Но все эти проблемы не имеют никакого к данной теме
очень полезные ответы, спасибо
28
+ доказано что бульехкспры ничуть не быстрее
Где и кем? Я слышал обратное.
33
Я не прав, они быстрее, но на пол процента, и этим можно вообще пренебречь, откуда полпроцента? Сгрёб кучу инфы из чужих и своих тестов и проанализировал результат. Можно на это смело класть болт, если конечно нет желания делать карты под 121 патч и компы на Селеронах 1.7. Это оптимизация больного человека + ложные мнения гуру с XGM. Если хочешь провести тесты я только за, заодно развеим мою не правоту, я не гордый и легко признаю ошибку. Но не в этой теме. А так мне хвататет тестов Назара, которые показывают, что нет разницы вообще ни в чем
28
Bergi_Bear, так это было для фильтров групп, а не для условий. Это разные вещи. Насколько быстрее - сказать я не могу. Но TriggerEvalute точно быстрее, чем TriggerExecute, ибо второе обнуляет кол-во операций. Влияет ли это на скорость работы триггера во время срабатывания события - тоже вопрос.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.