2015-06-29 17:55:56 +00:00
local tmp = { }
minetest.register_entity ( " itemframes:item " , {
hp_max = 1 ,
visual = " wielditem " ,
visual_size = { x = .33 , y = .33 } ,
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
if node.name == " itemframes: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
if obj and obj : get_luaentity ( ) and obj : get_luaentity ( ) . name == " itemframes:item " then
obj : remove ( )
end
end
end
end
local update_item = function ( pos , node )
remove_item ( pos , node )
2017-01-11 17:21:46 +00:00
local meta = minetest.get_meta ( pos )
2015-06-29 17:55:56 +00:00
if meta : get_string ( " item " ) ~= " " then
if node.name == " itemframes:frame " then
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 ( )
2017-01-11 17:21:46 +00:00
local e = minetest.add_entity ( pos , " itemframes:item " )
2015-06-29 17:55:56 +00:00
if node.name == " itemframes:frame " then
local yaw = math.pi * 2 - node.param2 * math.pi / 2
e : setyaw ( yaw )
end
end
end
2017-03-30 00:38:08 +00:00
local drop_item = function ( pos , node , meta )
2015-06-29 17:55:56 +00:00
if meta : get_string ( " item " ) ~= " " then
2017-03-02 16:37:46 +00:00
if node.name == " itemframes:frame " and not minetest.setting_getbool ( " creative_mode " ) then
2017-07-02 22:22:21 +00:00
local item = ItemStack ( minetest.deserialize ( meta : get_string ( " itemdata " ) ) )
minetest.add_item ( pos , item )
2015-06-29 17:55:56 +00:00
end
meta : set_string ( " item " , " " )
2017-07-02 22:22:21 +00:00
meta : set_string ( " itemdata " , " " )
2015-06-29 17:55:56 +00:00
end
remove_item ( pos , node )
end
minetest.register_node ( " itemframes:frame " , {
2017-01-04 05:51:26 +00:00
description = " Item Frame " ,
2017-03-02 20:55:25 +00: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. " ,
2015-06-29 17:55:56 +00:00
drawtype = " nodebox " ,
2017-01-04 21:36:51 +00:00
is_ground_content = false ,
2015-06-29 17:55:56 +00:00
node_box = { type = " fixed " , fixed = { - 0.5 , - 0.5 , 7 / 16 , 0.5 , 0.5 , 0.5 } } ,
selection_box = { type = " fixed " , fixed = { - 0.5 , - 0.5 , 7 / 16 , 0.5 , 0.5 , 0.5 } } ,
tiles = { " itemframe_background.png " } ,
inventory_image = " itemframes_frame.png " ,
wield_image = " itemframes_frame.png " ,
paramtype = " light " ,
paramtype2 = " facedir " ,
sunlight_propagates = true ,
2017-03-29 20:58:31 +00:00
groups = { dig_immediate = 3 , deco_block = 1 , dig_by_piston = 1 } ,
2017-02-11 17:46:23 +00:00
sounds = mcl_sounds.node_sound_defaults ( ) ,
2015-06-29 17:55:56 +00:00
after_place_node = function ( pos , placer , itemstack )
2017-01-11 17:21:46 +00:00
local meta = minetest.get_meta ( pos )
2015-06-29 17:55:56 +00:00
meta : set_string ( " owner " , placer : get_player_name ( ) )
meta : set_string ( " infotext " , " Item frame (owned by " .. placer : get_player_name ( ) .. " ) " )
end ,
on_rightclick = function ( pos , node , clicker , itemstack )
if not itemstack then return end
2017-01-11 17:21:46 +00:00
local meta = minetest.get_meta ( pos )
2015-06-29 17:55:56 +00:00
if clicker : get_player_name ( ) == meta : get_string ( " owner " ) then
2017-03-30 00:38:08 +00:00
drop_item ( pos , node , meta )
2017-07-02 22:22:21 +00:00
-- item holds the itemstring
2017-03-14 21:46:24 +00:00
meta : set_string ( " item " , itemstack : get_name ( ) )
2017-07-02 22:22:21 +00:00
local itemdata = minetest.serialize ( itemstack : to_table ( ) )
-- itemdata holds the serialized itemstack in table form
meta : set_string ( " itemdata " , itemdata )
2017-03-06 03:41:04 +00:00
update_item ( pos , node )
2017-03-02 16:18:29 +00:00
if not minetest.setting_getbool ( " creative_mode " ) then
itemstack : take_item ( )
end
2015-06-29 17:55:56 +00:00
end
return itemstack
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 ,
can_dig = function ( pos , player )
2017-01-11 17:21:46 +00:00
local meta = minetest.get_meta ( pos )
2015-06-29 17:55:56 +00:00
return player : get_player_name ( ) == meta : get_string ( " owner " )
end ,
} )
2017-01-12 02:04:58 +00:00
minetest.register_craft ( {
output = ' itemframes:frame ' ,
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
}
} )