From df75dc7b7ec03a3b30052efbea988c3ab2b8f430 Mon Sep 17 00:00:00 2001 From: cheapie Date: Fri, 24 Aug 2018 16:19:53 -0500 Subject: Initial commit --- COPYING | 24 + firealarm_common/depends.txt | 0 firealarm_common/init.lua | 61 +++ firealarm_hornstrobe/depends.txt | 1 + firealarm_hornstrobe/init.lua | 99 ++++ firealarm_hornstrobe/sounds/firealarm_horn.ogg | Bin 0 -> 36602 bytes .../textures/firealarm_hornstrobe_back.png | Bin 0 -> 146 bytes .../textures/firealarm_hornstrobe_front_off.png | Bin 0 -> 274 bytes .../textures/firealarm_hornstrobe_front_on.png | Bin 0 -> 1792 bytes .../textures/firealarm_hornstrobe_side.png | Bin 0 -> 438 bytes firealarm_panel/depends.txt | 1 + firealarm_panel/init.lua | 584 +++++++++++++++++++++ firealarm_panel/sounds/firealarm_panel_piezo.ogg | Bin 0 -> 5318 bytes .../textures/firealarm_panel_front_normal.png | Bin 0 -> 460 bytes .../textures/firealarm_panel_led_alarm.png | Bin 0 -> 181 bytes .../textures/firealarm_panel_led_supervisory.png | Bin 0 -> 181 bytes .../textures/firealarm_panel_led_trouble.png | Bin 0 -> 181 bytes firealarm_panel/textures/firealarm_panel_sides.png | Bin 0 -> 146 bytes firealarm_pullstation/depends.txt | 1 + firealarm_pullstation/init.lua | 90 ++++ .../sounds/firealarm_pullstation_pull.ogg | Bin 0 -> 8029 bytes .../sounds/firealarm_pullstation_reset.ogg | Bin 0 -> 7373 bytes .../textures/firealarm_pullstation_back.png | Bin 0 -> 146 bytes .../textures/firealarm_pullstation_front_off.png | Bin 0 -> 4588 bytes .../textures/firealarm_pullstation_front_on.png | Bin 0 -> 4740 bytes modpack.txt | 0 26 files changed, 861 insertions(+) create mode 100644 COPYING create mode 100644 firealarm_common/depends.txt create mode 100644 firealarm_common/init.lua create mode 100644 firealarm_hornstrobe/depends.txt create mode 100644 firealarm_hornstrobe/init.lua create mode 100644 firealarm_hornstrobe/sounds/firealarm_horn.ogg create mode 100644 firealarm_hornstrobe/textures/firealarm_hornstrobe_back.png create mode 100644 firealarm_hornstrobe/textures/firealarm_hornstrobe_front_off.png create mode 100644 firealarm_hornstrobe/textures/firealarm_hornstrobe_front_on.png create mode 100644 firealarm_hornstrobe/textures/firealarm_hornstrobe_side.png create mode 100644 firealarm_panel/depends.txt create mode 100644 firealarm_panel/init.lua create mode 100644 firealarm_panel/sounds/firealarm_panel_piezo.ogg create mode 100644 firealarm_panel/textures/firealarm_panel_front_normal.png create mode 100644 firealarm_panel/textures/firealarm_panel_led_alarm.png create mode 100644 firealarm_panel/textures/firealarm_panel_led_supervisory.png create mode 100644 firealarm_panel/textures/firealarm_panel_led_trouble.png create mode 100644 firealarm_panel/textures/firealarm_panel_sides.png create mode 100644 firealarm_pullstation/depends.txt create mode 100644 firealarm_pullstation/init.lua create mode 100644 firealarm_pullstation/sounds/firealarm_pullstation_pull.ogg create mode 100644 firealarm_pullstation/sounds/firealarm_pullstation_reset.ogg create mode 100644 firealarm_pullstation/textures/firealarm_pullstation_back.png create mode 100644 firealarm_pullstation/textures/firealarm_pullstation_front_off.png create mode 100644 firealarm_pullstation/textures/firealarm_pullstation_front_on.png create mode 100644 modpack.txt diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..68a49da --- /dev/null +++ b/COPYING @@ -0,0 +1,24 @@ +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to diff --git a/firealarm_common/depends.txt b/firealarm_common/depends.txt new file mode 100644 index 0000000..e69de29 diff --git a/firealarm_common/init.lua b/firealarm_common/init.lua new file mode 100644 index 0000000..ae2a2a0 --- /dev/null +++ b/firealarm_common/init.lua @@ -0,0 +1,61 @@ +firealarm = {} + +firealarm.devices = { + panel = {}, + signaling = {}, + notification = {}, +} + +function firealarm.loadNode(pos) + minetest.forceload_block(pos,true) +end + +function firealarm.loadDevLists() + local path = minetest.get_worldpath()..DIR_DELIM.."firealarm_devices" + local file = io.open(path,"r") + if not file then + minetest.log("error","Unable to open fire alarm devices table for reading. ".. + "This is normal on the first start.") + firealarm.saveDevLists() + return + end + local serdata = file:read("*a") + file:close() + local data = minetest.deserialize(serdata) + if type(data) == "table" then + firealarm.devices = data + else + error("Fire alarm devices table is corrupted or contains invalid data") + end +end + +function firealarm.saveDevLists() + local path = minetest.get_worldpath()..DIR_DELIM.."firealarm_devices" + local file = io.open(path,"w") + if not file then + minetest.log("error","Unable to open fire alarm devices table for writing") + return + end + local serdata = minetest.serialize(firealarm.devices) + file:write(serdata) + file:close() +end + +function firealarm.getDevInfo(devType,pos) + if devType ~= "panel" and devType ~= "signaling" and devType ~= "notification" then + error("Invalid device type specified") + end + local hash = minetest.hash_node_position(pos) + return firealarm.devices[devType][hash] +end + +function firealarm.setDevInfo(devType,pos,info) + if devType ~= "panel" and devType ~= "signaling" and devType ~= "notification" then + error("Invalid device type specified") + end + local hash = minetest.hash_node_position(pos) + firealarm.devices[devType][hash] = info + firealarm.saveDevLists() +end + +firealarm:loadDevLists() diff --git a/firealarm_hornstrobe/depends.txt b/firealarm_hornstrobe/depends.txt new file mode 100644 index 0000000..d4798ab --- /dev/null +++ b/firealarm_hornstrobe/depends.txt @@ -0,0 +1 @@ +firealarm_common diff --git a/firealarm_hornstrobe/init.lua b/firealarm_hornstrobe/init.lua new file mode 100644 index 0000000..530734c --- /dev/null +++ b/firealarm_hornstrobe/init.lua @@ -0,0 +1,99 @@ +minetest.register_node(":firealarm:hornstrobe_off",{ + description = "Fire Alarm Horn/Strobe", + groups = { oddly_breakable_by_hand = 1 }, + tiles = { + "firealarm_hornstrobe_back.png", + "firealarm_hornstrobe_back.png", + "firealarm_hornstrobe_side.png", + "firealarm_hornstrobe_side.png", + "firealarm_hornstrobe_back.png", + "firealarm_hornstrobe_front_off.png", + }, + paramtype = "light", + paramtype2 = "facedir", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.15,-0.02,0.4,0.18,0.37,0.5}, + }, + }, + on_punch = function(pos,_,player) + local name = player:get_player_name() + minetest.chat_send_player(name,string.format("Position: %d,%d,%d",pos.x,pos.y,pos.z)) + end, + after_place_node = function(pos) + firealarm.setDevInfo("notification",pos,{strobeActive = false,hornActive = false}) + end, + after_dig_node = function(pos) + firealarm.setDevInfo("notification",pos,nil) + end, +}) + +local hornstrobeOnFrontTexture = "[combine:32x320".. + ":0,0=firealarm_hornstrobe_front_on.png".. + ":0,32=firealarm_hornstrobe_front_off.png".. + ":0,64=firealarm_hornstrobe_front_off.png".. + ":0,96=firealarm_hornstrobe_front_off.png".. + ":0,128=firealarm_hornstrobe_front_off.png".. + ":0,160=firealarm_hornstrobe_front_off.png".. + ":0,192=firealarm_hornstrobe_front_off.png".. + ":0,224=firealarm_hornstrobe_front_off.png".. + ":0,256=firealarm_hornstrobe_front_off.png".. + ":0,288=firealarm_hornstrobe_front_off.png" + +minetest.register_node(":firealarm:hornstrobe_on",{ + drop = "firealarm:hornstrobe_off", + description = "Fire Alarm Horn/Strobe (on state - you hacker you!)", + groups = { oddly_breakable_by_hand = 1,not_in_creative_inventory = 1 }, + tiles = { + "firealarm_hornstrobe_back.png", + "firealarm_hornstrobe_back.png", + "firealarm_hornstrobe_side.png", + "firealarm_hornstrobe_side.png", + "firealarm_hornstrobe_back.png", + { + name = hornstrobeOnFrontTexture, + animation = + { + type = "vertical_frames", + aspect_w = 32, + aspect_h = 32, + length = 1, + }, + } + }, + paramtype = "light", + paramtype2 = "facedir", + light_source = 8, + use_texture_alpha = true, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.5,-0.5,0.4,0.5,0.5,0.401}, + {-0.15,-0.02,0.4,0.18,0.37,0.5}, + }, + }, +}) + +minetest.register_abm({ + label = "Update horn/strobe state", + nodenames = {"firealarm:hornstrobe_off","firealarm:hornstrobe_on"}, + interval = 4, + chance = 1, + action = function(pos,node) + local devInfo = firealarm.getDevInfo("notification",pos) + if not devInfo then return end + if node.name == "firealarm:hornstrobe_off" and devInfo.strobeActive then + node.name = "firealarm:hornstrobe_on" + minetest.set_node(pos,node) + elseif node.name == "firealarm:hornstrobe_on" and not devInfo.strobeActive then + node.name = "firealarm:hornstrobe_off" + minetest.set_node(pos,node) + end + if devInfo.hornActive then + minetest.sound_play("firealarm_horn",{pos=pos}) + end + end, +}) diff --git a/firealarm_hornstrobe/sounds/firealarm_horn.ogg b/firealarm_hornstrobe/sounds/firealarm_horn.ogg new file mode 100644 index 0000000..7ea565e Binary files /dev/null and b/firealarm_hornstrobe/sounds/firealarm_horn.ogg differ diff --git a/firealarm_hornstrobe/textures/firealarm_hornstrobe_back.png b/firealarm_hornstrobe/textures/firealarm_hornstrobe_back.png new file mode 100644 index 0000000..4beaa00 Binary files /dev/null and b/firealarm_hornstrobe/textures/firealarm_hornstrobe_back.png differ diff --git a/firealarm_hornstrobe/textures/firealarm_hornstrobe_front_off.png b/firealarm_hornstrobe/textures/firealarm_hornstrobe_front_off.png new file mode 100644 index 0000000..0033f4c Binary files /dev/null and b/firealarm_hornstrobe/textures/firealarm_hornstrobe_front_off.png differ diff --git a/firealarm_hornstrobe/textures/firealarm_hornstrobe_front_on.png b/firealarm_hornstrobe/textures/firealarm_hornstrobe_front_on.png new file mode 100644 index 0000000..fdca07d Binary files /dev/null and b/firealarm_hornstrobe/textures/firealarm_hornstrobe_front_on.png differ diff --git a/firealarm_hornstrobe/textures/firealarm_hornstrobe_side.png b/firealarm_hornstrobe/textures/firealarm_hornstrobe_side.png new file mode 100644 index 0000000..7f33a6d Binary files /dev/null and b/firealarm_hornstrobe/textures/firealarm_hornstrobe_side.png differ diff --git a/firealarm_panel/depends.txt b/firealarm_panel/depends.txt new file mode 100644 index 0000000..d4798ab --- /dev/null +++ b/firealarm_panel/depends.txt @@ -0,0 +1 @@ +firealarm_common diff --git a/firealarm_panel/init.lua b/firealarm_panel/init.lua new file mode 100644 index 0000000..28955ab --- /dev/null +++ b/firealarm_panel/init.lua @@ -0,0 +1,584 @@ +local function setFormspec(pos) + local devInfo = firealarm.getDevInfo("panel",pos) + local meta = minetest.get_meta(pos) + local fs = "size[10,10]label[0.5,0.5;MineAlert 850+ Addressable Fire Alarm Control Panel]" + local screen = devInfo.screen + if screen == "main" then + if #devInfo.alarm > 0 then + if devInfo.silenced then + fs = fs.."label[0.5,2;Alarm Silenced]" + else + if devInfo.acked then + fs = fs.."label[0.5,2;Alarm Acknowledged]" + else + fs = fs.."label[0.5,2;ALARM! - "..minetest.formspec_escape(devInfo.alarm[#devInfo.alarm].name).."]" + end + end + elseif #devInfo.supervisory > 0 then + if devInfo.acked then + fs = fs.."label[0.5,2;Supervisory Acknowledged]" + else + fs = fs.."label[0.5,2;Supervisory - "..minetest.formspec_escape(devInfo.supervisory[#devInfo.supervisory].name).."]" + end + elseif #devInfo.trouble > 0 then + if devInfo.acked then + fs = fs.."label[0.5,2;Trouble Acknowledged]" + else + fs = fs.."label[0.5,2;Trouble - "..minetest.formspec_escape(devInfo.trouble[#devInfo.trouble].name).."]" + end + else + fs = fs.."label[0.5,2;System Normal]" + end + fs = fs.."button[0.5,3;3,1;ack;Acknowledge]" + fs = fs.."button[0.5,4;3,1;silence;Silence]" + fs = fs.."button[0.5,5;3,1;reset;Reset]" + fs = fs.."button[0.5,6;3,1;drill;Drill]" + fs = fs.."button[0.5,7;3,1;add;Add Device]" + fs = fs.."button[0.5,8;3,1;remove;Remove Device]" + elseif screen == "add" then + fs = fs.."label[0.5,2;Add Device]" + fs = fs.."field[1,4;1,1;x;X;]" + fs = fs.."field[2,4;1,1;y;Y;]" + fs = fs.."field[3,4;1,1;z;Z;]" + fs = fs.."dropdown[0.5,5;3;action;Alarm,Supervisory,Trouble;1]" + fs = fs.."field[1,6.5;3,1;name;Name;]" + fs = fs.."button[1,7.5;3,1;add;Add]" + fs = fs.."button[1,8.5;3,1;cancel;Cancel" + elseif screen == "remove" then + fs = fs.."label[0.5,2;Remove Device]" + local devPresent = false + for _ in pairs(devInfo.associatedSignalingDevices) do + devPresent = true + end + for _ in pairs(devInfo.associatedNotificationDevices) do + devPresent = true + end + if devPresent then + devInfo.removeMenuDevList = {} + fs = fs.."textlist[1,4;3,3;dev;" + for k,v in pairs(devInfo.associatedSignalingDevices) do + local dev = {type = "signaling",hash = k} + table.insert(devInfo.removeMenuDevList,dev) + fs = fs..minetest.formspec_escape(v.name).."," + end + for k,v in pairs(devInfo.associatedNotificationDevices) do + local dev = {type = "notification",hash = k} + table.insert(devInfo.removeMenuDevList,dev) + fs = fs..minetest.formspec_escape(v.name).."," + end + fs = string.sub(fs,1,-1).."]" + else + fs = fs.."label[0.5,5;No Devices Associated]" + end + fs = fs.."button[1,8.5;3,1;cancel;Back" + end + meta:set_string("formspec",fs) +end + +local function alarm(pos,initiator) + local devInfo = firealarm.getDevInfo("panel",pos) + local posHash = minetest.hash_node_position(pos) + local initiatorHash = minetest.hash_node_position(initiator) + for _,i in ipairs(devInfo.alarm) do + if i.initiator == initiatorHash then return end + end + local name = "Unknown Device" + if devInfo.associatedSignalingDevices[initiatorHash] then + name = devInfo.associatedSignalingDevices[initiatorHash].name + elseif posHash == initiatorHash then + name = "Panel Drill Switch" + end + table.insert(devInfo.alarm,{initiator = initiatorHash,name = name}) + devInfo.acked = false + firealarm.setDevInfo("panel",pos,devInfo) + setFormspec(pos) +end + +local function supervisory(pos,initiator) + local devInfo = firealarm.getDevInfo("panel",pos) + local posHash = minetest.hash_node_position(pos) + local initiatorHash = minetest.hash_node_position(initiator) + for _,i in ipairs(devInfo.supervisory) do + if i.initiator == initiatorHash then return end + end + local name = "Unknown Device" + if devInfo.associatedSignalingDevices[initiatorHash] then + name = devInfo.associatedSignalingDevices[initiatorHash].name + end + table.insert(devInfo.supervisory,{initiator = initiatorHash,name = name}) + devInfo.acked = false + firealarm.setDevInfo("panel",pos,devInfo) + setFormspec(pos) +end + +local function trouble(pos,initiator) + local devInfo = firealarm.getDevInfo("panel",pos) + local posHash = minetest.hash_node_position(pos) + local initiatorHash = minetest.hash_node_position(initiator) + for _,i in ipairs(devInfo.trouble) do + if i.initiator == initiatorHash then return end + end + local name = "Unknown Device" + if devInfo.associatedSignalingDevices[initiatorHash] then + name = devInfo.associatedSignalingDevices[initiatorHash].name + end + if devInfo.associatedNotificationDevices[initiatorHash] then + name = devInfo.associatedNotificationDevices[initiatorHash].name + end + table.insert(devInfo.trouble,{initiator = initiatorHash,name = name}) + devInfo.acked = false + firealarm.setDevInfo("panel",pos,devInfo) + setFormspec(pos) +end + +local function handleFields(pos,_,fields,sender) + local devInfo = firealarm.getDevInfo("panel",pos) + local screen = devInfo.screen + if fields.quit then return end + local name = sender:get_player_name() + if minetest.is_protected(pos,name) and not minetest.check_player_privs(name,"protection_bypass") then + minetest.chat_send_player(name,"You are not authorized to use this panel.") + minetest.record_protection_violation(pos,name) + return + end + if screen == "main" then + if fields.ack then + devInfo.acked = true + elseif fields.silence and #devInfo.alarm > 0 and devInfo.acked then + devInfo.silenced = true + elseif fields.reset and devInfo.acked then + devInfo.alarm = {} + devInfo.supervisory = {} + devInfo.trouble = {} + devInfo.acked = false + devInfo.silenced = false + for i in pairs(devInfo.associatedSignalingDevices) do + local dev = firealarm.getDevInfo("signaling",minetest.get_position_from_hash(i)) + if not dev then + trouble(pos,minetest.get_position_from_hash(i)) + elseif not dev.manualReset then + dev.active = false + end + end + elseif fields.drill then + alarm(pos,pos) + elseif fields.add then + devInfo.screen = "add" + elseif fields.remove then + devInfo.screen = "remove" + end + elseif screen == "add" then + if fields.add or fields.cancel then + devInfo.screen = "main" + end + if fields.add then + if (tonumber(fields.x) and tonumber(fields.y) and tonumber(fields.z)) then + local targetPos = {x = fields.x,y = fields.y,z = fields.z} + local targetInfo = firealarm.getDevInfo("signaling",targetPos) + if targetInfo then + if (minetest.is_protected(pos,name) and not minetest.check_player_privs(name,"protection_bypass")) or targetInfo.associated then + minetest.chat_send_player(name,"Device is protected or already associated") + else + targetInfo.associated = minetest.hash_node_position(pos) + local devParams = {} + devParams.name = fields.name + devParams.action = fields.action + devInfo.associatedSignalingDevices[minetest.hash_node_position(targetPos)] = devParams + end + else + targetInfo = firealarm.getDevInfo("notification",targetPos) + if targetInfo then + if (minetest.is_protected(pos,name) and not minetest.check_player_privs(name,"protection_bypass")) or targetInfo.associated then + minetest.chat_send_player(name,"Device is protected or already associated") + else + targetInfo.associated = minetest.hash_node_position(pos) + local devParams = {} + devParams.name = fields.name + devInfo.associatedNotificationDevices[minetest.hash_node_position(targetPos)] = devParams + end + else + minetest.chat_send_player(name,"Not a valid fire alarm device") + end + end + else + minetest.chat_send_player(name,"Invalid position") + end + end + elseif screen == "remove" then + if fields.cancel then + devInfo.screen = "main" + end + if fields.dev and string.sub(fields.dev,1,3) == "DCL" then + local dev = devInfo.removeMenuDevList[tonumber(string.sub(fields.dev,5,-1))] + if dev then + if dev.type == "signaling" then + devInfo.associatedSignalingDevices[dev.hash] = nil + local targetPos = minetest.get_position_from_hash(dev.hash) + local targetInfo = firealarm.getDevInfo("signaling",targetPos) + if targetInfo then + targetInfo.associated = nil + firealarm.setDevInfo("signaling",targetPos,targetInfo) + end + elseif dev.type == "notification" then + devInfo.associatedNotificationDevices[dev.hash] = nil + local targetPos = minetest.get_position_from_hash(dev.hash) + local targetInfo = firealarm.getDevInfo("notification",targetPos) + if targetInfo then + targetInfo.associated = nil + targetInfo.hornActive = false + targetInfo.strobeActive = false + firealarm.setDevInfo("notification",targetPos,targetInfo) + end + end + end + end + end + firealarm.setDevInfo("panel",pos,devInfo) + setFormspec(pos) +end + +minetest.register_node(":firealarm:panel",{ + description = "Fire Alarm Panel", + groups = { oddly_breakable_by_hand = 1,firealarm_panel = 1}, + tiles = { + "firealarm_panel_sides.png", + "firealarm_panel_sides.png", + "firealarm_panel_sides.png", + "firealarm_panel_sides.png", + "firealarm_panel_sides.png", + "firealarm_panel_front_normal.png", + }, + paramtype = "light", + paramtype2 = "facedir", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.5,-0.5,0.4,0.5,0.5,0.5}, + }, + }, + after_place_node = function(pos) + firealarm.setDevInfo("panel",pos,{ + associatedSignalingDevices = {}, + associatedNotificationDevices = {}, + removeMenuDevList = {}, + alarm = {}, + supervisory = {}, + trouble = {}, + acked = false, + silenced = false, + screen = "main", + }) + setFormspec(pos) + end, + after_dig_node = function(pos) + firealarm.setDevInfo("panel",pos,nil) + end, + on_receive_fields = handleFields, +}) + +minetest.register_node(":firealarm:panel_alarm",{ + description = "Fire Alarm Panel (LEDs on - you hacker you!)", + drop = "firealarm:panel", + groups = { oddly_breakable_by_hand = 1,firealarm_panel = 1,not_in_creative_inventory = 1}, + tiles = { + "firealarm_panel_sides.png", + "firealarm_panel_sides.png", + "firealarm_panel_sides.png", + "firealarm_panel_sides.png", + "firealarm_panel_sides.png", + { + name = "[combine:64x128:0,0=firealarm_panel_front_normal.png:0,64=firealarm_panel_front_normal.png:0,64=firealarm_panel_led_alarm.png", + animation = + { + type = "vertical_frames", + aspect_w = 64, + aspect_h = 64, + length = 0.5, + }, + } + }, + paramtype = "light", + paramtype2 = "facedir", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.5,-0.5,0.4,0.5,0.5,0.5}, + }, + }, + after_dig_node = function(pos) + firealarm.setDevInfo("panel",pos,nil) + end, + on_receive_fields = handleFields, +}) + +minetest.register_node(":firealarm:panel_supervisory",{ + description = "Fire Alarm Panel (LEDs on - you hacker you!)", + drop = "firealarm:panel", + groups = { oddly_breakable_by_hand = 1,firealarm_panel = 1,not_in_creative_inventory = 1}, + tiles = { + "firealarm_panel_sides.png", + "firealarm_panel_sides.png", + "firealarm_panel_sides.png", + "firealarm_panel_sides.png", + "firealarm_panel_sides.png", + { + name = "[combine:64x128:0,0=firealarm_panel_front_normal.png:0,64=firealarm_panel_front_normal.png:0,64=firealarm_panel_led_supervisory.png", + animation = + { + type = "vertical_frames", + aspect_w = 64, + aspect_h = 64, + length = 0.5, + }, + } + }, + paramtype = "light", + paramtype2 = "facedir", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.5,-0.5,0.4,0.5,0.5,0.5}, + }, + }, + after_dig_node = function(pos) + firealarm.setDevInfo("panel",pos,nil) + end, + on_receive_fields = handleFields, +}) + +minetest.register_node(":firealarm:panel_trouble",{ + description = "Fire Alarm Panel (LEDs on - you hacker you!)", + drop = "firealarm:panel", + groups = { oddly_breakable_by_hand = 1,firealarm_panel = 1,not_in_creative_inventory = 1}, + tiles = { + "firealarm_panel_sides.png", + "firealarm_panel_sides.png", + "firealarm_panel_sides.png", + "firealarm_panel_sides.png", + "firealarm_panel_sides.png", + { + name = "[combine:64x128:0,0=firealarm_panel_front_normal.png:0,64=firealarm_panel_front_normal.png:0,64=firealarm_panel_led_trouble.png", + animation = + { + type = "vertical_frames", + aspect_w = 64, + aspect_h = 64, + length = 0.5, + }, + } + }, + paramtype = "light", + paramtype2 = "facedir", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.5,-0.5,0.4,0.5,0.5,0.5}, + }, + }, + after_dig_node = function(pos) + firealarm.setDevInfo("panel",pos,nil) + end, + on_receive_fields = handleFields, +}) + +minetest.register_node(":firealarm:panel_alarm_trouble",{ + description = "Fire Alarm Panel (LEDs on - you hacker you!)", + drop = "firealarm:panel", + groups = { oddly_breakable_by_hand = 1,firealarm_panel = 1,not_in_creative_inventory = 1}, + tiles = { + "firealarm_panel_sides.png", + "firealarm_panel_sides.png", + "firealarm_panel_sides.png", + "firealarm_panel_sides.png", + "firealarm_panel_sides.png", + { + name = "[combine:64x128:0,0=firealarm_panel_front_normal.png:0,64=firealarm_panel_front_normal.png:0,64=firealarm_panel_led_alarm.png:0,64=firealarm_panel_led_trouble.png", + animation = + { + type = "vertical_frames", + aspect_w = 64, + aspect_h = 64, + length = 0.5, + }, + } + }, + paramtype = "light", + paramtype2 = "facedir", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.5,-0.5,0.4,0.5,0.5,0.5}, + }, + }, + after_dig_node = function(pos) + firealarm.setDevInfo("panel",pos,nil) + end, + on_receive_fields = handleFields, +}) + +minetest.register_node(":firealarm:panel_alarm_supervisory",{ + description = "Fire Alarm Panel (LEDs on - you hacker you!)", + drop = "firealarm:panel", + groups = { oddly_breakable_by_hand = 1,firealarm_panel = 1,not_in_creative_inventory = 1}, + tiles = { + "firealarm_panel_sides.png", + "firealarm_panel_sides.png", + "firealarm_panel_sides.png", + "firealarm_panel_sides.png", + "firealarm_panel_sides.png", + { + name = "[combine:64x128:0,0=firealarm_panel_front_normal.png:0,64=firealarm_panel_front_normal.png:0,64=firealarm_panel_led_alarm.png:0,64=firealarm_panel_led_supervisory.png", + animation = + { + type = "vertical_frames", + aspect_w = 64, + aspect_h = 64, + length = 0.5, + }, + } + }, + paramtype = "light", + paramtype2 = "facedir", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.5,-0.5,0.4,0.5,0.5,0.5}, + }, + }, + after_dig_node = function(pos) + firealarm.setDevInfo("panel",pos,nil) + end, + on_receive_fields = handleFields, +}) + +minetest.register_node(":firealarm:panel_supervisory_trouble",{ + description = "Fire Alarm Panel (LEDs on - you hacker you!)", + drop = "firealarm:panel", + groups = { oddly_breakable_by_hand = 1,firealarm_panel = 1,not_in_creative_inventory = 1}, + tiles = { + "firealarm_panel_sides.png", + "firealarm_panel_sides.png", + "firealarm_panel_sides.png", + "firealarm_panel_sides.png", + "firealarm_panel_sides.png", + { + name = "[combine:64x128:0,0=firealarm_panel_front_normal.png:0,64=firealarm_panel_front_normal.png:0,64=firealarm_panel_led_supervisory.png:0,64=firealarm_panel_led_trouble.png", + animation = + { + type = "vertical_frames", + aspect_w = 64, + aspect_h = 64, + length = 0.5, + }, + } + }, + paramtype = "light", + paramtype2 = "facedir", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.5,-0.5,0.4,0.5,0.5,0.5}, + }, + }, + after_dig_node = function(pos) + firealarm.setDevInfo("panel",pos,nil) + end, + on_receive_fields = handleFields, +}) + +minetest.register_node(":firealarm:panel_alarm_supervisory_trouble",{ + description = "Fire Alarm Panel (LEDs on - you hacker you!)", + drop = "firealarm:panel", + groups = { oddly_breakable_by_hand = 1,firealarm_panel = 1,not_in_creative_inventory = 1}, + tiles = { + "firealarm_panel_sides.png", + "firealarm_panel_sides.png", + "firealarm_panel_sides.png", + "firealarm_panel_sides.png", + "firealarm_panel_sides.png", + { + name = "[combine:64x128:0,0=firealarm_panel_front_normal.png:0,64=firealarm_panel_front_normal.png:0,64=firealarm_panel_led_alarm.png:0,64=firealarm_panel_led_supervisory.png:0,64=firealarm_panel_led_trouble.png", + animation = + { + type = "vertical_frames", + aspect_w = 64, + aspect_h = 64, + length = 0.5, + }, + } + }, + paramtype = "light", + paramtype2 = "facedir", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.5,-0.5,0.4,0.5,0.5,0.5}, + }, + }, + after_dig_node = function(pos) + firealarm.setDevInfo("panel",pos,nil) + end, + on_receive_fields = handleFields, +}) + +function firealarm.panelABM(pos) + local node = minetest.get_node(pos) + local devInfo = firealarm.getDevInfo("panel",pos) + if not devInfo then return end + local hornsActive = #devInfo.alarm > 0 and not devInfo.silenced + local strobesActive = #devInfo.alarm > 0 + for i in pairs(devInfo.associatedNotificationDevices) do + local dev = firealarm.getDevInfo("notification",minetest.get_position_from_hash(i)) + if not dev then + trouble(pos,minetest.get_position_from_hash(i)) + else + dev.hornActive = hornsActive + dev.strobeActive = strobesActive + end + end + for i,v in pairs(devInfo.associatedSignalingDevices) do + local dev = firealarm.getDevInfo("signaling",minetest.get_position_from_hash(i)) + if not dev then + trouble(pos,minetest.get_position_from_hash(i)) + else + if dev.active then + if v.action == "Alarm" then + alarm(pos,minetest.get_position_from_hash(i)) + elseif v.action == "Supervisory" then + supervisory(pos,minetest.get_position_from_hash(i)) + elseif v.action == "Trouble" then + trouble(pos,minetest.get_position_from_hash(i)) + end + end + end + end + local currentName = node.name + local newName = "firealarm:panel" + if #devInfo.alarm > 0 then newName = newName.."_alarm" end + if #devInfo.supervisory > 0 then newName = newName.."_supervisory" end + if #devInfo.trouble > 0 then newName = newName.."_trouble" end + if newName ~= "firealarm:panel" and not devInfo.acked then + minetest.sound_play("firealarm_panel_piezo",{pos = pos,gain = 0.5}) + end + if currentName ~= newName then + node.name = newName + minetest.set_node(pos,node) + setFormspec(pos) + end +end + +minetest.register_abm({ + label = "Poll devices and update panel status", + nodenames = {"group:firealarm_panel"}, + interval = 1, + chance = 1, + action = firealarm.panelABM, +}) diff --git a/firealarm_panel/sounds/firealarm_panel_piezo.ogg b/firealarm_panel/sounds/firealarm_panel_piezo.ogg new file mode 100644 index 0000000..6f87642 Binary files /dev/null and b/firealarm_panel/sounds/firealarm_panel_piezo.ogg differ diff --git a/firealarm_panel/textures/firealarm_panel_front_normal.png b/firealarm_panel/textures/firealarm_panel_front_normal.png new file mode 100644 index 0000000..b3ba575 Binary files /dev/null and b/firealarm_panel/textures/firealarm_panel_front_normal.png differ diff --git a/firealarm_panel/textures/firealarm_panel_led_alarm.png b/firealarm_panel/textures/firealarm_panel_led_alarm.png new file mode 100644 index 0000000..48a4233 Binary files /dev/null and b/firealarm_panel/textures/firealarm_panel_led_alarm.png differ diff --git a/firealarm_panel/textures/firealarm_panel_led_supervisory.png b/firealarm_panel/textures/firealarm_panel_led_supervisory.png new file mode 100644 index 0000000..285ebab Binary files /dev/null and b/firealarm_panel/textures/firealarm_panel_led_supervisory.png differ diff --git a/firealarm_panel/textures/firealarm_panel_led_trouble.png b/firealarm_panel/textures/firealarm_panel_led_trouble.png new file mode 100644 index 0000000..5196dde Binary files /dev/null and b/firealarm_panel/textures/firealarm_panel_led_trouble.png differ diff --git a/firealarm_panel/textures/firealarm_panel_sides.png b/firealarm_panel/textures/firealarm_panel_sides.png new file mode 100644 index 0000000..4beaa00 Binary files /dev/null and b/firealarm_panel/textures/firealarm_panel_sides.png differ diff --git a/firealarm_pullstation/depends.txt b/firealarm_pullstation/depends.txt new file mode 100644 index 0000000..d4798ab --- /dev/null +++ b/firealarm_pullstation/depends.txt @@ -0,0 +1 @@ +firealarm_common diff --git a/firealarm_pullstation/init.lua b/firealarm_pullstation/init.lua new file mode 100644 index 0000000..b212ec8 --- /dev/null +++ b/firealarm_pullstation/init.lua @@ -0,0 +1,90 @@ +minetest.register_node(":firealarm:pullstation_off",{ + description = "Fire Alarm Pull Station", + groups = { oddly_breakable_by_hand = 1 }, + tiles = { + "firealarm_pullstation_back.png", + "firealarm_pullstation_back.png", + "firealarm_pullstation_back.png", + "firealarm_pullstation_back.png", + "firealarm_pullstation_back.png", + "firealarm_pullstation_front_off.png", + }, + paramtype = "light", + paramtype2 = "facedir", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.15,-0.5,0.4,0.18,-0.11,0.5}, + }, + }, + on_punch = function(pos,_,player) + local name = player:get_player_name() + minetest.chat_send_player(name,string.format("Position: %d,%d,%d",pos.x,pos.y,pos.z)) + end, + on_rightclick = function(pos,node) + local devInfo = firealarm.getDevInfo("signaling",pos) + if devInfo then + devInfo.active = true + node.name = "firealarm:pullstation_on" + minetest.set_node(pos,node) + minetest.sound_play("firealarm_pullstation_pull",{pos=pos}) + if devInfo.associated then + local panelPos = minetest.get_position_from_hash(devInfo.associated) + if panelPos then firealarm.loadNode(panelPos) end + if type(firealarm.panelABM) == "function" then firealarm.panelABM(pos) end + end + end + end, + after_place_node = function(pos) + firealarm.setDevInfo("signaling",pos,{active = false,manualReset = true}) + end, + after_dig_node = function(pos) + firealarm.setDevInfo("signaling",pos,nil) + end, +}) + +minetest.register_node(":firealarm:pullstation_on",{ + drop = "firealarm:pullstation_off", + description = "Fire Alarm Pull Station (pulled state - you hacker you!)", + groups = { oddly_breakable_by_hand = 1,not_in_creative_inventory = 1 }, + tiles = { + "firealarm_pullstation_back.png", + "firealarm_pullstation_back.png", + "firealarm_pullstation_back.png", + "firealarm_pullstation_back.png", + "firealarm_pullstation_back.png", + "firealarm_pullstation_front_on.png", + }, + paramtype = "light", + paramtype2 = "facedir", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.15,-0.5,0.4,0.18,-0.11,0.5}, + }, + }, + on_punch = function(pos,_,player) + local name = player:get_player_name() + minetest.chat_send_player(name,string.format("Position: %d,%d,%d",pos.x,pos.y,pos.z)) + end, + on_rightclick = function(pos,node,name) + --local name = minetest.get_player_name(clicker) + if minetest.is_protected(pos,name) and not minetest.check_player_privs(name,"protection_bypass") then + minetest.record_protection_violation(pos,name) + minetest.chat_send_player(name,"You are not authorized to reset this pull station") + return + end + local devInfo = firealarm.getDevInfo("signaling",pos) + if devInfo then + devInfo.active = false + node.name = "firealarm:pullstation_off" + minetest.set_node(pos,node) + minetest.sound_play("firealarm_pullstation_reset",{pos=pos}) + end + end, + after_dig_node = function(pos) + firealarm.setDevInfo("signaling",pos,nil) + end, +}) diff --git a/firealarm_pullstation/sounds/firealarm_pullstation_pull.ogg b/firealarm_pullstation/sounds/firealarm_pullstation_pull.ogg new file mode 100644 index 0000000..1f6922e Binary files /dev/null and b/firealarm_pullstation/sounds/firealarm_pullstation_pull.ogg differ diff --git a/firealarm_pullstation/sounds/firealarm_pullstation_reset.ogg b/firealarm_pullstation/sounds/firealarm_pullstation_reset.ogg new file mode 100644 index 0000000..7e125e0 Binary files /dev/null and b/firealarm_pullstation/sounds/firealarm_pullstation_reset.ogg differ diff --git a/firealarm_pullstation/textures/firealarm_pullstation_back.png b/firealarm_pullstation/textures/firealarm_pullstation_back.png new file mode 100644 index 0000000..4beaa00 Binary files /dev/null and b/firealarm_pullstation/textures/firealarm_pullstation_back.png differ diff --git a/firealarm_pullstation/textures/firealarm_pullstation_front_off.png b/firealarm_pullstation/textures/firealarm_pullstation_front_off.png new file mode 100644 index 0000000..a77f411 Binary files /dev/null and b/firealarm_pullstation/textures/firealarm_pullstation_front_off.png differ diff --git a/firealarm_pullstation/textures/firealarm_pullstation_front_on.png b/firealarm_pullstation/textures/firealarm_pullstation_front_on.png new file mode 100644 index 0000000..e5fc410 Binary files /dev/null and b/firealarm_pullstation/textures/firealarm_pullstation_front_on.png differ diff --git a/modpack.txt b/modpack.txt new file mode 100644 index 0000000..e69de29 -- cgit v1.2.3