2018-01-22 22:49:47 -08:00
--[[
Telemosaic [ telemosaic ]
=======================
A mod which provides player - placed teleport pads
Copyright ( C ) 2015 Ben Deutsch < ben @ bendeutsch.de >
Copyright ( C ) 2018 rewritten by SaKeL < juraj.vajda @ gmail.com >
License
-------
This library is free software ; you can redistribute it and / or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation ; either
version 2.1 of the License , or ( at your option ) any later version .
This library is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
Lesser General Public License for more details .
You should have received a copy of the GNU Lesser General Public
License along with this library ; if not , write to the Free Software
Foundation , Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301
USA
] ]
2018-01-21 21:46:07 -08:00
local enable_particles = minetest.settings : get_bool ( " enable_particles " )
2018-01-21 23:35:05 -08:00
-- @module telemosaic
2018-01-21 21:46:07 -08:00
telemosaic = { }
2018-01-21 23:35:05 -08:00
-- @field extender_ranges
2018-01-21 21:46:07 -08:00
telemosaic.extender_ranges = {
2018-01-23 20:17:37 -08:00
[ " telemosaic:extender_one " ] = 10 ,
[ " telemosaic:extender_two " ] = 30 ,
[ " telemosaic:extender_three " ] = 90
2018-01-21 21:46:07 -08:00
}
2018-01-21 23:35:05 -08:00
-- @field strengths
2018-01-21 21:46:07 -08:00
telemosaic.strengths = { " one " , " two " , " three " }
2018-01-22 22:49:47 -08:00
telemosaic.teleport_queue = { }
2018-01-21 21:46:07 -08:00
2018-01-21 23:35:05 -08:00
--- Add particle effect on deprature
-- @param {table} pos - deprature position
2018-01-21 21:46:07 -08:00
function telemosaic . effect_departure ( pos )
if not enable_particles then return end
2018-01-22 22:49:47 -08:00
return minetest.add_particlespawner ( {
2018-01-21 21:46:07 -08:00
amount = 100 ,
2018-01-22 09:56:35 -08:00
time = 5 ,
2018-01-21 21:46:07 -08:00
minpos = { x = pos.x , y = pos.y + 0.3 , z = pos.z } ,
maxpos = { x = pos.x , y = pos.y + 2 , z = pos.z } ,
minvel = { x = 1 , y = - 6 , z = 1 } ,
maxvel = { x = - 1 , y = - 1 , z = - 1 } ,
minacc = { x = 0 , y = - 2 , z = 0 } ,
maxacc = { x = 0 , y = - 6 , z = 0 } ,
minexptime = 0.1 ,
maxexptime = 1 ,
minsize = 0.5 ,
maxsize = 1.5 ,
texture = " telemosaic_particle_departure.png^[transform " .. math.random ( 0 , 3 ) ,
glow = 15 ,
} )
end
2018-01-21 23:35:05 -08:00
--- Add particle effect on arrival
-- @param {table} pos - arrival position
2018-01-21 21:46:07 -08:00
function telemosaic . effect_arrival ( pos )
2018-01-22 09:56:35 -08:00
minetest.sound_play ( " telemosaic_plop " , {
2018-01-21 21:46:07 -08:00
pos = pos ,
max_hear_distance = 8 ,
gain = 1
} )
2018-02-10 13:25:54 -08:00
2018-01-21 21:46:07 -08:00
if not enable_particles then return end
minetest.add_particlespawner ( {
amount = 100 ,
time = 0.25 ,
minpos = { x = pos.x , y = pos.y + 0.3 , z = pos.z } ,
maxpos = { x = pos.x , y = pos.y + 2 , z = pos.z } ,
minvel = { x = - 1 , y = 1 , z = - 1 } ,
maxvel = { x = 1 , y = 6 , z = 1 } ,
minacc = { x = 0 , y = - 2 , z = 0 } ,
maxacc = { x = 0 , y = - 6 , z = 0 } ,
minexptime = 0.1 ,
maxexptime = 1 ,
minsize = 0.5 ,
maxsize = 1.5 ,
texture = " telemosaic_particle_arrival.png^[transform " .. math.random ( 0 , 3 ) ,
glow = 15 ,
} )
end
2018-01-22 22:49:47 -08:00
function telemosaic . get_table_length ( tbl )
local length = 0
for k , v in pairs ( tbl ) do
length = length + 1
end
return length
end
function telemosaic . add_to_queue ( player , pos2 )
local ppos = player : getpos ( )
local dep_effect = telemosaic.effect_departure ( player : get_pos ( ) )
telemosaic.teleport_queue [ player : get_player_name ( ) ] = {
qtime = minetest.get_us_time ( ) + ( 5 * 1000000 ) ,
ppos = ppos ,
player = player ,
pos2 = pos2 ,
sound = minetest.sound_play ( " warps_woosh " , { pos = ppos , max_hear_distance = 8 , gain = 1 } ) ,
dep_effect = dep_effect
}
minetest.chat_send_player ( player : get_player_name ( ) , " Don't move for 5 seconds! " )
if telemosaic.get_table_length ( telemosaic.teleport_queue ) == 1 then
minetest.after ( 1 , telemosaic.from_queue )
end
-- attempt to emerge the target area before the player gets there
local vpos = vector.new ( pos2 )
minetest.get_voxel_manip ( ) : read_from_map ( vpos , vpos )
if not minetest.get_node_or_nil ( pos2 ) then
minetest.emerge_area ( vector.subtract ( vpos , 8 ) , vector.add ( vpos , 8 ) )
end
end
function telemosaic . from_queue ( )
if telemosaic.get_table_length ( telemosaic.teleport_queue ) == 0 then
return
end
local time = minetest.get_us_time ( )
2018-02-10 13:25:54 -08:00
2018-01-22 22:49:47 -08:00
for k , v in pairs ( telemosaic.teleport_queue ) do
if v.player : getpos ( ) then
if vector.equals ( v.player : getpos ( ) , v.ppos ) then
if time > v.qtime then
local pos2 = { x = v.pos2 . x , y = v.pos2 . y + 1 , z = v.pos2 . z }
v.player : setpos ( pos2 )
telemosaic.effect_arrival ( pos2 )
telemosaic.teleport_queue [ v.player : get_player_name ( ) ] = nil
end
else
minetest.sound_stop ( v.sound )
minetest.delete_particlespawner ( v.dep_effect )
minetest.chat_send_player ( v.player : get_player_name ( ) ,
" You have to stand still for 5 seconds! " )
telemosaic.teleport_queue [ v.player : get_player_name ( ) ] = nil
end
end
end
2018-02-10 13:25:54 -08:00
2018-01-22 22:49:47 -08:00
if telemosaic.get_table_length ( telemosaic.teleport_queue ) == 0 then
return
end
minetest.after ( 1 , telemosaic.from_queue )
end
2018-01-21 23:35:05 -08:00
--- Generate formspec dynamically
-- @param {table} pos - position of the node
-- @param {table} table - custom parameters passed in the table
-- @return {string} formspec - formspec string what can be set to metadata
2018-01-21 21:46:07 -08:00
function telemosaic . get_formspec ( pos , table )
local meta = minetest.get_meta ( pos )
local arrivals_tbl = meta : get_string ( " arrivals_tbl " )
local pos2_str = meta : get_string ( " dest_pos " )
local pos2 = minetest.string_to_pos ( pos2_str )
arrivals_tbl = minetest.deserialize ( arrivals_tbl )
if not arrivals_tbl then arrivals_tbl = { } end
local range = table.range or 0
local bname = meta : get_string ( " bname " )
if not bname or bname == " " then
2018-01-23 19:49:46 -08:00
bname = " beacon at: " .. minetest.pos_to_string ( pos )
2018-01-21 21:46:07 -08:00
end
2018-02-10 13:25:54 -08:00
2018-01-21 21:46:07 -08:00
local textlist = " "
for ipos , ival in pairs ( arrivals_tbl ) do
2018-01-23 19:49:46 -08:00
textlist = textlist .. minetest.formspec_escape ( ipos ) .. " : " .. minetest.formspec_escape ( ival ) .. " , "
2018-01-21 21:46:07 -08:00
end
local button_teleport = " "
local pos2_colorize = minetest.colorize ( " #ff0000 " , pos2_str )
if pos2 then
local meta2 = minetest.get_meta ( pos2 )
local bname2 = meta2 : get_string ( " bname " )
pos2_colorize = minetest.colorize ( " #00ff00 " , bname2 )
button_teleport = " button_exit[0.1,7.5;2.4,1.5;teleport;Teleport Now] "
end
-- dynamic formspec
local formspec = " size[12,8.5] " ..
default.gui_bg ..
default.gui_bg_img ..
default.gui_slots ..
" label[0,0.5;beacon position: " .. minetest.pos_to_string ( pos ) .. " ] " ..
2018-01-23 21:26:31 -08:00
" label[0,1;destination: " .. pos2_colorize .. " ] " ..
2018-01-21 21:46:07 -08:00
" label[0,1.5;range: " .. range .. " blocks] " ..
" field[0.34,2.7;4,1;bname;beacon name:; " .. bname .. " ] " ..
button_teleport ..
" button_exit[2.5,7.5;2.4,1.5;saveandclose;Save & Close] " ..
" label[5,0;Arrivals from ( x | y | z ):] " ..
" textlist[5,0.5;6.7,8;arrivals; " .. textlist .. " ;1;false] "
return formspec
end
2018-01-21 23:35:05 -08:00
--- Minetest "register_on_player_receive_fields" function
-- @see https://github.com/minetest/minetest/blob/master/doc/lua_api.txt
2018-01-21 21:46:07 -08:00
minetest.register_on_player_receive_fields ( function ( player , formname , fields )
local mod_pos_pos2 = formname : split ( " : " )
2018-01-23 19:49:46 -08:00
if mod_pos_pos2 [ 1 ] == " telemosaic " then
2018-01-25 17:59:37 -08:00
local pos = minetest.string_to_pos ( mod_pos_pos2 [ 2 ] )
if minetest.is_protected ( pos , player : get_player_name ( ) ) then
minetest.chat_send_player ( player : get_player_name ( ) , " You cannot use protected beacon! " )
return
end
2018-01-23 19:49:46 -08:00
-- beacon name change
if fields.bname then
local bname = fields.bname
local meta = minetest.get_meta ( pos )
local pos2 = minetest.string_to_pos ( mod_pos_pos2 [ 3 ] )
2018-02-10 13:25:54 -08:00
2018-01-23 19:49:46 -08:00
meta : set_string ( " bname " , bname )
if pos2 then
local meta2 = minetest.get_meta ( pos2 )
local arrivals_tbl2 = meta2 : get_string ( " arrivals_tbl " )
arrivals_tbl2 = minetest.deserialize ( arrivals_tbl2 )
if not arrivals_tbl2 then arrivals_tbl2 = { } end
arrivals_tbl2 [ minetest.pos_to_string ( pos ) ] = bname
meta2 : set_string ( " arrivals_tbl " , minetest.serialize ( arrivals_tbl2 ) )
end
2018-01-21 21:46:07 -08:00
end
2018-01-23 19:49:46 -08:00
-- teleport
2018-01-21 21:46:07 -08:00
if fields.teleport then
2018-01-23 19:49:46 -08:00
local pos = minetest.string_to_pos ( mod_pos_pos2 [ 2 ] )
local meta = minetest.get_meta ( pos )
2018-01-21 21:46:07 -08:00
local range = meta : get_int ( " range " )
2018-01-23 19:49:46 -08:00
local pos2 = minetest.string_to_pos ( mod_pos_pos2 [ 3 ] )
2018-01-21 21:46:07 -08:00
if pos2 then
if math.floor ( vector.distance ( pos , pos2 ) ) <= range then
2018-01-22 09:56:35 -08:00
for i = 1 , 2 do
if minetest.get_node ( { x = pos2.x , y = pos2.y + i , z = pos2.z } ) . name ~= " air " then
minetest.chat_send_player ( player : get_player_name ( ) , " Cannot teleport - not enough space in destination - the destination beacon is obstructed! " )
return
end
end
2018-01-22 22:49:47 -08:00
telemosaic.add_to_queue ( player , pos2 )
2018-01-21 21:46:07 -08:00
else
minetest.chat_send_player ( player : get_player_name ( ) , " Not enough power, destination is too far. Beacon needs " .. math.floor ( vector.distance ( pos , pos2 ) ) - range .. " more power. " )
end
end
end
end
end )
2018-02-10 13:25:54 -08:00
--
2018-01-21 21:46:07 -08:00
-- extenders
2018-02-10 13:25:54 -08:00
--
2018-01-21 23:35:05 -08:00
--- Minetest "after_place_node" function
-- @see https://github.com/minetest/minetest/blob/master/doc/lua_api.txt
2018-01-21 21:46:07 -08:00
function telemosaic . extender_after_place ( pos , placer , itemstack , pointed_thing )
local positions = minetest.find_nodes_in_area_under_air (
{ x = pos.x - 3 , y = pos.y , z = pos.z - 3 } ,
{ x = pos.x + 3 , y = pos.y , z = pos.z + 3 } ,
{ " telemosaic:beacon_off " , " telemosaic:beacon " , " telemosaic:beacon_err " } )
local meta = minetest.get_meta ( pos )
local playername = placer : get_player_name ( )
local nodename = itemstack : get_name ( )
if not minetest.registered_nodes [ nodename ] then return end
local description = minetest.registered_nodes [ nodename ] [ " description " ]
local power = telemosaic.extender_ranges [ nodename ]
for i , bpos in ipairs ( positions ) do
local bnode = minetest.get_node ( bpos )
local bmeta = minetest.get_meta ( bpos )
if not bnode then return end
local bnodename = bnode.name
if not minetest.registered_nodes [ bnodename ] then return end
local bdescription = minetest.registered_nodes [ bnodename ] [ " description " ]
local bowner = bmeta : get_string ( " owner " )
local brange = bmeta : get_int ( " range " )
brange = brange + power
bmeta : set_int ( " range " , brange )
telemosaic.set_status ( bpos , placer )
2018-01-21 23:35:05 -08:00
bmeta : set_string ( " infotext " , bdescription .. " \n owner: " .. bowner .. " \n range: " .. brange .. " blocks \n right-click for more info " )
2018-01-21 21:46:07 -08:00
end
meta : set_string ( " owner " , playername )
meta : set_string ( " infotext " , description .. " \n owner: " .. playername )
end
2018-01-21 23:35:05 -08:00
--- Minetest "on_destruct" function
-- @see https://github.com/minetest/minetest/blob/master/doc/lua_api.txt
2018-01-21 21:46:07 -08:00
function telemosaic . extender_on_destruct ( pos )
local node = minetest.get_node ( pos )
if not node then return end
local meta = minetest.get_meta ( pos )
local nodename = node.name
if not minetest.registered_nodes [ nodename ] then return end
local power = telemosaic.extender_ranges [ nodename ]
local positions = minetest.find_nodes_in_area_under_air (
{ x = pos.x - 3 , y = pos.y , z = pos.z - 3 } ,
{ x = pos.x + 3 , y = pos.y , z = pos.z + 3 } ,
{ " telemosaic:beacon_off " , " telemosaic:beacon " , " telemosaic:beacon_err " } )
for i , bpos in ipairs ( positions ) do
local bnode = minetest.get_node ( bpos )
local bmeta = minetest.get_meta ( bpos )
if not bmeta or not bnode then return end
local bnodename = bnode.name
if not minetest.registered_nodes [ bnodename ] then return end
local bdescription = minetest.registered_nodes [ bnodename ] [ " description " ]
local bowner = bmeta : get_string ( " owner " )
local brange = bmeta : get_int ( " range " )
brange = brange - power
if brange < 0 then brange = 0 end
bmeta : set_int ( " range " , brange )
telemosaic.set_status ( bpos )
2018-01-21 23:35:05 -08:00
bmeta : set_string ( " infotext " , bdescription .. " \n owner: " .. bowner .. " \n range: " .. brange .. " blocks \n right-click for more info " )
2018-01-21 21:46:07 -08:00
end
end
2018-02-10 13:25:54 -08:00
--
2018-01-21 21:46:07 -08:00
-- beacons
2018-02-10 13:25:54 -08:00
--
2018-01-21 23:35:05 -08:00
--- Finds extenders in the area under air, counts the range based on the found extenders power/strength
-- @param {table} be_pos - beacon position as a center point from where extenders will be searched
-- @returns {number} range - total power from found extenders
2018-01-21 21:46:07 -08:00
function telemosaic . get_range_from_extenders ( be_pos )
2018-01-21 23:35:05 -08:00
-- 7x1x7 area
2018-01-21 21:46:07 -08:00
local positions = minetest.find_nodes_in_area_under_air (
{ x = be_pos.x - 3 , y = be_pos.y , z = be_pos.z - 3 } ,
{ x = be_pos.x + 3 , y = be_pos.y , z = be_pos.z + 3 } ,
{ " telemosaic:extender_one " , " telemosaic:extender_two " , " telemosaic:extender_three " } )
local range = 0
for i , ex_pos in ipairs ( positions ) do
local inode = minetest.get_node ( ex_pos )
if not inode then return end
range = range + telemosaic.extender_ranges [ inode.name ]
end
return range
end
2018-01-21 23:35:05 -08:00
--- Manage state of the beacons, i.e. swap nodes and update metadata
-- @param {table} pos - beacon position of which the state should be managed
2018-01-21 21:46:07 -08:00
function telemosaic . set_status ( pos )
local meta = minetest.get_meta ( pos )
if not meta then return end
local range = meta : get_int ( " range " )
local pos2 = meta : get_string ( " dest_pos " )
local state = meta : get_string ( " state " )
local arrivals_tbl = meta : get_string ( " arrivals_tbl " )
arrivals_tbl = minetest.deserialize ( arrivals_tbl )
if not arrivals_tbl then arrivals_tbl = { } end
-- not enough energy (err)
if range <= 0 and
state ~= " err " then
minetest.swap_node ( pos , { name = " telemosaic:beacon_err " } )
meta : set_string ( " state " , " err " )
2018-02-10 13:25:54 -08:00
2018-01-21 21:46:07 -08:00
-- configured beacon (off)
elseif range > 0 and
pos2 == " not configured " and
state ~= " off " and
# arrivals_tbl == 0 then
minetest.swap_node ( pos , { name = " telemosaic:beacon_off " } )
meta : set_string ( " state " , " off " )
-- not configured beacon (on)
elseif range > 0 and
pos2 ~= " not configured " and
state ~= " on " then
minetest.swap_node ( pos , { name = " telemosaic:beacon " } )
meta : set_string ( " state " , " on " )
end
end
2018-01-21 23:35:05 -08:00
--- Minetest node "after_place_node" function
-- @see https://github.com/minetest/minetest/blob/master/doc/lua_api.txt
2018-01-21 21:46:07 -08:00
function telemosaic . beacon_after_place ( pos , placer , itemstack , pointed_thing )
local meta = minetest.get_meta ( pos )
local nodename = itemstack : get_name ( )
local playername = placer : get_player_name ( )
local range = telemosaic.get_range_from_extenders ( pos )
if not minetest.registered_nodes [ nodename ] then return end
2018-01-23 19:49:46 -08:00
local bname = " beacon at: " .. minetest.pos_to_string ( pos )
2018-01-21 21:46:07 -08:00
local description = minetest.registered_nodes [ nodename ] [ " description " ]
meta : set_int ( " range " , range )
meta : set_string ( " bname " , bname )
meta : set_string ( " owner " , playername )
meta : set_string ( " state " , " off " )
meta : set_string ( " dep_pos " , " " )
meta : set_string ( " dest_pos " , " not configured " )
meta : set_string ( " arrivals_tbl " , " {} " )
2018-01-21 23:35:05 -08:00
meta : set_string ( " infotext " , description .. " \n owner: " .. playername .. " \n range: " .. range .. " blocks \n right-click for more info " )
2018-02-10 13:25:54 -08:00
2018-01-21 21:46:07 -08:00
telemosaic.set_status ( pos )
end
2018-01-21 23:35:05 -08:00
--- Minetest node "on_rightclick" function
-- @see https://github.com/minetest/minetest/blob/master/doc/lua_api.txt
2018-01-21 21:46:07 -08:00
function telemosaic . beacon_rightclick ( pos , node , clicker , itemstack , pointed_thing )
local meta = minetest.get_meta ( pos )
local meta_stack = itemstack : get_meta ( )
local ownername = meta : get_string ( " owner " ) or " unknown "
local clickername = clicker : get_player_name ( )
local nodename = node.name
local stackname = itemstack : get_name ( )
local range = telemosaic.get_range_from_extenders ( pos )
if not minetest.registered_nodes [ nodename ] then return end
local description = minetest.registered_nodes [ nodename ] [ " description " ]
meta : set_int ( " range " , range )
-- departure
if stackname == " default:mese_crystal_fragment " and itemstack : get_count ( ) == 1 then
itemstack : replace ( " telemosaic:key " )
2018-01-25 17:59:37 -08:00
local item_description = minetest.registered_items [ itemstack : get_name ( ) ] [ " description " ]
2018-01-21 23:35:05 -08:00
-- remember departure position in the item meta
2018-01-21 21:46:07 -08:00
meta_stack : set_string ( " dep_pos " , minetest.pos_to_string ( pos ) )
2018-01-25 17:59:37 -08:00
meta_stack : set_string ( " description " , item_description .. " \n saved position: " .. minetest.pos_to_string ( pos ) )
2018-01-21 21:46:07 -08:00
2018-01-21 23:35:05 -08:00
meta : set_string ( " infotext " , description .. " \n owner: " .. ownername .. " \n range: " .. range .. " blocks \n right-click for more info " )
2018-01-21 21:46:07 -08:00
-- destination
elseif stackname == " telemosaic:key " then
2018-01-21 23:35:05 -08:00
-- get deprature position from item meta
2018-01-21 21:46:07 -08:00
local pos_stack = meta_stack : get_string ( " dep_pos " )
pos_stack = minetest.string_to_pos ( pos_stack )
2018-01-23 20:17:37 -08:00
if not pos_stack then return end
2018-01-23 19:49:46 -08:00
local meta2 = minetest.get_meta ( pos_stack )
local range2 = meta2 : get_int ( " range " )
2018-01-21 21:46:07 -08:00
2018-01-21 23:35:05 -08:00
-- do nothing if departure position is marked as arrival position
2018-01-21 21:46:07 -08:00
if math.floor ( vector.distance ( pos_stack , pos ) ) == 0 then
minetest.chat_send_player ( clickername , " This is marked as your departure position, you have to mark your destination position now! " )
return
2018-01-23 19:49:46 -08:00
-- too far, not enough range - keep the key
elseif math.floor ( vector.distance ( pos_stack , pos ) ) > range2 then
minetest.chat_send_player ( clickername , " The destination is too far, place the beacon closer about " .. math.floor ( vector.distance ( pos_stack , pos ) ) - range2 .. " blocks. " )
return
2018-01-21 23:35:05 -08:00
-- do nothing when arrival position is protected
2018-01-21 21:46:07 -08:00
elseif minetest.is_protected ( pos , clickername ) then
minetest.chat_send_player ( clickername , " You cannot configure protected beacons! " )
return
end
itemstack : replace ( " default:mese_crystal_fragment " )
2018-01-21 23:35:05 -08:00
-- remove this node position from arrival node "arrivals_tbl"
2018-01-21 21:46:07 -08:00
local bname2 = meta2 : get_string ( " bname " )
local pos3 = meta2 : get_string ( " dest_pos " )
pos3 = minetest.string_to_pos ( pos3 )
2018-01-21 23:35:05 -08:00
-- not for the node we just clicked though
2018-01-21 21:46:07 -08:00
if pos3 and math.floor ( vector.distance ( pos3 , pos ) ) ~= 0 then
local meta3 = minetest.get_meta ( pos3 )
local arrivals_tbl3 = meta3 : get_string ( " arrivals_tbl " )
arrivals_tbl3 = minetest.deserialize ( arrivals_tbl3 )
if not arrivals_tbl3 then arrivals_tbl3 = { } end
arrivals_tbl3 [ minetest.pos_to_string ( pos_stack ) ] = nil
meta3 : set_string ( ' arrivals_tbl ' , arrivals_tbl3 )
telemosaic.set_status ( pos3 )
2018-01-21 23:35:05 -08:00
end
-- add arrival position to the arrival table list
2018-01-21 21:46:07 -08:00
local arrivals_tbl = meta : get_string ( " arrivals_tbl " )
arrivals_tbl = minetest.deserialize ( arrivals_tbl )
if not arrivals_tbl then arrivals_tbl = { } end
arrivals_tbl [ minetest.pos_to_string ( pos_stack ) ] = bname2
arrivals_tbl = minetest.serialize ( arrivals_tbl )
meta2 : set_string ( " dest_pos " , minetest.pos_to_string ( pos ) )
meta : set_string ( " arrivals_tbl " , arrivals_tbl )
2018-01-21 23:35:05 -08:00
meta : set_string ( " infotext " , description .. " \n owner: " .. ownername .. " \n range: " .. range .. " blocks \n right-click for more info " )
2018-01-22 09:56:35 -08:00
minetest.sound_play ( " telemosaic_set " , {
pos = pos ,
max_hear_distance = 8 ,
gain = 1
} )
2018-01-21 21:46:07 -08:00
telemosaic.set_status ( pos_stack )
-- default place_node callback
2018-02-10 13:25:54 -08:00
-- elseif itemstack:get_definition().type == "node" then
-- itemstack = minetest.item_place_node(itemstack, clicker, pointed_thing)
2018-01-21 21:46:07 -08:00
else
-- mod : pos : pos2
2018-01-21 23:35:05 -08:00
-- - pos2 is from itemstack so not always set, else "not configured"
2018-01-21 21:46:07 -08:00
local formspec = telemosaic.get_formspec ( pos , {
range = range
} )
local pos2 = meta : get_string ( " dest_pos " )
minetest.show_formspec ( clickername , " telemosaic: " .. minetest.pos_to_string ( pos ) .. " : " .. pos2 , formspec )
2018-01-21 23:35:05 -08:00
meta : set_string ( " infotext " , description .. " \n owner: " .. ownername .. " \n range: " .. range .. " blocks \n right-click for more info " )
2018-01-21 21:46:07 -08:00
end
return itemstack
end
2018-01-21 23:35:05 -08:00
--- Minetest node "on_destruct" function
-- @see https://github.com/minetest/minetest/blob/master/doc/lua_api.txt
2018-01-21 21:46:07 -08:00
function telemosaic . beacon_on_destruct ( pos )
local meta = minetest.get_meta ( pos )
local pos2 = meta : get_string ( " dest_pos " )
pos2 = minetest.string_to_pos ( pos2 )
local arrivals_tbl = meta : get_string ( " arrivals_tbl " )
arrivals_tbl = minetest.deserialize ( arrivals_tbl )
if not arrivals_tbl then arrivals_tbl = { } end
-- found destination position, will update the meta in destination
if pos2 then
local meta2 = minetest.get_meta ( pos2 )
local arrivals_tbl2 = meta2 : get_string ( " arrivals_tbl " )
arrivals_tbl2 = minetest.deserialize ( arrivals_tbl2 )
if not arrivals_tbl2 then arrivals_tbl2 = { } end
2018-02-10 13:25:54 -08:00
2018-01-21 21:46:07 -08:00
if arrivals_tbl2 [ minetest.pos_to_string ( pos ) ] then
arrivals_tbl2 [ minetest.pos_to_string ( pos ) ] = nil
arrivals_tbl2 = minetest.serialize ( arrivals_tbl2 )
meta2 : set_string ( " arrivals_tbl " , arrivals_tbl2 )
end
2018-02-10 13:25:54 -08:00
2018-01-21 21:46:07 -08:00
meta2 : set_string ( " dest_pos " , " not configured " )
telemosaic.set_status ( pos2 )
end
2018-01-21 23:35:05 -08:00
-- update meta in all arrivals list from this node
2018-01-21 21:46:07 -08:00
for k , v in pairs ( arrivals_tbl ) do
local ipos = minetest.string_to_pos ( k )
local imeta = minetest.get_meta ( ipos )
imeta : set_string ( " dest_pos " , " not configured " )
telemosaic.set_status ( ipos )
end
2018-01-23 19:49:46 -08:00
2018-01-21 21:46:07 -08:00
end