2019-03-07 23:22:28 +00:00
local S = minetest.get_translator ( " mcl_itemframes " )
2018-05-12 16:18:17 +00:00
minetest.register_entity ( " mcl_itemframes:item " , {
2015-06-29 17:55:56 +00:00
hp_max = 1 ,
2018-05-12 17:06:44 +00:00
visual = " wielditem " ,
visual_size = { x = 0.3 , y = 0.3 } ,
physical = false ,
2019-03-07 02:53:06 +00:00
pointable = false ,
2018-05-12 17:06:44 +00:00
textures = { " empty.png " } ,
2018-05-12 21:50:17 +00:00
_texture = " empty.png " ,
2015-06-29 17:55:56 +00:00
on_activate = function ( self , staticdata )
2018-05-12 17:06:44 +00:00
if staticdata ~= nil and staticdata ~= " " then
local data = staticdata : split ( ' ; ' )
if data and data [ 1 ] and data [ 2 ] then
self._nodename = data [ 1 ]
self._texture = data [ 2 ]
2015-06-29 17:55:56 +00:00
end
end
2018-05-12 17:06:44 +00:00
if self._texture ~= nil then
self.object : set_properties ( { textures = { self._texture } } )
2015-06-29 17:55:56 +00:00
end
end ,
get_staticdata = function ( self )
2018-05-12 17:06:44 +00:00
if self._nodename ~= nil and self._texture ~= nil then
return self._nodename .. ' ; ' .. self._texture
2015-06-29 17:55:56 +00:00
end
return " "
end ,
2018-05-12 17:06:44 +00:00
_update_texture = function ( self )
if self._texture ~= nil then
self.object : set_properties ( { textures = { self._texture } } )
end
end ,
2015-06-29 17:55:56 +00:00
} )
local facedir = { }
facedir [ 0 ] = { x = 0 , y = 0 , z = 1 }
facedir [ 1 ] = { x = 1 , y = 0 , z = 0 }
facedir [ 2 ] = { x = 0 , y = 0 , z =- 1 }
facedir [ 3 ] = { x =- 1 , y = 0 , z = 0 }
2018-05-12 17:21:41 +00:00
local remove_item_entity = function ( pos , node )
2015-06-29 17:55:56 +00:00
local objs = nil
2018-05-12 16:18:17 +00:00
if node.name == " mcl_itemframes:item_frame " then
2017-01-11 17:21:46 +00:00
objs = minetest.get_objects_inside_radius ( pos , .5 )
2015-06-29 17:55:56 +00:00
end
if objs then
for _ , obj in ipairs ( objs ) do
2018-05-12 16:18:17 +00:00
if obj and obj : get_luaentity ( ) and obj : get_luaentity ( ) . name == " mcl_itemframes:item " then
2015-06-29 17:55:56 +00:00
obj : remove ( )
end
end
end
end
2018-05-12 17:21:41 +00:00
local update_item_entity = function ( pos , node )
remove_item_entity ( pos , node )
2017-01-11 17:21:46 +00:00
local meta = minetest.get_meta ( pos )
2018-05-12 21:50:17 +00:00
local inv = meta : get_inventory ( )
local item = inv : get_stack ( " main " , 1 )
if not item : is_empty ( ) then
2018-05-12 16:18:17 +00:00
if node.name == " mcl_itemframes:item_frame " then
2015-06-29 17:55:56 +00:00
local posad = facedir [ node.param2 ]
pos.x = pos.x + posad.x * 6.5 / 16
pos.y = pos.y + posad.y * 6.5 / 16
pos.z = pos.z + posad.z * 6.5 / 16
end
2018-05-12 21:50:17 +00:00
local e = minetest.add_entity ( pos , " mcl_itemframes:item " )
2018-05-12 17:06:44 +00:00
local lua = e : get_luaentity ( )
lua._nodename = node.name
2018-05-12 21:50:17 +00:00
if item : get_name ( ) == " " then
lua._texture = " blank.png "
else
lua._texture = item : get_name ( )
end
2018-05-12 17:06:44 +00:00
lua : _update_texture ( )
2018-05-12 16:18:17 +00:00
if node.name == " mcl_itemframes:item_frame " then
2015-06-29 17:55:56 +00:00
local yaw = math.pi * 2 - node.param2 * math.pi / 2
2019-03-06 03:38:57 +00:00
e : set_yaw ( yaw )
2015-06-29 17:55:56 +00:00
end
end
end
2017-03-30 00:38:08 +00:00
local drop_item = function ( pos , node , meta )
2018-05-12 21:50:17 +00:00
if node.name == " mcl_itemframes:item_frame " and not minetest.settings : get_bool ( " creative_mode " ) then
local inv = meta : get_inventory ( )
local item = inv : get_stack ( " main " , 1 )
if not item : is_empty ( ) then
2017-07-02 22:22:21 +00:00
minetest.add_item ( pos , item )
2015-06-29 17:55:56 +00:00
end
end
2018-05-12 21:50:17 +00:00
meta : set_string ( " infotext " , " " )
2018-05-12 17:21:41 +00:00
remove_item_entity ( pos , node )
2015-06-29 17:55:56 +00:00
end
2017-12-05 13:09:39 +00:00
local on_rotate
if minetest.get_modpath ( " screwdriver " ) then
on_rotate = screwdriver.disallow
end
2018-05-12 16:18:17 +00:00
minetest.register_node ( " mcl_itemframes:item_frame " , {
2019-03-07 23:22:28 +00:00
description = S ( " Item Frame " ) ,
_doc_items_longdesc = S ( " Item frames are decorative blocks in which items can be placed. " ) ,
_doc_items_usagehelp = S ( " Hold any item in your hand and right-click the item frame to place the item into the frame. Rightclick the item frame again to retrieve the item. " ) ,
2017-08-03 14:01:23 +00:00
drawtype = " mesh " ,
2017-01-04 21:36:51 +00:00
is_ground_content = false ,
2018-05-12 16:18:17 +00:00
mesh = " mcl_itemframes_itemframe1facedir.obj " ,
2017-08-03 14:01:23 +00:00
selection_box = { type = " fixed " , fixed = { - 6 / 16 , - 6 / 16 , 7 / 16 , 6 / 16 , 6 / 16 , 0.5 } } ,
collision_box = { type = " fixed " , fixed = { - 6 / 16 , - 6 / 16 , 7 / 16 , 6 / 16 , 6 / 16 , 0.5 } } ,
2018-05-12 16:18:17 +00:00
tiles = { " mcl_itemframes_itemframe_background.png " , " mcl_itemframes_itemframe_background.png " , " mcl_itemframes_itemframe_background.png " , " mcl_itemframes_itemframe_background.png " , " default_wood.png " , " mcl_itemframes_itemframe_background.png " } ,
inventory_image = " mcl_itemframes_item_frame.png " ,
wield_image = " mcl_itemframes_item_frame.png " ,
2015-06-29 17:55:56 +00:00
paramtype = " light " ,
paramtype2 = " facedir " ,
sunlight_propagates = true ,
2018-05-12 21:50:17 +00:00
groups = { dig_immediate = 3 , deco_block = 1 , dig_by_piston = 1 , container = 7 } ,
2017-02-11 17:46:23 +00:00
sounds = mcl_sounds.node_sound_defaults ( ) ,
2018-05-12 21:50:17 +00:00
on_construct = function ( pos )
local meta = minetest.get_meta ( pos )
local inv = meta : get_inventory ( )
inv : set_size ( " main " , 1 )
end ,
2015-06-29 17:55:56 +00:00
on_rightclick = function ( pos , node , clicker , itemstack )
2018-05-12 21:50:17 +00:00
if not itemstack then
return
end
2019-02-08 20:59:01 +00:00
local pname = clicker : get_player_name ( )
if minetest.is_protected ( pos , pname ) then
minetest.record_protection_violation ( pos , pname )
return
end
2017-01-11 17:21:46 +00:00
local meta = minetest.get_meta ( pos )
2017-12-10 22:06:03 +00:00
drop_item ( pos , node , meta )
2018-05-12 21:50:17 +00:00
local inv = meta : get_inventory ( )
if itemstack : is_empty ( ) then
remove_item_entity ( pos , node )
meta : set_string ( " infotext " , " " )
inv : set_stack ( " main " , 1 , " " )
return itemstack
end
2017-12-10 22:06:03 +00:00
local put_itemstack = ItemStack ( itemstack )
put_itemstack : set_count ( 1 )
2018-05-12 21:50:17 +00:00
inv : set_stack ( " main " , 1 , put_itemstack )
update_item_entity ( pos , node )
2018-05-12 17:21:41 +00:00
-- Add node infotext when item has been named
local imeta = itemstack : get_meta ( )
local iname = imeta : get_string ( " name " )
if iname then
meta : set_string ( " infotext " , iname )
end
2017-12-10 22:06:03 +00:00
if not minetest.settings : get_bool ( " creative_mode " ) then
itemstack : take_item ( )
2015-06-29 17:55:56 +00:00
end
return itemstack
end ,
2019-02-08 20:59:01 +00:00
allow_metadata_inventory_move = function ( pos , from_list , from_index , to_list , to_index , count , player )
local name = player : get_player_name ( )
if minetest.is_protected ( pos , name ) then
minetest.record_protection_violation ( pos , name )
return 0
else
return count
end
end ,
allow_metadata_inventory_take = function ( pos , listname , index , stack , player )
local name = player : get_player_name ( )
if minetest.is_protected ( pos , name ) then
minetest.record_protection_violation ( pos , name )
return 0
else
return stack : get_count ( )
end
end ,
allow_metadata_inventory_put = function ( pos , listname , index , stack , player )
local name = player : get_player_name ( )
if minetest.is_protected ( pos , name ) then
minetest.record_protection_violation ( pos , name )
return 0
else
return stack : get_count ( )
end
end ,
2017-03-30 00:38:08 +00:00
on_destruct = function ( pos )
2017-01-11 17:21:46 +00:00
local meta = minetest.get_meta ( pos )
2017-03-30 00:38:08 +00:00
local node = minetest.get_node ( pos )
drop_item ( pos , node , meta )
2015-06-29 17:55:56 +00:00
end ,
2017-12-05 13:09:39 +00:00
on_rotate = on_rotate ,
2015-06-29 17:55:56 +00:00
} )
2017-01-12 02:04:58 +00:00
minetest.register_craft ( {
2018-05-12 16:18:17 +00:00
output = ' mcl_itemframes:item_frame ' ,
2017-01-12 02:04:58 +00:00
recipe = {
2017-01-31 22:32:56 +00:00
{ ' mcl_core:stick ' , ' mcl_core:stick ' , ' mcl_core:stick ' } ,
{ ' mcl_core:stick ' , ' mcl_mobitems:leather ' , ' mcl_core:stick ' } ,
{ ' mcl_core:stick ' , ' mcl_core:stick ' , ' mcl_core:stick ' } ,
2017-01-12 02:04:58 +00:00
}
} )
2018-05-12 16:18:17 +00:00
2018-05-12 16:50:44 +00:00
minetest.register_lbm ( {
label = " Update legacy item frames " ,
name = " mcl_itemframes:update_legacy_item_frames " ,
nodenames = { " itemframes:frame " } ,
action = function ( pos , node )
-- Swap legacy node, then respawn entity
node.name = " mcl_itemframes:item_frame "
2018-05-12 21:50:17 +00:00
local meta = minetest.get_meta ( pos )
local item = meta : get_string ( " item " )
2018-05-12 16:50:44 +00:00
minetest.swap_node ( pos , node )
2018-05-12 21:50:17 +00:00
if item ~= " " then
local itemstack = ItemStack ( minetest.deserialize ( meta : get_string ( " itemdata " ) ) )
local inv = meta : get_inventory ( )
inv : set_size ( " main " , 1 )
if not itemstack : is_empty ( ) then
inv : set_stack ( " main " , 1 , itemstack )
end
end
2018-05-12 17:21:41 +00:00
update_item_entity ( pos , node )
2018-05-12 16:50:44 +00:00
end ,
} )
2018-05-12 22:57:32 +00:00
2019-02-18 23:06:47 +00:00
-- FIXME: Item entities can get destroyed by /clearobjects
2019-02-18 20:58:31 +00:00
minetest.register_lbm ( {
label = " Respawn item frame item entities " ,
name = " mcl_itemframes:respawn_entities " ,
nodenames = { " mcl_itemframes:item_frame " } ,
run_at_every_load = true ,
action = function ( pos , node )
update_item_entity ( pos , node )
end ,
} )
2018-05-12 22:57:32 +00:00
minetest.register_alias ( " itemframes:frame " , " mcl_itemframes:item_frame " )