2017-01-16 00:12:07 +01:00
minetest.register_node ( " digtron:empty_crate " , {
2017-01-18 03:57:20 +01:00
description = " Digtron Crate (Empty) " ,
_doc_items_longdesc = digtron.doc . empty_crate_longdesc ,
_doc_items_usagehelp = digtron.doc . empty_crate_usagehelp ,
2017-01-16 00:12:07 +01:00
groups = { cracky = 3 , oddly_breakable_by_hand = 3 } ,
drop = " digtron:empty_crate " ,
sounds = default.node_sound_wood_defaults ( ) ,
tiles = { " digtron_crate.png " } ,
is_ground_content = false ,
drawtype = " nodebox " ,
paramtype = " light " ,
on_rightclick = function ( pos , node , clicker , itemstack , pointed_thing )
local layout = DigtronLayout.create ( pos , clicker )
if layout.contains_protected_node then
local meta = minetest.get_meta ( pos )
minetest.sound_play ( " buzzer " , { gain = 0.5 , pos = pos } )
2017-01-20 08:19:33 +01:00
meta : set_string ( " infotext " , " Digtron can't be packaged, it contains protected blocks " )
2017-01-16 00:12:07 +01:00
-- no stealing other peoples' digtrons
return
end
2017-01-20 08:30:28 +01:00
digtron.award_crate ( layout , clicker : get_player_name ( ) )
2017-01-16 00:12:07 +01:00
local layout_string = layout : serialize ( )
-- destroy everything. Note that this includes the empty crate, which will be bundled up with the layout.
for _ , node_image in pairs ( layout.all ) do
minetest.remove_node ( node_image.pos )
end
-- Create the loaded crate node
minetest.set_node ( pos , { name = " digtron:loaded_crate " , param1 = node.param1 , param2 = node.param2 } )
2017-01-17 08:31:41 +01:00
minetest.sound_play ( " machine1 " , { gain = 1.0 , pos = pos } )
2017-01-16 00:12:07 +01:00
local meta = minetest.get_meta ( pos )
meta : set_string ( " crated_layout " , layout_string )
meta : set_string ( " title " , " Crated Digtron " )
meta : set_string ( " infotext " , " Crated Digtron " )
end ,
} )
local loaded_formspec = " size[4,1.5] " ..
default.gui_bg ..
default.gui_bg_img ..
default.gui_slots ..
" field[0.3,0.5;4,0.5;title;Digtron Name;${title}] " ..
2017-01-17 08:56:54 +01:00
" button_exit[0.5,1.2;1,0.1;save;Save \n Title] " ..
2017-01-16 00:12:07 +01:00
" tooltip[save;Saves the title of this Digtron] " ..
2017-01-20 08:19:33 +01:00
" button_exit[1.5,1.2;1,0.1;show;Show \n Blocks] " ..
" tooltip[save;Shows which blocks the packed Digtron will occupy if unpacked] " ..
2017-01-16 00:12:07 +01:00
" button_exit[2.5,1.2;1,0.1;unpack;Unpack] " ..
" tooltip[unpack;Attempts to unpack the Digtron on this location] "
minetest.register_node ( " digtron:loaded_crate " , {
2017-01-18 03:57:20 +01:00
description = " Digtron Crate (Loaded) " ,
_doc_items_longdesc = digtron.doc . loaded_crate_longdesc ,
_doc_items_usagehelp = digtron.doc . loaded_crate_usagehelp ,
2017-01-16 00:12:07 +01:00
groups = { cracky = 3 , oddly_breakable_by_hand = 3 , not_in_creative_inventory = 1 , digtron = 1 } ,
stack_max = 1 ,
sounds = default.node_sound_wood_defaults ( ) ,
tiles = { " digtron_plate.png^digtron_crate.png " } ,
is_ground_content = false ,
on_construct = function ( pos )
local meta = minetest.get_meta ( pos )
meta : set_string ( " formspec " , loaded_formspec )
end ,
on_receive_fields = function ( pos , formname , fields , sender )
local meta = minetest.get_meta ( pos )
2017-01-17 08:56:54 +01:00
if fields.unpack or fields.save or fields.show then
2017-01-16 00:12:07 +01:00
meta : set_string ( " title " , fields.title )
meta : set_string ( " infotext " , fields.title )
end
2017-01-17 08:56:54 +01:00
if not ( fields.unpack or fields.show ) then
2017-01-16 00:12:07 +01:00
return
end
local layout_string = meta : get_string ( " crated_layout " )
local layout = DigtronLayout.deserialize ( layout_string )
2017-01-17 08:56:54 +01:00
2017-01-16 00:12:07 +01:00
if layout == nil then
meta : set_string ( " infotext " , meta : get_string ( " title " ) .. " \n Unable to read layout from crate metadata, regrettably this Digtron may be corrupted or lost. " )
minetest.sound_play ( " buzzer " , { gain = 0.5 , pos = pos } )
-- Something went horribly wrong
return
end
2017-01-18 03:57:20 +01:00
local protected_node = false
local obstructed_node = false
local pos_diff = vector.subtract ( pos , layout.controller )
layout.controller = pos
2017-01-17 08:56:54 +01:00
for _ , node_image in pairs ( layout.all ) do
2017-01-18 03:57:20 +01:00
node_image.pos = vector.add ( pos_diff , node_image.pos )
2017-01-17 08:56:54 +01:00
if not vector.equals ( pos , node_image.pos ) then
2017-01-18 03:57:20 +01:00
if minetest.is_protected ( node_image.pos , sender : get_player_name ( ) ) and not minetest.check_player_privs ( sender , " protection_bypass " ) then
protected_node = true
minetest.add_entity ( node_image.pos , " digtron:marker_crate_bad " )
elseif not minetest.registered_nodes [ minetest.get_node ( node_image.pos ) . name ] . buildable_to then
obstructed_node = true
minetest.add_entity ( node_image.pos , " digtron:marker_crate_bad " )
else
minetest.add_entity ( node_image.pos , " digtron:marker_crate_good " )
end
2017-01-17 08:56:54 +01:00
end
end
if not fields.unpack then
return
end
2017-01-18 03:57:20 +01:00
if protected_node then
2017-01-20 08:19:33 +01:00
meta : set_string ( " infotext " , meta : get_string ( " title " ) .. " \n Unable to deploy Digtron due to protected blocks in target area " )
2017-01-18 03:57:20 +01:00
minetest.sound_play ( " buzzer " , { gain = 0.5 , pos = pos } )
return
2017-01-16 00:12:07 +01:00
end
2017-01-18 03:57:20 +01:00
if obstructed_node then
meta : set_string ( " infotext " , meta : get_string ( " title " ) .. " \n Unable to deploy Digtron due to obstruction in target area " )
minetest.sound_play ( " buzzer " , { gain = 0.5 , pos = pos } )
return
2017-01-16 00:12:07 +01:00
end
2017-01-18 03:57:20 +01:00
-- build digtron. Since the empty crate was included in the layout, that will overwrite this loaded crate and destroy it.
minetest.sound_play ( " machine2 " , { gain = 1.0 , pos = pos } )
layout : write_layout_image ( sender )
2017-01-16 00:12:07 +01:00
end ,
on_dig = function ( pos , node , player )
local meta = minetest.get_meta ( pos )
local to_serialize = { title = meta : get_string ( " title " ) , layout = meta : get_string ( " crated_layout " ) }
local stack = ItemStack ( { name = " digtron:loaded_crate " , count = 1 , wear = 0 , metadata = minetest.serialize ( to_serialize ) } )
local inv = player : get_inventory ( )
local stack = inv : add_item ( " main " , stack )
if stack : get_count ( ) > 0 then
minetest.add_item ( pos , stack )
end
-- call on_dignodes callback
minetest.remove_node ( pos )
end ,
on_place = function ( itemstack , placer , pointed_thing )
local pos = minetest.get_pointed_thing_position ( pointed_thing , true )
local deserialized = minetest.deserialize ( itemstack : get_metadata ( ) )
if pos and deserialized then
minetest.set_node ( pos , { name = " digtron:loaded_crate " } )
local meta = minetest.get_meta ( pos )
meta : set_string ( " crated_layout " , deserialized.layout )
meta : set_string ( " title " , deserialized.title )
meta : set_string ( " infotext " , deserialized.title )
meta : set_string ( " formspec " , loaded_formspec )
itemstack : take_item ( 1 )
return itemstack
end
-- after-place callbacks
end ,
} )