diff options
| author | cheapie <no-email-for-you@example.com> | 2018-08-24 16:19:53 -0500 | 
|---|---|---|
| committer | cheapie <no-email-for-you@example.com> | 2018-08-24 16:19:53 -0500 | 
| commit | df75dc7b7ec03a3b30052efbea988c3ab2b8f430 (patch) | |
| tree | 60b9f3982ed111b7effcff5ff54eb7862997c732 | |
| download | firealarm-df75dc7b7ec03a3b30052efbea988c3ab2b8f430.tar firealarm-df75dc7b7ec03a3b30052efbea988c3ab2b8f430.tar.gz firealarm-df75dc7b7ec03a3b30052efbea988c3ab2b8f430.tar.bz2 firealarm-df75dc7b7ec03a3b30052efbea988c3ab2b8f430.tar.xz firealarm-df75dc7b7ec03a3b30052efbea988c3ab2b8f430.zip | |
Initial commit
26 files changed, 861 insertions, 0 deletions
| @@ -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.oggBinary files differ new file mode 100644 index 0000000..7ea565e --- /dev/null +++ b/firealarm_hornstrobe/sounds/firealarm_horn.ogg diff --git a/firealarm_hornstrobe/textures/firealarm_hornstrobe_back.png b/firealarm_hornstrobe/textures/firealarm_hornstrobe_back.pngBinary files differ new file mode 100644 index 0000000..4beaa00 --- /dev/null +++ b/firealarm_hornstrobe/textures/firealarm_hornstrobe_back.png diff --git a/firealarm_hornstrobe/textures/firealarm_hornstrobe_front_off.png b/firealarm_hornstrobe/textures/firealarm_hornstrobe_front_off.pngBinary files differ new file mode 100644 index 0000000..0033f4c --- /dev/null +++ b/firealarm_hornstrobe/textures/firealarm_hornstrobe_front_off.png diff --git a/firealarm_hornstrobe/textures/firealarm_hornstrobe_front_on.png b/firealarm_hornstrobe/textures/firealarm_hornstrobe_front_on.pngBinary files differ new file mode 100644 index 0000000..fdca07d --- /dev/null +++ b/firealarm_hornstrobe/textures/firealarm_hornstrobe_front_on.png diff --git a/firealarm_hornstrobe/textures/firealarm_hornstrobe_side.png b/firealarm_hornstrobe/textures/firealarm_hornstrobe_side.pngBinary files differ new file mode 100644 index 0000000..7f33a6d --- /dev/null +++ b/firealarm_hornstrobe/textures/firealarm_hornstrobe_side.png 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.oggBinary files differ new file mode 100644 index 0000000..6f87642 --- /dev/null +++ b/firealarm_panel/sounds/firealarm_panel_piezo.ogg diff --git a/firealarm_panel/textures/firealarm_panel_front_normal.png b/firealarm_panel/textures/firealarm_panel_front_normal.pngBinary files differ new file mode 100644 index 0000000..b3ba575 --- /dev/null +++ b/firealarm_panel/textures/firealarm_panel_front_normal.png diff --git a/firealarm_panel/textures/firealarm_panel_led_alarm.png b/firealarm_panel/textures/firealarm_panel_led_alarm.pngBinary files differ new file mode 100644 index 0000000..48a4233 --- /dev/null +++ b/firealarm_panel/textures/firealarm_panel_led_alarm.png diff --git a/firealarm_panel/textures/firealarm_panel_led_supervisory.png b/firealarm_panel/textures/firealarm_panel_led_supervisory.pngBinary files differ new file mode 100644 index 0000000..285ebab --- /dev/null +++ b/firealarm_panel/textures/firealarm_panel_led_supervisory.png diff --git a/firealarm_panel/textures/firealarm_panel_led_trouble.png b/firealarm_panel/textures/firealarm_panel_led_trouble.pngBinary files differ new file mode 100644 index 0000000..5196dde --- /dev/null +++ b/firealarm_panel/textures/firealarm_panel_led_trouble.png diff --git a/firealarm_panel/textures/firealarm_panel_sides.png b/firealarm_panel/textures/firealarm_panel_sides.pngBinary files differ new file mode 100644 index 0000000..4beaa00 --- /dev/null +++ b/firealarm_panel/textures/firealarm_panel_sides.png 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.oggBinary files differ new file mode 100644 index 0000000..1f6922e --- /dev/null +++ b/firealarm_pullstation/sounds/firealarm_pullstation_pull.ogg diff --git a/firealarm_pullstation/sounds/firealarm_pullstation_reset.ogg b/firealarm_pullstation/sounds/firealarm_pullstation_reset.oggBinary files differ new file mode 100644 index 0000000..7e125e0 --- /dev/null +++ b/firealarm_pullstation/sounds/firealarm_pullstation_reset.ogg diff --git a/firealarm_pullstation/textures/firealarm_pullstation_back.png b/firealarm_pullstation/textures/firealarm_pullstation_back.pngBinary files differ new file mode 100644 index 0000000..4beaa00 --- /dev/null +++ b/firealarm_pullstation/textures/firealarm_pullstation_back.png diff --git a/firealarm_pullstation/textures/firealarm_pullstation_front_off.png b/firealarm_pullstation/textures/firealarm_pullstation_front_off.pngBinary files differ new file mode 100644 index 0000000..a77f411 --- /dev/null +++ b/firealarm_pullstation/textures/firealarm_pullstation_front_off.png diff --git a/firealarm_pullstation/textures/firealarm_pullstation_front_on.png b/firealarm_pullstation/textures/firealarm_pullstation_front_on.pngBinary files differ new file mode 100644 index 0000000..e5fc410 --- /dev/null +++ b/firealarm_pullstation/textures/firealarm_pullstation_front_on.png diff --git a/modpack.txt b/modpack.txt new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/modpack.txt | 
