2015-06-29 20:55:56 +03:00
local tmp = { }
2018-05-12 19:18:17 +03:00
minetest.register_entity ( " mcl_itemframes:item " , {
2015-06-29 20:55:56 +03:00
hp_max = 1 ,
visual = " wielditem " ,
2017-08-03 17:08:25 +03:00
visual_size = { x = 0.3 , y = 0.3 } ,
2015-06-29 20:55:56 +03:00
collisionbox = { 0 , 0 , 0 , 0 , 0 , 0 } ,
physical = false ,
textures = { " air " } ,
on_activate = function ( self , staticdata )
if tmp.nodename ~= nil and tmp.texture ~= nil then
self.nodename = tmp.nodename
tmp.nodename = nil
self.texture = tmp.texture
tmp.texture = nil
else
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 ]
end
end
end
if self.texture ~= nil then
self.object : set_properties ( { textures = { self.texture } } )
end
end ,
get_staticdata = function ( self )
if self.nodename ~= nil and self.texture ~= nil then
return self.nodename .. ' ; ' .. self.texture
end
return " "
end ,
} )
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 }
local remove_item = function ( pos , node )
local objs = nil
2018-05-12 19:18:17 +03:00
if node.name == " mcl_itemframes:item_frame " then
2017-01-11 19:21:46 +02:00
objs = minetest.get_objects_inside_radius ( pos , .5 )
2015-06-29 20:55:56 +03:00
end
if objs then
for _ , obj in ipairs ( objs ) do
2018-05-12 19:18:17 +03:00
if obj and obj : get_luaentity ( ) and obj : get_luaentity ( ) . name == " mcl_itemframes:item " then
2015-06-29 20:55:56 +03:00
obj : remove ( )
end
end
end
end
local update_item = function ( pos , node )
remove_item ( pos , node )
2017-01-11 19:21:46 +02:00
local meta = minetest.get_meta ( pos )
2015-06-29 20:55:56 +03:00
if meta : get_string ( " item " ) ~= " " then
2018-05-12 19:18:17 +03:00
if node.name == " mcl_itemframes:item_frame " then
2015-06-29 20:55:56 +03: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
tmp.nodename = node.name
tmp.texture = ItemStack ( meta : get_string ( " item " ) ) : get_name ( )
2018-05-12 19:18:17 +03:00
local e = minetest.add_entity ( pos , " mcl_itemframes:item " )
if node.name == " mcl_itemframes:item_frame " then
2015-06-29 20:55:56 +03:00
local yaw = math.pi * 2 - node.param2 * math.pi / 2
e : setyaw ( yaw )
end
end
end
2017-03-30 03:38:08 +03:00
local drop_item = function ( pos , node , meta )
2015-06-29 20:55:56 +03:00
if meta : get_string ( " item " ) ~= " " then
2018-05-12 19:18:17 +03:00
if node.name == " mcl_itemframes:item_frame " and not minetest.settings : get_bool ( " creative_mode " ) then
2017-07-03 01:22:21 +03:00
local item = ItemStack ( minetest.deserialize ( meta : get_string ( " itemdata " ) ) )
minetest.add_item ( pos , item )
2015-06-29 20:55:56 +03:00
end
meta : set_string ( " item " , " " )
2017-07-03 01:22:21 +03:00
meta : set_string ( " itemdata " , " " )
2015-06-29 20:55:56 +03:00
end
remove_item ( pos , node )
end
2017-12-05 15:09:39 +02:00
local on_rotate
if minetest.get_modpath ( " screwdriver " ) then
on_rotate = screwdriver.disallow
end
2018-05-12 19:18:17 +03:00
minetest.register_node ( " mcl_itemframes:item_frame " , {
2017-01-04 07:51:26 +02:00
description = " Item Frame " ,
2017-03-02 22:55:25 +02:00
_doc_items_longdesc = " Item frames are decorative blocks in which items can be placed. " ,
_doc_items_usagehelp = " 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 17:01:23 +03:00
drawtype = " mesh " ,
2017-01-04 23:36:51 +02:00
is_ground_content = false ,
2018-05-12 19:18:17 +03:00
mesh = " mcl_itemframes_itemframe1facedir.obj " ,
2017-08-03 17:01:23 +03: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 19:18:17 +03: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 20:55:56 +03:00
paramtype = " light " ,
paramtype2 = " facedir " ,
sunlight_propagates = true ,
2017-03-29 23:58:31 +03:00
groups = { dig_immediate = 3 , deco_block = 1 , dig_by_piston = 1 } ,
2017-02-11 19:46:23 +02:00
sounds = mcl_sounds.node_sound_defaults ( ) ,
2015-06-29 20:55:56 +03:00
on_rightclick = function ( pos , node , clicker , itemstack )
if not itemstack then return end
2017-01-11 19:21:46 +02:00
local meta = minetest.get_meta ( pos )
2017-12-11 00:06:03 +02:00
drop_item ( pos , node , meta )
-- item holds the itemstring
meta : set_string ( " item " , itemstack : get_name ( ) )
local put_itemstack = ItemStack ( itemstack )
put_itemstack : set_count ( 1 )
local itemdata = minetest.serialize ( put_itemstack : to_table ( ) )
-- itemdata holds the serialized itemstack in table form
meta : set_string ( " itemdata " , itemdata )
update_item ( pos , node )
if not minetest.settings : get_bool ( " creative_mode " ) then
itemstack : take_item ( )
2015-06-29 20:55:56 +03:00
end
return itemstack
end ,
2017-03-30 03:38:08 +03:00
on_destruct = function ( pos )
2017-01-11 19:21:46 +02:00
local meta = minetest.get_meta ( pos )
2017-03-30 03:38:08 +03:00
local node = minetest.get_node ( pos )
drop_item ( pos , node , meta )
2015-06-29 20:55:56 +03:00
end ,
2017-12-05 15:09:39 +02:00
on_rotate = on_rotate ,
2015-06-29 20:55:56 +03:00
} )
2017-01-12 04:04:58 +02:00
minetest.register_craft ( {
2018-05-12 19:18:17 +03:00
output = ' mcl_itemframes:item_frame ' ,
2017-01-12 04:04:58 +02:00
recipe = {
2017-02-01 00:32:56 +02: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 04:04:58 +02:00
}
} )
2018-05-12 19:18:17 +03:00
2018-05-12 19:50:44 +03: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 "
minetest.swap_node ( pos , node )
update_item ( pos , node )
end ,
} )