Цербер, я тебя однажды покусаю. Я три часа искал ошибку деления на ноль, на которую указывал мне редактор и оббежал весь код в проекте вообще. Потом вспомнил про твой скрипт показа деталей ошибки, поставил его и понял, что он тоже не слишком помогает делу.
Но затем я добавил в твой скрипт всего пару строк и смог и ошибку найти, и решение придумать, и в деревне в огороде картошку прополоть, и даже избу себе из веников построить.
Скопирую сюда чудесный фикс, который показывает код команды, которую выполнял ивент и на которой он запоролся и параметры этой команды. Возможно, кто-нибудь не станет лениться и сделает ковертор номеров команд в названия этих самых команд, но я не стал этого делать.
# Отлов ошибок в скрипте, вызываемом из события
# скопировано у DeadElf79
# код, ставящий в соответствие номеру скрипта его название
scripts=load_data('Data/Scripts.rvdata2')
$script_names=[]
scripts.each{ |item|
$script_names+=[item[1]]
}
# дополнение для ядра
# буду признателен, если мне помогут это сделать удачнее
module Kernel
def err_conv(backtrace)
res = ""
backtrace.each {|line|
line.gsub!(/\{(\d+)\}/) {|s| $script_names[$1.to_i] + " " }
res += line + "\n"
}
return res
end
end
#==============================================================================
# ** Game_Interpreter
#------------------------------------------------------------------------------
# An interpreter for executing event commands. This class is used within the
# Game_Map, Game_Troop, and Game_Event classes.
#==============================================================================
class Game_Interpreter
# специально для interpreter-а переопределяем eval
alias rescued_eval eval
def eval(script)
script = "begin\n" + script + "\nrescue Exception=>e\n"
script += "raise e.class.to_s + \"\n\" + e.message + \"\n\" + err_conv(e.backtrace)\nend"
begin
rescued_eval(script)
rescue Exception=>e
print e.message
line = "Ошибка в событии #@event_id на карте #@map_id"
line += ", в строке #@index\n"
event_code = $game_map.events[@event_id].list[@index].code
event_params = $game_map.events[@event_id].list[@index].parameters.join(", ")
line += "(код команды: #{event_code}, #{event_params})\n"
if $TEST
line += "Проверьте консоль игры - там будут указаны детали ошибки"
end
raise(line)
end
end
end
#==============================================================================
# ** Game_Character
#------------------------------------------------------------------------------
# A character class with mainly movement route and other such processing
# added. It is used as a super class of Game_Player, Game_Follower,
# GameVehicle, and Game_Event.
#==============================================================================
class Game_Character < Game_CharacterBase
# специально для interpreter-а переопределяем eval
alias rescued_eval eval
def eval(script)
script = "begin\n" + script + "\nrescue Exception=>e\n"
script += "raise e.class.to_s + \"\n\" + e.message + \"\n\" + err_conv(e.backtrace)\nend"
begin
rescued_eval(script)
rescue Exception=>e
print e.message
line = "Ошибка в событии #@event_id на карте #@map_id"
line += ", в строке #@index\n"
event_code = $game_map.events[@event_id].list[@index].code
event_params = $game_map.events[@event_id].list[@index].parameters.join(", ")
line += "(код команды: #{event_code}, #{event_params})\n"
if $TEST
line += "Проверьте консоль игры - там будут указаны детали ошибки"
end
raise(line)
end
end
end