Add camera

Essentially a "remote player detector", recommended uses include traffic light vehicle detection and security cameras
master
cheapie 2017-01-18 14:42:19 -06:00
parent 81b896e74a
commit 496ecdae27
9 changed files with 105 additions and 1 deletions

7
README
View File

@ -10,7 +10,7 @@ Textures WITH "adwaita" in the file name - These are icons by the GNOME Project,
Depends:
Required: digilines (base only) and mesecons (base only)
Only needed for craft recipes: default and mesecons_luacontroller
Only needed for craft recipes: default, mesecons_luacontroller, homedecor
How to use digilines buttons:
@ -34,3 +34,8 @@ Once a channel is set, any messages sent on that channel will be shown on the "L
How to use the NIC:
Send a digilines signal with the URL you want to download. The HTTPRequestResult table will be sent back on the same channel.
How to use the camera:
Set the channel, distance, and radius. The camera will search for a node "distance" meters away and up to 10m down.
Every second while a player is within "radius" meters of that point, a table listing the players in range will be sent via digilines on the chosen channel.

View File

@ -829,3 +829,102 @@ if http then
}
})
end
minetest.register_node("digistuff:camera", {
tiles = {
"digistuff_camera_top.png",
"digistuff_camera_bottom.png",
"digistuff_camera_right.png",
"digistuff_camera_left.png",
"digistuff_camera_back.png",
"digistuff_camera_front.png",
},
digiline =
{
receptor = {}
},
groups = {cracky=2},
paramtype = "light",
paramtype2 = "facedir",
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
{-0.1,-0.5,-0.28,0.1,-0.3,0.3}, --Camera Body
{-0.045,-0.42,-0.34,0.045,-0.36,-0.28}, -- Lens
{-0.05,-0.9,-0.05,0.05,-0.5,0.05}, --Pole
}
},
selection_box = {
type = "fixed",
fixed = {
{-0.1,-0.5,-0.34,0.1,-0.3,0.3}, --Camera Body
}
},
description = "Digilines Camera",
on_construct = function(pos)
local meta = minetest.get_meta(pos)
meta:set_string("formspec","size[8,6;]field[1,1;6,2;channel;Channel;${channel}]field[1,2;6,2;radius;Radius (max 10);${radius}]field[1,3;6,2;distance;Distance (max 20);${distance}]button_exit[2.25,4;3,1;submit;Save]")
end,
on_receive_fields = function(pos, formname, fields, sender)
local name = sender:get_player_name()
if minetest.is_protected(pos,name) and not minetest.check_player_privs(name,{protection_bypass=true}) then
minetest.record_protection_violation(pos,name)
return
end
local meta = minetest.get_meta(pos)
if fields.channel then meta:set_string("channel",fields.channel) end
if fields.distance and tonumber(fields.distance) then meta:set_int("distance",math.max(math.min(20,fields.distance),0)) end
if fields.radius and tonumber(fields.radius) then meta:set_int("radius",math.max(math.min(10,fields.radius),1)) end
end,
sounds = default.node_sound_stone_defaults()
})
minetest.register_abm({
nodenames = {"digistuff:camera"},
interval = 1.0,
chance = 1,
action = function(pos,node)
local meta = minetest.get_meta(pos)
local channel = meta:get_string("channel")
local radius = meta:get_int("radius")
local distance = meta:get_int("distance")
local dir = vector.multiply(minetest.facedir_to_dir(node.param2),-1)
local spot = vector.add(pos,vector.multiply(dir,distance))
local i = 0
while i <= 10 and minetest.get_node(spot).name == "air" do
--Downward search for ground level
spot = vector.add(spot,vector.new(0,-1,0))
i = i + 1
end
if minetest.get_node(spot).name == "air" or minetest.get_node(spot).name == "ignore" then
--Ground not in range
return
end
local found_any = false
local players_found = {}
local objs = minetest.get_objects_inside_radius(spot,radius)
if objs then
local _,obj
for _,obj in ipairs(objs) do
if obj:is_player() then
table.insert(players_found,obj:get_player_name())
found_any = true
end
end
if found_any then
digiline:receptor_send({x=pos.x,y=pos.y-1,z=pos.z}, digiline.rules.default, channel, players_found)
end
end
end
})
minetest.register_craft({
output = "digistuff:camera",
recipe = {
{"homedecor:plastic_sheeting","homedecor:plastic_sheeting","homedecor:plastic_sheeting"},
{"default:glass","homedecor:ic","mesecons_luacontroller:luacontroller0000"},
{"homedecor:plastic_sheeting","homedecor:plastic_sheeting","homedecor:plastic_sheeting"},
}
})

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 303 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 239 B