Reactor Monitor v0.3.0 - bugfix release

Fixes applied to original code:
- instantiateControl: handle nil cfg (redstone mode "none")
- check(): preserve error message before reactor stops
- profile_count_mismatch: disable reactor and redstone, not zombie
- component.proxy pcall protection in MonitorWindow:onLoad
- instantiateItem nil guard
- App:start crash recovery with emergency shutdown
- emergencyShutdown method forces redstone off on fatal error

Co-Authored-By: Claude <noreply@anthropic.com>
@
This commit is contained in:
jiangchen
2026-07-21 22:38:40 +08:00
commit 40fa421f89
6 changed files with 5111 additions and 0 deletions
+12
View File
@@ -0,0 +1,12 @@
--[[
Copyright (c) 2025 Eming Kwok
This source code is licensed under the MIT license found in the
LICENSE file in the root directory of this source tree.
]]
return {
["English"] = "en",
["简体中文"] = "zh_CN",
default = "en"
}
+171
View File
@@ -0,0 +1,171 @@
--[[
Copyright (c) 2025 Eming Kwok
This source code is licensed under the MIT license found in the
LICENSE file in the root directory of this source tree.
]]
return {
['gregtech:gt.1080k_Space_Coolantcell'] = '1080K Sp coolant cell',
['gregtech:gt.180k_Helium_Coolantcell'] = '180K Helium coolant cell',
['gregtech:gt.180k_NaK_Coolantcell'] = '180K NaK coolant cell',
['gregtech:gt.180k_Space_Coolantcell'] = '180K Sp coolant cell',
['gregtech:gt.360k_Helium_Coolantcell'] = '360K Helium coolant cell',
['gregtech:gt.360k_NaK_Coolantcell'] = '360K NaK coolant cell',
['gregtech:gt.360k_Space_Coolantcell'] = '360K Sp coolant cell',
['gregtech:gt.540k_Space_Coolantcell'] = '540K Sp coolant cell',
['gregtech:gt.60k_Helium_Coolantcell'] = '60K Helium coolant cell',
['gregtech:gt.60k_NaK_Coolantcell'] = '60K NaK coolant cell',
['gregtech:gt.neutroniumHeatCapacitor'] = '1G neutronium heat capacitor',
['gregtech:gt.rodExcitedPlutonium'] = 'Fuel rod (excited plutonium)',
['gregtech:gt.rodExcitedPlutonium2'] = 'Double fuel rod (excited plutonium)',
['gregtech:gt.rodExcitedPlutonium4'] = 'Quad fuel rod (excited plutonium)',
['gregtech:gt.rodExcitedUranium'] = 'Fuel rod (excited uranium)',
['gregtech:gt.rodExcitedUranium2'] = 'Double fuel rod (excited uranium)',
['gregtech:gt.rodExcitedUranium4'] = 'Quad fuel rod (excited uranium)',
['gregtech:gt.rodGlowstone'] = 'Fuel rod (glowstone)',
['gregtech:gt.rodHighDensityPlutonium'] = 'Fuel rod (high density plutonium)',
['gregtech:gt.rodHighDensityPlutonium2'] = 'Double fuel rod (high density plutonium)',
['gregtech:gt.rodHighDensityPlutonium4'] = 'Quad fuel rod (high density plutonium)',
['gregtech:gt.rodHighDensityUranium'] = 'Fuel rod (high density uranium)',
['gregtech:gt.rodHighDensityUranium2'] = 'Double fuel rod (high density uranium)',
['gregtech:gt.rodHighDensityUranium4'] = 'Quad fuel rod (high density uranium)',
['gregtech:gt.rodMOX'] = 'Fuel rod (MOX)',
['gregtech:gt.rodMOX2'] = 'Double fuel rod (MOX)',
['gregtech:gt.rodMOX4'] = 'Quad fuel rod (MOX)',
['gregtech:gt.rodNaquadah'] = 'Fuel rod (Naquadah)',
['gregtech:gt.rodNaquadah2'] = 'Double fuel rod (Naquadah)',
['gregtech:gt.rodNaquadah32'] = 'The "core"',
['gregtech:gt.rodNaquadah4'] = 'Quad fuel rod (Naquadah)',
['gregtech:gt.rodNaquadria'] = 'Fuel rod (Naquadah*)',
['gregtech:gt.rodNaquadria2'] = 'Double fuel rod (Naquadah*)',
['gregtech:gt.rodNaquadria4'] = 'Quad fuel rod (Naquadah*)',
['gregtech:gt.rodThorium'] = 'Fuel rod (Thorium)',
['gregtech:gt.rodThorium2'] = 'Double fuel rod (Thorium)',
['gregtech:gt.rodThorium4'] = 'Quad fuel rod (Thorium)',
['gregtech:gt.rodTiberium'] = 'Fuel rod (Tiberium)',
['gregtech:gt.rodTiberium2'] = 'Double fuel rod (Tiberium)',
['gregtech:gt.rodTiberium4'] = 'Quad fuel rod (Tiberium)',
['gregtech:gt.rodUranium'] = 'Fuel rod (Uranium)',
['gregtech:gt.rodUranium2'] = 'Double fuel rod (Uranium)',
['gregtech:gt.rodUranium4'] = 'Quad fuel rod (Uranium)',
['IC2:reactorVentCore'] = 'Reactor vent',
alert_message = 'Message',
alert_title = 'Alert',
backup_saved = 'Backup saved',
black = 'Black',
blue = 'Blue',
brown = 'Brown',
builtin_schemas = 'Builtin schemas',
cancel = 'Cancel',
change_condition = 'Change if',
change_condition_damage_less = 'damage less than',
change_condition_none = 'never',
component_address = 'Address',
confirm_delete = 'Confirm',
confirm_exit = 'Confirm',
copy = 'Copy',
create_new = '<create...>',
cyan = 'Cyan',
delete = 'Delete',
disabled = 'Disabled',
discard_and_exit = 'Discard and exit',
down = 'Down',
east = 'East',
edit = 'Edit',
enabled = 'Enabled',
global_control = 'Global control',
gray = 'Gray',
green = 'Green',
height = 'Height',
input_prompt_instance_name = 'Input reactor name',
input_prompt_max_heat = 'Input maximum heat temp (0-10000)',
input_prompt_min_heat = 'Input minimum heat temp (0-10000)',
input_prompt_schema_name = 'Input schema name',
input_prompt_schema_width = 'Input schema width (3-9)',
input_prompt_schema_height = 'Input schema height (6) (not used)',
input_prompt_threshold = 'Input durability threshold (0.0-1.0)',
instance_config = 'Edit reactor',
instance_name = 'Name',
invalid_command = 'Unsupported command: %s',
invalid_schema = 'Unsupported schema: %s',
item_config = 'Edit item',
item_input_side = 'Item input from',
item_name = 'Item',
item_output_side = 'Item output to',
item_reactor_side = 'Reactor side',
item_shortage = 'Missing item %s',
keyboard_tips_run = '[R]Run [S]Stop [Q]Stop and exit',
keyboard_tips_setup = '[←↑→↓]Select [Enter]Confirm [Q]Discard and exit',
language = 'language',
lightblue = 'Light blue',
lime = 'Lime',
magenta = 'Magenta',
max_heat_temp = 'Max heat temp',
min_heat_temp = 'Min heat temp',
name = 'Name',
name_copy = 'copy',
no_profile = 'No profile %s',
no_valid_config = 'No reactor instances are configured.\nPress any key to configure...',
none = 'none',
north = 'North',
not_configured = 'Not configured',
ok = 'OK',
orange = 'Orange',
output_full = 'Output item container is full',
pink = 'Pink',
profile_config = 'Edit profile',
profile_cooldown = 'Cooling profile',
profile_count_mismatch = 'Reactor slot count less than configuration',
profile_heatup = 'Heating profile',
profile_name_cooldown = '[Cooldown]',
profile_name_heatup = '[Heatup]',
profile_name_working = '[Working]',
profile_working = 'Working profile',
prompt_backup = 'Old config backup to file %s',
prompt_confirm_delete = 'Really delete %s ?',
prompt_confirm_exit = 'Really exit?',
purple = 'Purple',
reactor_address = 'Reactor address',
reactor_state_applying = 'Changing items',
reactor_state_error = 'Error: %s',
reactor_state_running = 'Running %s',
reactor_state_stopped = 'Stopped',
red = 'Red',
redstone_color = 'Signal color',
redstone_config = 'Redstone configuration',
redstone_control = 'Redstone',
redstone_direction = 'Signal direction',
redstone_mode = 'Mode',
redstone_mode_bundled = 'ProjectRed bundled',
redstone_mode_none = 'Don\'t use',
redstone_mode_vanilla = 'Vanilla',
save_and_exit = 'Save and exit',
schema = 'Schema',
schema_config = 'Edit schema',
schema_name_single = 'Single item',
schema_name_vacuum = 'Vacuum',
select_schema = 'Select a schema',
silver = 'Silver',
south = 'South',
sync_shutdown = 'Sync shutdown',
tab_general = 'General',
tab_reactors = 'Reactors',
tab_save = 'Save & Exit',
tab_schemas = 'Schemas',
threshold = 'Threshold',
title_config_app = 'Reactor Monitor v%s - Configure',
title_monitor_app = 'Reactor Monitor v%s - Run',
transposer = 'Transposer',
transposer_config = 'Edit transposer',
unsupported_control = 'Unsupported redstone control mode: %s',
unsupported_item_check = 'Unsupported item change condition: %s',
up = 'Up',
usage = 'Usage: reactor [COMMAND] [OPTION...]\n\nAvailable COMMANDs:\n\tsetup\tConfigure app and reactor instances.\n\trun\t[default] Run reactors.\n\thelp\tShow this message.\nAvailable OPTIONs:\n\t--config=<PATH> Use config file specifed by PATH.\n\t--debug Disable GUI and show debug log.',
user_schemas = 'Custom schemas',
view = 'View',
west = 'West',
white = 'White',
width = 'Width',
yellow = 'Yellow',
}
+171
View File
@@ -0,0 +1,171 @@
--[[
Copyright (c) 2025 Eming Kwok
This source code is licensed under the MIT license found in the
LICENSE file in the root directory of this source tree.
]]
return {
['gregtech:gt.1080k_Space_Coolantcell'] = '1080K空间冷却单元',
['gregtech:gt.180k_Helium_Coolantcell'] = '180K氦冷却单元',
['gregtech:gt.180k_NaK_Coolantcell'] = '180K钠钾冷却单元',
['gregtech:gt.180k_Space_Coolantcell'] = '180K空间冷却单元',
['gregtech:gt.360k_Helium_Coolantcell'] = '360K氦冷却单元',
['gregtech:gt.360k_NaK_Coolantcell'] = '360K钠钾冷却单元',
['gregtech:gt.360k_Space_Coolantcell'] = '360K空间冷却单元',
['gregtech:gt.540k_Space_Coolantcell'] = '540K空间冷却单元',
['gregtech:gt.60k_Helium_Coolantcell'] = '60K氦冷却单元',
['gregtech:gt.60k_NaK_Coolantcell'] = '60K钠钾冷却单元',
['gregtech:gt.neutroniumHeatCapacitor'] = '1G中子热容',
['gregtech:gt.rodExcitedPlutonium'] = '燃料棒(激发钚)',
['gregtech:gt.rodExcitedPlutonium2'] = '二联燃料棒(激发钚)',
['gregtech:gt.rodExcitedPlutonium4'] = '四联燃料棒(激发钚)',
['gregtech:gt.rodExcitedUranium'] = '燃料棒(激发铀)',
['gregtech:gt.rodExcitedUranium2'] = '二联燃料棒(激发铀)',
['gregtech:gt.rodExcitedUranium4'] = '四联燃料棒(激发铀)',
['gregtech:gt.rodGlowstone'] = '燃料棒(萤石)',
['gregtech:gt.rodHighDensityPlutonium'] = '燃料棒(浓缩钚)',
['gregtech:gt.rodHighDensityPlutonium2'] = '二联燃料棒(浓缩钚)',
['gregtech:gt.rodHighDensityPlutonium4'] = '四联燃料棒(浓缩钚)',
['gregtech:gt.rodHighDensityUranium'] = '燃料棒(浓缩铀)',
['gregtech:gt.rodHighDensityUranium2'] = '二联燃料棒(浓缩铀)',
['gregtech:gt.rodHighDensityUranium4'] = '四联燃料棒(浓缩铀)',
['gregtech:gt.rodMOX'] = '燃料棒(MOX',
['gregtech:gt.rodMOX2'] = '二联燃料棒(MOX',
['gregtech:gt.rodMOX4'] = '四联燃料棒(MOX',
['gregtech:gt.rodNaquadah'] = '燃料棒(硅岩)',
['gregtech:gt.rodNaquadah2'] = '二联燃料棒(硅岩)',
['gregtech:gt.rodNaquadah32'] = '“核心”',
['gregtech:gt.rodNaquadah4'] = '四联燃料棒(硅岩)',
['gregtech:gt.rodNaquadria'] = '燃料棒(超能硅岩)',
['gregtech:gt.rodNaquadria2'] = '二联燃料棒(超能硅岩)',
['gregtech:gt.rodNaquadria4'] = '四联燃料棒(超能硅岩)',
['gregtech:gt.rodThorium'] = '燃料棒(钍)',
['gregtech:gt.rodThorium2'] = '二联燃料棒(钍)',
['gregtech:gt.rodThorium4'] = '四联燃料棒(钍)',
['gregtech:gt.rodTiberium'] = '燃料棒(泰伯利亚)',
['gregtech:gt.rodTiberium2'] = '二联燃料棒(泰伯利亚)',
['gregtech:gt.rodTiberium4'] = '四联燃料棒(泰伯利亚)',
['gregtech:gt.rodUranium'] = '燃料棒(铀)',
['gregtech:gt.rodUranium2'] = '二联燃料棒(铀)',
['gregtech:gt.rodUranium4'] = '四联燃料棒(铀)',
['IC2:reactorVentCore'] = '反应堆散热片',
alert_message = '消息框内容',
alert_title = '提示',
backup_saved = '备份完成',
black = '黑色',
blue = '蓝色',
brown = '棕色',
builtin_schemas = '内置布局',
cancel = '取消',
change_condition = '更换条件',
change_condition_damage_less = '耐久低于',
change_condition_none = '不更换',
component_address = '设备地址',
confirm_delete = '确认删除',
confirm_exit = '确认退出',
copy = '复制',
create_new = '<新建...>',
cyan = '青色',
delete = '删除',
disabled = '已禁用',
discard_and_exit = '不保存并退出',
down = '下方',
east = '东方',
edit = '编辑',
enabled = '已启用',
global_control = '全局控制',
gray = '灰色',
green = '绿色',
height = '高度',
input_prompt_instance_name = '输入反应堆名称,中文可从外部粘贴',
input_prompt_max_heat = '输入最高堆温(0-10000',
input_prompt_min_heat = '输入最低堆温(0-10000',
input_prompt_schema_name = '输入布局名称,中文可从外部粘贴',
input_prompt_schema_width = '输入布局宽度(3-9',
input_prompt_schema_height = '输入布局高度(6)(没有在用..',
input_prompt_threshold = '输入耐久阈值(0.0-1.0',
instance_config = '编辑反应堆',
instance_name = '实例名称',
invalid_command = '不支持的指令: %s',
invalid_schema = '不支持的布局: %s',
item_config = '配置物品',
item_input_side = '输入位于',
item_name = '物品',
item_output_side = '输出位于',
item_reactor_side = '反应堆位于',
item_shortage = '缺少物品 %s',
keyboard_tips_run = '[R]开始运行 [S]停止运行 [Q]停止运行并退出',
keyboard_tips_setup = '[←↑→↓]功能选择 [Enter]确认 [Q]不保存并退出',
language = '语言',
lightblue = '浅蓝色',
lime = '浅黄色',
magenta = '洋红色',
max_heat_temp = '最高堆温',
min_heat_temp = '最低堆温',
name = '名称',
name_copy = '副本',
no_profile = '缺少预置 %s',
no_valid_config = '本地配置文件无法运行反应堆.\n按任意键启动配置程序...',
none = '',
north = '北方',
not_configured = '未配置',
ok = '确认',
orange = '橙色',
output_full = '物品输出容器已满',
pink = '粉色',
profile_config = '编辑预置',
profile_cooldown = '冷却布局',
profile_count_mismatch = '反应堆容量不足,无法应用布局',
profile_heatup = '升温布局',
profile_name_cooldown = '[冷却]',
profile_name_heatup = '[加热]',
profile_name_working = '[发电]',
profile_working = '发电布局',
prompt_backup = '旧配置已经备份到 %s',
prompt_confirm_delete = '确认要删除 %s 吗?',
prompt_confirm_exit = '确认要退出吗?',
purple = '紫色',
reactor_address = '反应堆地址',
reactor_state_applying = '更换元件',
reactor_state_error = '错误: %s',
reactor_state_running = '运行 %s',
reactor_state_stopped = '已停止',
red = '红色',
redstone_color = '信号颜色',
redstone_config = '红石配置',
redstone_control = '红石控制',
redstone_direction = '信号方向',
redstone_mode = '红石模式',
redstone_mode_bundled = 'ProjectRed集束红石',
redstone_mode_none = '不使用',
redstone_mode_vanilla = '原版红石',
save_and_exit = '保存并退出',
schema = '元件布局',
schema_config = '编辑布局',
schema_name_single = '单个元件',
schema_name_vacuum = '强冷',
select_schema = '选择布局',
silver = '银色',
south = '南方',
sync_shutdown = '同步停堆',
tab_general = '通用',
tab_reactors = '反应堆',
tab_save = '保存配置',
tab_schemas = '元件布局',
threshold = '阈值',
title_config_app = '反应堆监控程序 版本%s - 配置',
title_monitor_app = '反应堆监控程序 版本%s - 运行',
transposer = '转运器',
transposer_config = '配置转运器',
unsupported_control = '不支持的红石控制模式: %s',
unsupported_item_check = '不支持的元件更换条件: %s',
up = '上方',
usage = '用法: reactor [指令] [选项...]\n\n可用指令:\n\tsetup\t配置本程序与反应堆实例.\n\trun\t[默认指令]运行反应堆.\n\thelp\t显示本说明.\n可用选项:\n\t--config=<路径> 使用指定的配置文件.\n\t--debug 关闭图形界面并打印调试日志.',
user_schemas = '自定义布局',
view = '查看',
west = '西方',
white = '白色',
width = '宽度',
yellow = '黄色',
}