summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcheapie <no-email-for-you@example.com>2018-08-24 16:19:53 -0500
committercheapie <no-email-for-you@example.com>2018-08-24 16:19:53 -0500
commitdf75dc7b7ec03a3b30052efbea988c3ab2b8f430 (patch)
tree60b9f3982ed111b7effcff5ff54eb7862997c732
downloadfirealarm-df75dc7b7ec03a3b30052efbea988c3ab2b8f430.tar
firealarm-df75dc7b7ec03a3b30052efbea988c3ab2b8f430.tar.gz
firealarm-df75dc7b7ec03a3b30052efbea988c3ab2b8f430.tar.bz2
firealarm-df75dc7b7ec03a3b30052efbea988c3ab2b8f430.tar.xz
firealarm-df75dc7b7ec03a3b30052efbea988c3ab2b8f430.zip
Initial commit
-rw-r--r--COPYING24
-rw-r--r--firealarm_common/depends.txt0
-rw-r--r--firealarm_common/init.lua61
-rw-r--r--firealarm_hornstrobe/depends.txt1
-rw-r--r--firealarm_hornstrobe/init.lua99
-rw-r--r--firealarm_hornstrobe/sounds/firealarm_horn.oggbin0 -> 36602 bytes
-rw-r--r--firealarm_hornstrobe/textures/firealarm_hornstrobe_back.pngbin0 -> 146 bytes
-rw-r--r--firealarm_hornstrobe/textures/firealarm_hornstrobe_front_off.pngbin0 -> 274 bytes
-rw-r--r--firealarm_hornstrobe/textures/firealarm_hornstrobe_front_on.pngbin0 -> 1792 bytes
-rw-r--r--firealarm_hornstrobe/textures/firealarm_hornstrobe_side.pngbin0 -> 438 bytes
-rw-r--r--firealarm_panel/depends.txt1
-rw-r--r--firealarm_panel/init.lua584
-rw-r--r--firealarm_panel/sounds/firealarm_panel_piezo.oggbin0 -> 5318 bytes
-rw-r--r--firealarm_panel/textures/firealarm_panel_front_normal.pngbin0 -> 460 bytes
-rw-r--r--firealarm_panel/textures/firealarm_panel_led_alarm.pngbin0 -> 181 bytes
-rw-r--r--firealarm_panel/textures/firealarm_panel_led_supervisory.pngbin0 -> 181 bytes
-rw-r--r--firealarm_panel/textures/firealarm_panel_led_trouble.pngbin0 -> 181 bytes
-rw-r--r--firealarm_panel/textures/firealarm_panel_sides.pngbin0 -> 146 bytes
-rw-r--r--firealarm_pullstation/depends.txt1
-rw-r--r--firealarm_pullstation/init.lua90
-rw-r--r--firealarm_pullstation/sounds/firealarm_pullstation_pull.oggbin0 -> 8029 bytes
-rw-r--r--firealarm_pullstation/sounds/firealarm_pullstation_reset.oggbin0 -> 7373 bytes
-rw-r--r--firealarm_pullstation/textures/firealarm_pullstation_back.pngbin0 -> 146 bytes
-rw-r--r--firealarm_pullstation/textures/firealarm_pullstation_front_off.pngbin0 -> 4588 bytes
-rw-r--r--firealarm_pullstation/textures/firealarm_pullstation_front_on.pngbin0 -> 4740 bytes
-rw-r--r--modpack.txt0
26 files changed, 861 insertions, 0 deletions
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 <http://unlicense.org/>
diff --git a/firealarm_common/depends.txt b/firealarm_common/depends.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/firealarm_common/depends.txt
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
--- /dev/null
+++ b/firealarm_hornstrobe/sounds/firealarm_horn.ogg
Binary files 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
--- /dev/null
+++ b/firealarm_hornstrobe/textures/firealarm_hornstrobe_back.png
Binary files 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
--- /dev/null
+++ b/firealarm_hornstrobe/textures/firealarm_hornstrobe_front_off.png
Binary files 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
--- /dev/null
+++ b/firealarm_hornstrobe/textures/firealarm_hornstrobe_front_on.png
Binary files 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
--- /dev/null
+++ b/firealarm_hornstrobe/textures/firealarm_hornstrobe_side.png
Binary files 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
--- /dev/null
+++ b/firealarm_panel/sounds/firealarm_panel_piezo.ogg
Binary files 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
--- /dev/null
+++ b/firealarm_panel/textures/firealarm_panel_front_normal.png
Binary files 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
--- /dev/null
+++ b/firealarm_panel/textures/firealarm_panel_led_alarm.png
Binary files 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
--- /dev/null
+++ b/firealarm_panel/textures/firealarm_panel_led_supervisory.png
Binary files 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
--- /dev/null
+++ b/firealarm_panel/textures/firealarm_panel_led_trouble.png
Binary files 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
--- /dev/null
+++ b/firealarm_panel/textures/firealarm_panel_sides.png
Binary files 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
--- /dev/null
+++ b/firealarm_pullstation/sounds/firealarm_pullstation_pull.ogg
Binary files 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
--- /dev/null
+++ b/firealarm_pullstation/sounds/firealarm_pullstation_reset.ogg
Binary files 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
--- /dev/null
+++ b/firealarm_pullstation/textures/firealarm_pullstation_back.png
Binary files 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
--- /dev/null
+++ b/firealarm_pullstation/textures/firealarm_pullstation_front_off.png
Binary files 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
--- /dev/null
+++ b/firealarm_pullstation/textures/firealarm_pullstation_front_on.png
Binary files differ
diff --git a/modpack.txt b/modpack.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/modpack.txt