summaryrefslogtreecommitdiff
path: root/itemframes
diff options
context:
space:
mode:
authorVanessa Ezekowitz <vanessaezekowitz@gmail.com>2016-04-01 21:00:20 -0400
committerVanessa Ezekowitz <vanessaezekowitz@gmail.com>2016-04-01 21:10:04 -0400
commit888b0ebfec8c2eff9015163549a7e47443cb8665 (patch)
tree915080159bfaa6ba6e226087c7ce0e8d5464b518 /itemframes
parentda66780a569712c23ae4f2996cfb4608a9f9d69d (diff)
downloaddreambuilder_modpack-888b0ebfec8c2eff9015163549a7e47443cb8665.tar
dreambuilder_modpack-888b0ebfec8c2eff9015163549a7e47443cb8665.tar.gz
dreambuilder_modpack-888b0ebfec8c2eff9015163549a7e47443cb8665.tar.bz2
dreambuilder_modpack-888b0ebfec8c2eff9015163549a7e47443cb8665.tar.xz
dreambuilder_modpack-888b0ebfec8c2eff9015163549a7e47443cb8665.zip
"explode" all modpacks into their individual components
(you can't have a modpack buried inside a modpack)
Diffstat (limited to 'itemframes')
-rw-r--r--itemframes/depends.txt1
-rw-r--r--itemframes/init.lua243
-rw-r--r--itemframes/textures/itemframes_frame.pngbin0 -> 104 bytes
-rw-r--r--itemframes/textures/itemframes_pedestal.pngbin0 -> 286 bytes
4 files changed, 244 insertions, 0 deletions
diff --git a/itemframes/depends.txt b/itemframes/depends.txt
new file mode 100644
index 0000000..4ad96d5
--- /dev/null
+++ b/itemframes/depends.txt
@@ -0,0 +1 @@
+default
diff --git a/itemframes/init.lua b/itemframes/init.lua
new file mode 100644
index 0000000..000eab6
--- /dev/null
+++ b/itemframes/init.lua
@@ -0,0 +1,243 @@
+local tmp = {}
+screwdriver = screwdriver or {}
+
+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
+ 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}
+
+local remove_item = function(pos, node)
+ local objs = nil
+ if node.name == "itemframes:frame" then
+ objs = minetest.get_objects_inside_radius(pos, .5)
+ elseif node.name == "itemframes:pedestal" then
+ objs = minetest.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
+ obj:remove()
+ end
+ end
+ end
+end
+
+local update_item = function(pos, node)
+ remove_item(pos, node)
+ local meta = minetest.get_meta(pos)
+ if meta:get_string("item") ~= "" then
+ if node.name == "itemframes:frame" then
+ local posad = facedir[node.param2]
+ if not posad then return end
+ 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.add_entity(pos,"itemframes:item")
+ 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)
+ local meta = minetest.get_meta(pos)
+ if meta:get_string("item") ~= "" then
+ if node.name == "itemframes:frame" then
+ minetest.add_item(pos, meta:get_string("item"))
+ elseif node.name == "itemframes:pedestal" then
+ minetest.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, node)
+end
+
+minetest.register_node("itemframes:frame",{
+ description = "Item frame",
+ drawtype = "nodebox",
+ 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 = {"itemframes_frame.png"},
+ inventory_image = "itemframes_frame.png",
+ wield_image = "itemframes_frame.png",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ sunlight_propagates = true,
+ groups = { choppy=2,dig_immediate=2 },
+ legacy_wallmounted = true,
+ sounds = default.node_sound_defaults(),
+ on_rotate = screwdriver.disallow,
+ after_place_node = function(pos, placer, itemstack)
+ local meta = minetest.get_meta(pos)
+ 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
+ local meta = minetest.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.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.get_meta(pos)
+ return player:get_player_name() == meta:get_string("owner")
+ end,
+ on_destruct = function(pos)
+ local meta = minetest.get_meta(pos)
+ local node = minetest.get_node(pos)
+ if meta:get_string("item") ~= "" then
+ drop_item(pos, node)
+ end
+ end,
+})
+
+
+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(),
+ on_rotate = screwdriver.disallow,
+ after_place_node = function(pos, placer, itemstack)
+ local meta = minetest.get_meta(pos)
+ meta:set_string("owner",placer:get_player_name())
+ meta:set_string("infotext","Pedestal (owned by "..placer:get_player_name()..")")
+ end,
+ on_rightclick = function(pos, node, clicker, itemstack)
+ if not itemstack then return end
+ local meta = minetest.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.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.get_meta(pos)
+ return player:get_player_name() == meta:get_string("owner")
+ end,
+ on_destruct = function(pos)
+ local meta = minetest.get_meta(pos)
+ local node = minetest.get_node(pos)
+ if meta:get_string("item") ~= "" then
+ drop_item(pos, node)
+ end
+ end,
+})
+
+-- automatically restore entities lost from frames/pedestals
+-- due to /clearobjects or similar
+
+minetest.register_abm({
+ nodenames = { "itemframes:frame", "itemframes:pedestal" },
+ interval = 15,
+ chance = 1,
+ action = function(pos, node, active_object_count, active_object_count_wider)
+ local num
+
+ if node.name == "itemframes:frame" then
+ num = #minetest.get_objects_inside_radius(pos, 0.5)
+ elseif node.name == "itemframes:pedestal" then
+ pos.y = pos.y + 1
+ num = #minetest.get_objects_inside_radius(pos, 0.5)
+ pos.y = pos.y - 1
+ end
+
+ if num > 0 then return end
+ update_item(pos, node)
+ end
+})
+
+-- crafts
+
+minetest.register_craft({
+ output = 'itemframes:frame',
+ recipe = {
+ {'group:stick', 'group:stick', 'group:stick'},
+ {'group:stick', 'default:paper', 'default:stick'},
+ {'group:stick', 'group:stick', 'group:stick'},
+ }
+})
+minetest.register_craft({
+ output = 'itemframes:pedestal',
+ recipe = {
+ {'default:stone', 'default:stone', 'default:stone'},
+ {'', 'default:stone', ''},
+ {'default:stone', 'default:stone', 'default:stone'},
+ }
+})
diff --git a/itemframes/textures/itemframes_frame.png b/itemframes/textures/itemframes_frame.png
new file mode 100644
index 0000000..5373c45
--- /dev/null
+++ b/itemframes/textures/itemframes_frame.png
Binary files differ
diff --git a/itemframes/textures/itemframes_pedestal.png b/itemframes/textures/itemframes_pedestal.png
new file mode 100644
index 0000000..a269b0b
--- /dev/null
+++ b/itemframes/textures/itemframes_pedestal.png
Binary files differ