summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZeg9 <dazeg9@gmail.com>2013-05-31 18:50:30 +0200
committerZeg9 <dazeg9@gmail.com>2013-05-31 18:50:30 +0200
commitc8a22dbface62a9d6d407afb641eb0029eb6eba4 (patch)
treeac26d90a98cd167819527636d73890d292cc681f
parent2a5e2eb3a23640c1fafa6733c86a1ce6b5e481fb (diff)
downloaditemframes-c8a22dbface62a9d6d407afb641eb0029eb6eba4.tar.gz
itemframes-c8a22dbface62a9d6d407afb641eb0029eb6eba4.tar.bz2
itemframes-c8a22dbface62a9d6d407afb641eb0029eb6eba4.zip
Add pedestals and use staticdata for entity
This breaks existing item frames, just take the item out and put it back Items are NOT lost, only the visual will show "unknown node" or similar
-rw-r--r--itemframes/init.lua139
-rw-r--r--itemframes/textures/itemframes_pedestal.pngbin0 -> 519 bytes
2 files changed, 111 insertions, 28 deletions
diff --git a/itemframes/init.lua b/itemframes/init.lua
index 8d62bc3..41a9e27 100644
--- a/itemframes/init.lua
+++ b/itemframes/init.lua
@@ -1,20 +1,60 @@
+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"}
+ 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
+ print("warnninining")
+ print (dump(staticdata))
+ if staticdata ~= nil and staticdata ~= "" then
+ local data = staticdata:split(';')
+ print("deeebuguugug")
+ print(dump(data))
+ 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
+ if self.nodename == "itemframes:pedestal" then
+ self.object:set_properties({automatic_rotate=1})
+ 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} --
+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)
- objs = minetest.env:get_objects_inside_radius(pos, .5)
+local remove_item = function(pos, node)
+ local objs = nil
+ if node.name == "itemframes:frame" then
+ objs = minetest.env:get_objects_inside_radius(pos, .5)
+ elseif node.name == "itemframes:pedestal" then
+ objs = minetest.env:get_objects_inside_radius({x=pos.x,y=pos.y+1,z=pos.z}, .5)
+ end
if objs then
for _, obj in ipairs(objs) do
if obj and obj:get_luaentity() and obj:get_luaentity().name == "itemframes:item" then
@@ -25,28 +65,38 @@ local remove_item = function(pos)
end
local update_item = function(pos, node)
- remove_item(pos)
+ remove_item(pos, node)
local meta = minetest.env:get_meta(pos)
if meta:get_string("item") ~= "" then
- 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
+ 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
+ elseif node.name == "itemframes:pedestal" then
+ pos.y = pos.y + 12/16+.33
+ end
+ tmp.nodename = node.name
+ tmp.texture = ItemStack(meta:get_string("item")):get_name()
local e = minetest.env:add_entity(pos,"itemframes:item")
- local name = ItemStack(meta:get_string("item")):get_name()
- e:set_properties({textures={name}})
- local yaw = math.pi*2 - node.param2 * math.pi/2
- e:setyaw(yaw)
+ 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)
+local drop_item = function(pos, node)
local meta = minetest.env:get_meta(pos)
if meta:get_string("item") ~= "" then
- minetest.env:add_item(pos, meta:get_string("item"))
+ if node.name == "itemframes:frame" then
+ minetest.env:add_item(pos, meta:get_string("item"))
+ elseif node.name == "itemframes:pedestal" then
+ minetest.env:add_item({x=pos.x,y=pos.y+1,z=pos.z}, meta:get_string("item"))
+ end
meta:set_string("item","")
end
- remove_item(pos)
+ remove_item(pos, node)
end
minetest.register_node("itemframes:frame",{
@@ -71,7 +121,7 @@ minetest.register_node("itemframes:frame",{
on_rightclick = function(pos, node, clicker, itemstack)
local meta = minetest.env:get_meta(pos)
if clicker:get_player_name() == meta:get_string("owner") then
- drop_item(pos,clicker)
+ drop_item(pos,node)
local s = itemstack:take_item()
meta:set_string("item",s:to_string())
update_item(pos,node)
@@ -81,7 +131,7 @@ minetest.register_node("itemframes:frame",{
on_punch = function(pos,node,puncher)
local meta = minetest.env:get_meta(pos)
if puncher:get_player_name() == meta:get_string("owner") then
- drop_item(pos)
+ drop_item(pos, node)
end
end,
can_dig = function(pos,player)
@@ -92,14 +142,47 @@ minetest.register_node("itemframes:frame",{
})
-minetest.register_abm({
- nodenames = {"itemframes:frame"},
- interval = 2.0,
- chance = 1,
- action = function(pos, node, active_object_count, active_object_count_wider)
- update_item(pos,node)
+minetest.register_node("itemframes:pedestal",{
+ description = "Pedestal",
+ drawtype = "nodebox",
+ node_box = { type = "fixed", fixed = {
+ {-7/16, -8/16, -7/16, 7/16, -7/16, 7/16}, -- bottom plate
+ {-6/16, -7/16, -6/16, 6/16, -6/16, 6/16}, -- bottom plate (upper)
+ {-0.25, -6/16, -0.25, 0.25, 11/16, 0.25}, -- pillar
+ {-7/16, 11/16, -7/16, 7/16, 12/16, 7/16}, -- top plate
+ } },
+ --selection_box = { type = "fixed", fixed = {-7/16, -0.5, -7/16, 7/16, 12/16, 7/16} },
+ tiles = {"itemframes_pedestal.png"},
+ paramtype = "light",
+ groups = { cracky=3 },
+ sounds = default.node_sound_defaults(),
+ after_place_node = function(pos, placer, itemstack)
+ local meta = minetest.env:get_meta(pos)
+ meta:set_string("owner",placer:get_player_name())
+ meta:set_string("infotext","Pedestal (owned by "..placer:get_player_name()..")")
end,
-}) -- This allows items to reappear in frames when chunks are unloaded
+ on_rightclick = function(pos, node, clicker, itemstack)
+ local meta = minetest.env:get_meta(pos)
+ if clicker:get_player_name() == meta:get_string("owner") then
+ drop_item(pos,node)
+ local s = itemstack:take_item()
+ meta:set_string("item",s:to_string())
+ update_item(pos,node)
+ end
+ return itemstack
+ end,
+ on_punch = function(pos,node,puncher)
+ local meta = minetest.env:get_meta(pos)
+ if puncher:get_player_name() == meta:get_string("owner") then
+ drop_item(pos,node)
+ end
+ end,
+ can_dig = function(pos,player)
+
+ local meta = minetest.env:get_meta(pos)
+ return player:get_player_name() == meta:get_string("owner")
+ end,
+})
minetest.register_craft({
output = 'itemframes:frame',
diff --git a/itemframes/textures/itemframes_pedestal.png b/itemframes/textures/itemframes_pedestal.png
new file mode 100644
index 0000000..e39abd3
--- /dev/null
+++ b/itemframes/textures/itemframes_pedestal.png
Binary files differ