From 888b0ebfec8c2eff9015163549a7e47443cb8665 Mon Sep 17 00:00:00 2001 From: Vanessa Ezekowitz Date: Fri, 1 Apr 2016 21:00:20 -0400 Subject: "explode" all modpacks into their individual components (you can't have a modpack buried inside a modpack) --- itemframes/depends.txt | 1 + itemframes/init.lua | 243 ++++++++++++++++++++++++++++ itemframes/textures/itemframes_frame.png | Bin 0 -> 104 bytes itemframes/textures/itemframes_pedestal.png | Bin 0 -> 286 bytes 4 files changed, 244 insertions(+) create mode 100644 itemframes/depends.txt create mode 100644 itemframes/init.lua create mode 100644 itemframes/textures/itemframes_frame.png create mode 100644 itemframes/textures/itemframes_pedestal.png (limited to 'itemframes') 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 Binary files /dev/null and b/itemframes/textures/itemframes_frame.png differ diff --git a/itemframes/textures/itemframes_pedestal.png b/itemframes/textures/itemframes_pedestal.png new file mode 100644 index 0000000..a269b0b Binary files /dev/null and b/itemframes/textures/itemframes_pedestal.png differ -- cgit v1.2.3