2015-06-29 20:55:56 +03: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 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
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 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
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 19:21:46 +02:00
local e = minetest.add_entity ( pos , " itemframes:item " )
2015-06-29 20:55:56 +03:00
if node.name == " itemframes:frame " then
local yaw = math.pi * 2 - node.param2 * math.pi / 2
e : setyaw ( yaw )
end
end
end
local drop_item = function ( 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
2017-03-02 18:37:46 +02:00
if node.name == " itemframes:frame " and not minetest.setting_getbool ( " creative_mode " ) then
2017-01-11 19:21:46 +02:00
minetest.add_item ( pos , meta : get_string ( " item " ) )
2015-06-29 20:55:56 +03:00
end
meta : set_string ( " item " , " " )
end
remove_item ( pos , node )
end
minetest.register_node ( " itemframes: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. " ,
2015-06-29 20:55:56 +03:00
drawtype = " nodebox " ,
2017-01-04 23:36:51 +02:00
is_ground_content = false ,
2015-06-29 20:55:56 +03: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-02-08 02:20:14 +02:00
groups = { dig_immediate = 3 , deco_block = 1 } ,
2017-02-11 19:46:23 +02:00
sounds = mcl_sounds.node_sound_defaults ( ) ,
2015-06-29 20:55:56 +03:00
after_place_node = function ( pos , placer , itemstack )
2017-01-11 19:21:46 +02:00
local meta = minetest.get_meta ( pos )
2015-06-29 20:55:56 +03: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 19:21:46 +02:00
local meta = minetest.get_meta ( pos )
2015-06-29 20:55:56 +03:00
if clicker : get_player_name ( ) == meta : get_string ( " owner " ) then
drop_item ( pos , node )
2017-03-02 18:18:29 +02:00
local s = itemstack
if not minetest.setting_getbool ( " creative_mode " ) then
itemstack : take_item ( )
end
2015-06-29 20:55:56 +03:00
meta : set_string ( " item " , s : to_string ( ) )
update_item ( pos , node )
end
return itemstack
end ,
on_punch = function ( pos , node , puncher )
2017-01-11 19:21:46 +02:00
local meta = minetest.get_meta ( pos )
2015-06-29 20:55:56 +03:00
if puncher : get_player_name ( ) == meta : get_string ( " owner " ) then
drop_item ( pos , node )
end
end ,
can_dig = function ( pos , player )
2017-01-11 19:21:46 +02:00
local meta = minetest.get_meta ( pos )
2015-06-29 20:55:56 +03:00
return player : get_player_name ( ) == meta : get_string ( " owner " )
end ,
} )
2017-01-12 04:04:58 +02:00
minetest.register_craft ( {
output = ' itemframes:frame ' ,
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
}
} )