diff --git a/mods/ITEMS/mcl_chests/init.lua b/mods/ITEMS/mcl_chests/init.lua index 6c37cff35..0f1e44c10 100644 --- a/mods/ITEMS/mcl_chests/init.lua +++ b/mods/ITEMS/mcl_chests/init.lua @@ -3,12 +3,19 @@ local mod_doc = minetest.get_modpath("doc") -- Chest Entity local animate_chests = (minetest.settings:get_bool("animated_chests") ~= false) -local entity_animation_speed = 25 local entity_animations = { - ["open"] = {x = 0, y = 10}, - ["open_partly"] = {x = 0, y = 7}, - ["close"] = {x = 10, y = 20}, - ["close_partly"] = {x = 13, y = 20}, + shulker = { + speed = 50, + open = {x = 45, y = 95}, + close = {x = 95, y = 145}, + }, + chest = { + speed = 25, + open = {x = 0, y = 10}, + open_partly = {x = 0, y = 7}, + close = {x = 10, y = 20}, + close_partly = {x = 13, y = 20}, + } } minetest.register_entity("mcl_chests:chest", { @@ -21,9 +28,10 @@ minetest.register_entity("mcl_chests:chest", { }, set_animation = function(self, animname) - local anim = entity_animations[animname] + local anim_table = entity_animations[self.animation_type] + local anim = anim_table[animname] if not anim then return end - self.object:set_animation(anim, entity_animation_speed, 0, false) + self.object:set_animation(anim, anim_table.speed, 0, false) end, open = function(self, playername, partly) @@ -54,10 +62,11 @@ minetest.register_entity("mcl_chests:chest", { end end, - initialize = function(self, node_pos, node_name, textures, dir, double, sound_prefix, mesh_prefix) + initialize = function(self, node_pos, node_name, textures, dir, double, sound_prefix, mesh_prefix, animation_type) self.node_pos = node_pos self.node_name = node_name self.sound_prefix = sound_prefix + self.animation_type = animation_type local obj = self.object obj:set_properties({ textures = textures, @@ -117,19 +126,22 @@ local function find_entity(pos) end end -local function create_entity(pos, node_name, textures, param2, double, sound_prefix, mesh_prefix, dir, entity_pos) +local function get_entity_info(pos, param2, double, dir, entity_pos) dir = dir or minetest.facedir_to_dir(param2) - entity_pos = entity_pos or get_entity_pos(pos, dir, double) + return dir, get_entity_pos(pos, dir, double) +end + +local function create_entity(pos, node_name, textures, param2, double, sound_prefix, mesh_prefix, animation_type, dir, entity_pos) + dir, entity_pos = get_entity_info(pos, param2, double, dir, entity_pos) local obj = minetest.add_entity(entity_pos, "mcl_chests:chest") local luaentity = obj:get_luaentity() - luaentity:initialize(pos, node_name, textures, dir, double, sound_prefix, mesh_prefix) + luaentity:initialize(pos, node_name, textures, dir, double, sound_prefix, mesh_prefix, animation_type) return luaentity end -local function find_or_create_entity(pos, node_name, textures, param2, double, sound_prefix, mesh_prefix, dir) - local dir = dir or minetest.facedir_to_dir(param2) - local entity_pos = get_entity_pos(pos, dir, double) - return find_entity(entity_pos) or create_entity(pos, node_name, textures, param2, double, sound_prefix, mesh_prefix, dir, entity_pos) +local function find_or_create_entity(pos, node_name, textures, param2, double, sound_prefix, mesh_prefix, animation_type, dir, entity_pos) + dir, entity_pos = get_entity_info(pos, param2, double, dir, entity_pos) + return find_entity(entity_pos) or create_entity(pos, node_name, textures, param2, double, sound_prefix, mesh_prefix, animation_type, dir, entity_pos) end local no_rotate, simple_rotate @@ -139,7 +151,8 @@ if minetest.get_modpath("screwdriver") then if screwdriver.rotate_simple(pos, node, user, mode, new_param2) ~= false then local nodename = node.name local nodedef = minetest.registered_nodes[nodename] - find_or_create_entity(pos, nodename, nodedef._chest_entity_textures, new_param2, false, nodedef._chest_entity_sound, nodedef._chest_entity_mesh):set_yaw(minetest.facedir_to_dir(new_param2)) + local dir = minetest.facedir_to_dir(new_param2) + find_or_create_entity(pos, nodename, nodedef._chest_entity_textures, new_param2, false, nodedef._chest_entity_sound, nodedef._chest_entity_mesh, nodedef._chest_entity_animation_type, dir):set_yaw(dir) else return false end @@ -161,12 +174,13 @@ local function back_is_blocked(pos, dir) return not def or def.groups.opaque == 1 or not def2 or def2.groups.opaque == 1 end -- To be called if a player opened a chest -local player_chest_open = function(player, pos, node_name, textures, param2, double, sound, mesh) +local player_chest_open = function(player, pos, node_name, textures, param2, double, sound, mesh, shulker) local name = player:get_player_name() - open_chests[name] = {pos = pos, node_name = node_name, textures = textures, param2 = param2, double = double, sound = sound, mesh = mesh} + open_chests[name] = {pos = pos, node_name = node_name, textures = textures, param2 = param2, double = double, sound = sound, mesh = mesh, shulker = shulker} if animate_chests then local dir = minetest.facedir_to_dir(param2) - find_or_create_entity(pos, node_name, textures, param2, double, sound, mesh, dir):open(name, back_is_blocked(pos, dir) or double and back_is_blocked(mcl_util.get_double_container_neighbor_pos(pos, param2, node_name:sub(-4)), dir)) + local blocked = not shulker and (back_is_blocked(pos, dir) or double and back_is_blocked(mcl_util.get_double_container_neighbor_pos(pos, param2, node_name:sub(-4)), dir)) + find_or_create_entity(pos, node_name, textures, param2, double, sound, mesh, shulker and "shulker" or "chest", dir):open(name, blocked) end end @@ -198,11 +212,11 @@ local chest_update_after_close = function(pos) if node.name == "mcl_chests:trapped_chest_on_small" then minetest.swap_node(pos, {name="mcl_chests:trapped_chest_small", param2 = node.param2}) - find_or_create_entity(pos, "mcl_chests:trapped_chest_small", {"mcl_chests_trapped.png"}, node.param2, false, "default_chest", "mcl_chests_chest"):reinitialize("mcl_chests:trapped_chest_small") + find_or_create_entity(pos, "mcl_chests:trapped_chest_small", {"mcl_chests_trapped.png"}, node.param2, false, "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_small") mesecon.receptor_off(pos, trapped_chest_mesecons_rules) elseif node.name == "mcl_chests:trapped_chest_on_left" then minetest.swap_node(pos, {name="mcl_chests:trapped_chest_left", param2 = node.param2}) - find_or_create_entity(pos, "mcl_chests:trapped_chest_left", {"mcl_chests_trapped_double.png"}, node.param2, true, "default_chest", "mcl_chests_chest"):reinitialize("mcl_chests:trapped_chest_left") + find_or_create_entity(pos, "mcl_chests:trapped_chest_left", {"mcl_chests_trapped_double.png"}, node.param2, true, "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_left") mesecon.receptor_off(pos, trapped_chest_mesecons_rules) local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "left") @@ -214,7 +228,7 @@ local chest_update_after_close = function(pos) local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "right") minetest.swap_node(pos_other, {name="mcl_chests:trapped_chest_left", param2 = node.param2}) - find_or_create_entity(pos_other, "mcl_chests:trapped_chest_left", {"mcl_chests_trapped_double.png"}, node.param2, true, "default_chest", "mcl_chests_chest"):reinitialize("mcl_chests:trapped_chest_left") + find_or_create_entity(pos_other, "mcl_chests:trapped_chest_left", {"mcl_chests_trapped_double.png"}, node.param2, true, "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_left") mesecon.receptor_off(pos_other, trapped_chest_mesecons_rules) end end @@ -227,7 +241,7 @@ local player_chest_close = function(player) return end if animate_chests then - find_or_create_entity(open_chest.pos, open_chest.node_name, open_chest.textures, open_chest.param2, open_chest.double, open_chest.sound, open_chest.mesh):close(name) + find_or_create_entity(open_chest.pos, open_chest.node_name, open_chest.textures, open_chest.param2, open_chest.double, open_chest.sound, open_chest.mesh, open_chest.shulker and "shulker" or "chest"):close(name) end chest_update_after_close(open_chest.pos) @@ -374,6 +388,7 @@ minetest.register_node(small_name, { _chest_entity_textures = small_textures, _chest_entity_sound = "default_chest", _chest_entity_mesh = "mcl_chests_chest", + _chest_entity_animation_type = "chest", paramtype = "light", paramtype2 = "facedir", stack_max = 64, @@ -410,15 +425,15 @@ minetest.register_node(small_name, { minetest.swap_node(pos, {name="mcl_chests:"..canonical_basename.."_right",param2=param2}) local p = mcl_util.get_double_container_neighbor_pos(pos, param2, "right") minetest.swap_node(p, { name = "mcl_chests:"..canonical_basename.."_left", param2 = param2 }) - create_entity(p, "mcl_chests:"..canonical_basename.."_left", left_textures, param2, true, "default_chest", "mcl_chests_chest") + create_entity(p, "mcl_chests:"..canonical_basename.."_left", left_textures, param2, true, "default_chest", "mcl_chests_chest", "chest") elseif minetest.get_node(mcl_util.get_double_container_neighbor_pos(pos, param2, "left")).name == "mcl_chests:"..canonical_basename.."_small" then minetest.swap_node(pos, {name="mcl_chests:"..canonical_basename.."_left",param2=param2}) - create_entity(pos, "mcl_chests:"..canonical_basename.."_left", left_textures, param2, true, "default_chest", "mcl_chests_chest") + create_entity(pos, "mcl_chests:"..canonical_basename.."_left", left_textures, param2, true, "default_chest", "mcl_chests_chest", "chest") local p = mcl_util.get_double_container_neighbor_pos(pos, param2, "left") minetest.swap_node(p, { name = "mcl_chests:"..canonical_basename.."_right", param2 = param2 }) else minetest.swap_node(pos, { name = "mcl_chests:"..canonical_basename.."_small", param2 = param2 }) - create_entity(pos, small_name, small_textures, param2, false, "default_chest", "mcl_chests_chest") + create_entity(pos, small_name, small_textures, param2, false, "default_chest", "mcl_chests_chest", "chest") end end, after_place_node = function(pos, placer, itemstack, pointed_thing) @@ -498,6 +513,7 @@ minetest.register_node(left_name, { _chest_entity_textures = left_textures, _chest_entity_sound = "default_chest", _chest_entity_mesh = "mcl_chests_chest", + _chest_entity_animation_type = "chest", paramtype = "light", paramtype2 = "facedir", groups = {handy=1,axey=1, container=5,not_in_creative_inventory=1, material_wood=1,flammable=-1,chest_entity=1,double_chest=1}, @@ -512,7 +528,7 @@ minetest.register_node(left_name, { n.name = "mcl_chests:"..canonical_basename.."_small" minetest.swap_node(pos, n) end - create_entity(pos, left_name, left_textures, param2, true, "default_chest", "mcl_chests_chest") + create_entity(pos, left_name, left_textures, param2, true, "default_chest", "mcl_chests_chest", "chest") end, after_place_node = function(pos, placer, itemstack, pointed_thing) minetest.get_meta(pos):set_string("name", itemstack:get_meta():get_string("name")) @@ -533,7 +549,7 @@ minetest.register_node(left_name, { close_forms(canonical_basename, p) minetest.swap_node(p, { name = small_name, param2 = param2 }) - create_entity(p, small_name, small_textures, param2, false, "default_chest", "mcl_chests_chest") + create_entity(p, small_name, small_textures, param2, false, "default_chest", "mcl_chests_chest", "chest") end, after_dig_node = drop_items_chest, on_blast = on_chest_blast, @@ -680,7 +696,7 @@ minetest.register_node("mcl_chests:"..basename.."_right", { close_forms(canonical_basename, p) minetest.swap_node(p, { name = small_name, param2 = param2 }) - create_entity(p, small_name, small_textures, param2, false, "default_chest", "mcl_chests_chest") + create_entity(p, small_name, small_textures, param2, false, "default_chest", "mcl_chests_chest", "chest") local meta = minetest.get_meta(pos) end, after_dig_node = drop_items_chest, @@ -845,7 +861,7 @@ register_chest("trapped_chest", }}, function(pos, node, clicker) minetest.swap_node(pos, {name="mcl_chests:trapped_chest_on_small", param2 = node.param2}) - find_or_create_entity(pos, "mcl_chests:trapped_chest_on_small", {"mcl_chests_trapped.png"}, node.param2, false, "default_chest", "mcl_chests_chest"):reinitialize("mcl_chests:trapped_chest_on_small") + find_or_create_entity(pos, "mcl_chests:trapped_chest_on_small", {"mcl_chests_trapped.png"}, node.param2, false, "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_on_small") mesecon.receptor_on(pos, trapped_chest_mesecons_rules) end, function(pos, node, clicker) @@ -853,7 +869,7 @@ register_chest("trapped_chest", meta:set_int("players", 1) minetest.swap_node(pos, {name="mcl_chests:trapped_chest_on_left", param2 = node.param2}) - find_or_create_entity(pos, "mcl_chests:trapped_chest_on_left", {"mcl_chests_trapped_double.png"}, node.param2, true, "default_chest", "mcl_chests_chest"):reinitialize("mcl_chests:trapped_chest_on_left") + find_or_create_entity(pos, "mcl_chests:trapped_chest_on_left", {"mcl_chests_trapped_double.png"}, node.param2, true, "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_on_left") mesecon.receptor_on(pos, trapped_chest_mesecons_rules) local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "left") @@ -867,7 +883,7 @@ register_chest("trapped_chest", mesecon.receptor_on(pos, trapped_chest_mesecons_rules) minetest.swap_node(pos_other, {name="mcl_chests:trapped_chest_on_left", param2 = node.param2}) - find_or_create_entity(pos_other, "mcl_chests:trapped_chest_on_left", {"mcl_chests_trapped_double.png"}, node.param2, true, "default_chest", "mcl_chests_chest"):reinitialize("mcl_chests:trapped_chest_on_left") + find_or_create_entity(pos_other, "mcl_chests:trapped_chest_on_left", {"mcl_chests_trapped_double.png"}, node.param2, true, "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_on_left") mesecon.receptor_on(pos_other, trapped_chest_mesecons_rules) end ) @@ -888,13 +904,13 @@ local function close_if_trapped_chest(pos, player) if node.name == "mcl_chests:trapped_chest_on_small" then minetest.swap_node(pos, {name="mcl_chests:trapped_chest_small", param2 = node.param2}) - find_or_create_entity(pos, "mcl_chests:trapped_chest_small", {"mcl_chests_trapped.png"}, node.param2, false, "default_chest", "mcl_chests_chest"):reinitialize("mcl_chests:trapped_chest_small") + find_or_create_entity(pos, "mcl_chests:trapped_chest_small", {"mcl_chests_trapped.png"}, node.param2, false, "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_small") mesecon.receptor_off(pos, trapped_chest_mesecons_rules) player_chest_close(player) elseif node.name == "mcl_chests:trapped_chest_on_left" then minetest.swap_node(pos, {name="mcl_chests:trapped_chest_left", param2 = node.param2}) - find_or_create_entity(pos, "mcl_chests:trapped_chest_left", {"mcl_chests_trapped_double.png"}, node.param2, true, "default_chest", "mcl_chests_chest"):reinitialize("mcl_chests:trapped_chest_left") + find_or_create_entity(pos, "mcl_chests:trapped_chest_left", {"mcl_chests_trapped_double.png"}, node.param2, true, "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_left") mesecon.receptor_off(pos, trapped_chest_mesecons_rules) local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "left") @@ -908,7 +924,7 @@ local function close_if_trapped_chest(pos, player) local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "right") minetest.swap_node(pos_other, {name="mcl_chests:trapped_chest_left", param2 = node.param2}) - find_or_create_entity(pos_other, "mcl_chests:trapped_chest_left", {"mcl_chests_trapped_double.png"}, node.param2, true, "default_chest", "mcl_chests_chest"):reinitialize("mcl_chests:trapped_chest_left") + find_or_create_entity(pos_other, "mcl_chests:trapped_chest_left", {"mcl_chests_trapped_double.png"}, node.param2, true, "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_left") mesecon.receptor_off(pos_other, trapped_chest_mesecons_rules) player_chest_close(player) @@ -995,6 +1011,7 @@ minetest.register_node("mcl_chests:ender_chest_small", { _chest_entity_textures = {"mcl_chests_ender.png"}, _chest_entity_sound = "mcl_chests_enderchest", _chest_entity_mesh = "mcl_chests_chest", + _chest_entity_animation_type = "chest", tiles = {"mcl_chests_blank.png"}, --[[{"mcl_chests_ender_chest_top.png", "mcl_chests_ender_chest_bottom.png", "mcl_chests_ender_chest_right.png", "mcl_chests_ender_chest_left.png", @@ -1011,10 +1028,10 @@ minetest.register_node("mcl_chests:ender_chest_small", { on_construct = function(pos) local meta = minetest.get_meta(pos) meta:set_string("formspec", formspec_ender_chest) - create_entity(pos, "mcl_chests:ender_chest_small", {"mcl_chests_ender.png"}, minetest.get_node(pos).param2, false, "mcl_chests_enderchest", "mcl_chests_chest") + create_entity(pos, "mcl_chests:ender_chest_small", {"mcl_chests_ender.png"}, minetest.get_node(pos).param2, false, "mcl_chests_enderchest", "mcl_chests_chest", "chest") end, on_rightclick = function(pos, node, clicker) - player_chest_open(clicker, pos, "mcl_chests:ender_chest_small", {"mcl_chests_ender.png"}, minetest.get_node(pos).param2, false, "mcl_chests_enderchest", "mcl_chests_chest") + player_chest_open(clicker, pos, "mcl_chests:ender_chest_small", {"mcl_chests_ender.png"}, node.param2, false, "mcl_chests_enderchest", "mcl_chests_chest") end, on_receive_fields = function(pos, formname, fields, sender) if fields.quit then @@ -1027,16 +1044,6 @@ minetest.register_node("mcl_chests:ender_chest_small", { on_rotate = simple_rotate, }) -minetest.register_lbm({ - label = "Update shulker box formspecs (0.51.0)", - name = "mcl_chests:update_formspecs_0_51_0", - nodenames = { "group:shulker_box" }, - action = function(pos, node) - minetest.registered_nodes[node.name].on_construct(pos) - minetest.log("action", "[mcl_chests] Node formspec updated at "..minetest.pos_to_string(pos)) - end, -}) - minetest.register_on_joinplayer(function(player) local inv = player:get_inventory() inv:set_size("enderchest", 9*3) @@ -1129,6 +1136,8 @@ for color, desc in pairs(boxtypes) do end end + local small_name = "mcl_chests:"..color.."_shulker_box_small" + minetest.register_node("mcl_chests:"..color.."_shulker_box", { description = desc, _tt_help = S("27 inventory slots") .. "\n" .. S("Can be carried around with its contents"), @@ -1136,43 +1145,26 @@ for color, desc in pairs(boxtypes) do _doc_items_entry_name = entry_name, _doc_items_longdesc = longdesc, _doc_items_usagehelp = usagehelp, - tiles = { - "mcl_chests_"..color.."_shulker_box_top.png", -- top + tiles = {mob_texture}, + drawtype = "mesh", + mesh = "mcl_chests_shulker.obj", + --[["mcl_chests_"..color.."_shulker_box_top.png", -- top "[combine:16x16:-32,-28="..mob_texture, -- bottom "[combine:16x16:0,-36="..mob_texture..":0,-16="..mob_texture, -- side "[combine:16x16:-32,-36="..mob_texture..":-32,-16="..mob_texture, -- side "[combine:16x16:-16,-36="..mob_texture..":-16,-16="..mob_texture, -- side - "[combine:16x16:-48,-36="..mob_texture..":-48,-16="..mob_texture, -- side - }, - groups = {handy=1,pickaxey=1, container=3, deco_block=1, dig_by_piston=1, shulker_box=1}, + "[combine:16x16:-48,-36="..mob_texture..":-48,-16="..mob_texture, -- side]]-- + groups = {handy=1,pickaxey=1, container=3, deco_block=1, dig_by_piston=1, shulker_box=1, old_shulker_box_node=1}, is_ground_content = false, sounds = mcl_sounds.node_sound_stone_defaults(), stack_max = 1, drop = "", paramtype = "light", paramtype2 = "facedir", --- TODO: Make shulker boxes rotatable --- This doesn't work, it just destroys the inventory: --- on_place = minetest.rotate_node, on_construct = function(pos) - local meta = minetest.get_meta(pos) - meta:set_string("formspec", formspec_shulker_box(nil)) - local inv = meta:get_inventory() - inv:set_size("main", 9*3) - end, - _on_dispense = function(stack, pos, droppos, dropnode, dropdir) - -- Place shulker box as node - if minetest.registered_nodes[dropnode.name].buildable_to then - minetest.set_node(droppos, {name = stack:get_name(), param2 = minetest.dir_to_facedir(dropdir)}) - local ninv = minetest.get_inventory({type="node", pos=droppos}) - local imetadata = stack:get_metadata() - local iinv_main = minetest.deserialize(imetadata) - ninv:set_list("main", iinv_main) - ninv:set_size("main", 9*3) - set_shulkerbox_meta(minetest.get_meta(droppos), stack:get_meta()) - stack:take_item() - end - return stack + local node = minetest.get_node(pos) + node.name = small_name + minetest.set_node(pos, node) end, after_place_node = function(pos, placer, itemstack, pointed_thing) local nmeta = minetest.get_meta(pos) @@ -1193,6 +1185,79 @@ for color, desc in pairs(boxtypes) do return nil end end, + _on_dispense = function(stack, pos, droppos, dropnode, dropdir) + -- Place shulker box as node + if minetest.registered_nodes[dropnode.name].buildable_to then + minetest.set_node(droppos, {name = small_name, param2 = minetest.dir_to_facedir(dropdir)}) + local ninv = minetest.get_inventory({type="node", pos=droppos}) + local imetadata = stack:get_metadata() + local iinv_main = minetest.deserialize(imetadata) + ninv:set_list("main", iinv_main) + ninv:set_size("main", 9*3) + set_shulkerbox_meta(minetest.get_meta(droppos), stack:get_meta()) + stack:take_item() + end + return stack + end, + }) + + minetest.register_node(small_name, { + description = desc, + _tt_help = S("27 inventory slots") .. "\n" .. S("Can be carried around with its contents"), + _doc_items_create_entry = create_entry, + _doc_items_entry_name = entry_name, + _doc_items_longdesc = longdesc, + _doc_items_usagehelp = usagehelp, + drawtype = "nodebox", + tiles = {"mcl_chests_blank.png"}, + _chest_entity_textures = {mob_texture}, + _chest_entity_sound = "mcl_chests_shulker", + _chest_entity_mesh = "mcl_chests_shulker", + _chest_entity_animation_type = "shulker", + groups = {handy=1,pickaxey=1, container=3, deco_block=1, dig_by_piston=1, shulker_box=1, chest_entity=1, not_in_creative_inventory=1}, + is_ground_content = false, + sounds = mcl_sounds.node_sound_stone_defaults(), + stack_max = 1, + drop = "", + paramtype = "light", + paramtype2 = "facedir", +-- TODO: Make shulker boxes rotatable +-- This doesn't work, it just destroys the inventory: +-- on_place = minetest.rotate_node, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", formspec_shulker_box(nil)) + local inv = meta:get_inventory() + inv:set_size("main", 9*3) + create_entity(pos, small_name, {mob_texture}, minetest.get_node(pos).param2, false, "mcl_chests_shulker", "mcl_chests_shulker", "shulker") + end, + after_place_node = function(pos, placer, itemstack, pointed_thing) + local nmeta = minetest.get_meta(pos) + local imetadata = itemstack:get_metadata() + local iinv_main = minetest.deserialize(imetadata) + local ninv = nmeta:get_inventory() + ninv:set_list("main", iinv_main) + ninv:set_size("main", 9*3) + set_shulkerbox_meta(nmeta, itemstack:get_meta()) + + if minetest.is_creative_enabled(placer:get_player_name()) then + if not ninv:is_empty("main") then + return nil + else + return itemstack + end + else + return nil + end + end, + on_rightclick = function(pos, node, clicker) + player_chest_open(clicker, pos, small_name, {mob_texture}, node.param2, false, "mcl_chests_shulker", "mcl_chests_shulker", true) + end, + on_receive_fields = function(pos, formname, fields, sender) + if fields.quit then + player_chest_close(sender) + end + end, on_destruct = function(pos) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() @@ -1238,6 +1303,7 @@ for color, desc in pairs(boxtypes) do if mod_doc and not is_canonical then doc.add_entry_alias("nodes", "mcl_chests:"..canonical_shulker_color.."_shulker_box", "nodes", "mcl_chests:"..color.."_shulker_box") + doc.add_entry_alias("nodes", "mcl_chests:"..canonical_shulker_color.."_shulker_box_small", "nodes", "mcl_chests:"..color.."_shulker_box_small") end minetest.register_craft({ @@ -1282,7 +1348,7 @@ local function select_and_spawn_entity(pos, node) local node_name = node.name local node_def = minetest.registered_nodes[node_name] local double_chest = minetest.get_item_group(node_name, "double_chest") > 0 - create_entity(pos, node_name, node_def._chest_entity_textures, node.param2, double_chest, node_def._chest_entity_sound, node_def._chest_entity_mesh) + create_entity(pos, node_name, node_def._chest_entity_textures, node.param2, double_chest, node_def._chest_entity_sound, node_def._chest_entity_mesh, node_def._chest_entity_animation_type) end minetest.register_lbm({ @@ -1296,7 +1362,7 @@ minetest.register_lbm({ minetest.register_lbm({ label = "Replace old chest nodes", name = "mcl_chests:replace_old", - nodenames = {"mcl_chests:chest", "mcl_chests:trapped_chest", "mcl_chests:trapped_chest_on", "mcl_chests:ender_chest"}, + nodenames = {"mcl_chests:chest", "mcl_chests:trapped_chest", "mcl_chests:trapped_chest_on", "mcl_chests:ender_chest", "group:old_shulker_box_node"}, run_at_every_load = true, action = function(pos, node) local node_name = node.name diff --git a/mods/ITEMS/mcl_chests/models/mcl_chests_shulker.b3d b/mods/ITEMS/mcl_chests/models/mcl_chests_shulker.b3d new file mode 100644 index 000000000..86dde145b Binary files /dev/null and b/mods/ITEMS/mcl_chests/models/mcl_chests_shulker.b3d differ diff --git a/mods/ITEMS/mcl_chests/models/mcl_chests_shulker.obj b/mods/ITEMS/mcl_chests/models/mcl_chests_shulker.obj new file mode 100644 index 000000000..ca12b682e --- /dev/null +++ b/mods/ITEMS/mcl_chests/models/mcl_chests_shulker.obj @@ -0,0 +1,159 @@ +# Blender v2.79 (sub 0) OBJ File: 'shulkerbox2.blend' +# www.blender.org +mtllib shulkerbox2.mtl +o low1_Cube.006 +v -0.500000 -0.500001 0.500000 +v -0.500000 0.062499 0.500000 +v -0.500000 -0.500001 -0.500000 +v -0.500000 0.062499 -0.500000 +v 0.500000 -0.500001 0.500000 +v 0.500000 0.062499 0.500000 +v 0.500000 -0.500001 -0.500000 +v 0.500000 0.062499 -0.500000 +vt 0.250000 0.187500 +vt -0.000000 0.187500 +vt -0.000000 0.312500 +vt 0.250000 0.312500 +vt 1.000000 0.187500 +vt 0.750000 0.187500 +vt 0.750000 0.312500 +vt 1.000000 0.312500 +vt 0.500000 0.187500 +vt 0.500000 0.312500 +vt 0.750000 0.562500 +vt 0.750000 0.312500 +vt 0.500000 0.312500 +vt 0.500000 0.562500 +vt 0.500000 0.562500 +vt 0.250000 0.562500 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +usemtl None +s off +f 1/1/1 3/2/1 4/3/1 2/4/1 +f 3/5/2 7/6/2 8/7/2 4/8/2 +f 7/6/3 5/9/3 6/10/3 8/7/3 +f 5/9/4 1/1/4 2/4/4 6/10/4 +f 3/11/5 1/12/5 5/13/5 7/14/5 +f 8/15/6 6/10/6 2/4/6 4/16/6 +o top1_Cube.005 +v -0.500313 -0.220552 0.500313 +v -0.500313 0.530073 0.500313 +v -0.500313 -0.220552 -0.500313 +v -0.500313 0.530073 -0.500313 +v 0.500313 -0.220552 0.500313 +v 0.500313 0.530073 0.500313 +v 0.500313 -0.220552 -0.500313 +v 0.500313 0.530073 -0.500313 +vt 0.250000 0.562500 +vt -0.000000 0.562500 +vt -0.000000 0.750000 +vt 0.250000 0.750000 +vt 1.000000 0.562500 +vt 0.750000 0.562500 +vt 0.750000 0.750000 +vt 1.000000 0.750000 +vt 0.500000 0.562500 +vt 0.500000 0.750000 +vt 0.750000 1.000000 +vt 0.750000 0.750000 +vt 0.500000 0.750000 +vt 0.500000 1.000000 +vt 0.500000 1.000000 +vt 0.250000 1.000000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +usemtl None +s off +f 9/17/7 11/18/7 12/19/7 10/20/7 +f 11/21/8 15/22/8 16/23/8 12/24/8 +f 15/22/9 13/25/9 14/26/9 16/23/9 +f 13/25/10 9/17/10 10/20/10 14/26/10 +f 11/27/11 9/28/11 13/29/11 15/30/11 +f 16/31/12 14/26/12 10/20/12 12/32/12 +o top2_Cube.002 +v -0.500247 -0.220392 0.500247 +v -0.500247 0.530234 0.500247 +v -0.500247 -0.220392 -0.500378 +v -0.500247 0.530234 -0.500378 +v 0.500378 -0.220392 0.500247 +v 0.500378 0.530234 0.500247 +v 0.500378 -0.220392 -0.500378 +v 0.500378 0.530234 -0.500378 +vt 0.250000 0.562500 +vt 0.250000 0.750000 +vt -0.000000 0.750000 +vt -0.000000 0.562500 +vt 1.000000 0.562500 +vt 1.000000 0.750000 +vt 0.750000 0.750000 +vt 0.750000 0.562500 +vt 0.500000 0.750000 +vt 0.500000 0.562500 +vt 0.750000 1.000000 +vt 0.500000 1.000000 +vt 0.500000 0.750000 +vt 0.750000 0.750000 +vt 0.500000 1.000000 +vt 0.250000 1.000000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +usemtl None +s off +f 17/33/13 18/34/13 20/35/13 19/36/13 +f 19/37/14 20/38/14 24/39/14 23/40/14 +f 23/40/15 24/39/15 22/41/15 21/42/15 +f 21/42/16 22/41/16 18/34/16 17/33/16 +f 19/43/17 23/44/17 21/45/17 17/46/17 +f 24/47/18 20/48/18 18/34/18 22/41/18 +o low2_Cube.001 +v -0.499935 -0.499936 0.499935 +v -0.499935 0.062565 0.499935 +v -0.499935 -0.499936 -0.500066 +v -0.499935 0.062565 -0.500066 +v 0.500066 -0.499936 0.499935 +v 0.500066 0.062565 0.499935 +v 0.500066 -0.499936 -0.500066 +v 0.500066 0.062565 -0.500066 +vt 0.250000 0.187500 +vt 0.250000 0.312500 +vt -0.000000 0.312500 +vt -0.000000 0.187500 +vt 1.000000 0.187500 +vt 1.000000 0.312500 +vt 0.750000 0.312500 +vt 0.750000 0.187500 +vt 0.500000 0.312500 +vt 0.500000 0.187500 +vt 0.750000 0.562500 +vt 0.500000 0.562500 +vt 0.500000 0.312500 +vt 0.750000 0.312500 +vt 0.500000 0.562500 +vt 0.250000 0.562500 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +usemtl None +s off +f 25/49/19 26/50/19 28/51/19 27/52/19 +f 27/53/20 28/54/20 32/55/20 31/56/20 +f 31/56/21 32/55/21 30/57/21 29/58/21 +f 29/58/22 30/57/22 26/50/22 25/49/22 +f 27/59/23 31/60/23 29/61/23 25/62/23 +f 32/63/24 28/64/24 26/50/24 30/57/24 diff --git a/mods/ITEMS/mcl_chests/sounds/mcl_chests_shulker_close.0.ogg b/mods/ITEMS/mcl_chests/sounds/mcl_chests_shulker_close.0.ogg new file mode 100644 index 000000000..e97e22b36 Binary files /dev/null and b/mods/ITEMS/mcl_chests/sounds/mcl_chests_shulker_close.0.ogg differ diff --git a/mods/ITEMS/mcl_chests/sounds/mcl_chests_shulker_close.1.ogg b/mods/ITEMS/mcl_chests/sounds/mcl_chests_shulker_close.1.ogg new file mode 100644 index 000000000..d61c81ccb Binary files /dev/null and b/mods/ITEMS/mcl_chests/sounds/mcl_chests_shulker_close.1.ogg differ diff --git a/mods/ITEMS/mcl_chests/sounds/mcl_chests_shulker_close.2.ogg b/mods/ITEMS/mcl_chests/sounds/mcl_chests_shulker_close.2.ogg new file mode 100644 index 000000000..865e81909 Binary files /dev/null and b/mods/ITEMS/mcl_chests/sounds/mcl_chests_shulker_close.2.ogg differ diff --git a/mods/ITEMS/mcl_chests/sounds/mcl_chests_shulker_close.3.ogg b/mods/ITEMS/mcl_chests/sounds/mcl_chests_shulker_close.3.ogg new file mode 100644 index 000000000..20388a403 Binary files /dev/null and b/mods/ITEMS/mcl_chests/sounds/mcl_chests_shulker_close.3.ogg differ diff --git a/mods/ITEMS/mcl_chests/sounds/mcl_chests_shulker_close.4.ogg b/mods/ITEMS/mcl_chests/sounds/mcl_chests_shulker_close.4.ogg new file mode 100644 index 000000000..4a3616448 Binary files /dev/null and b/mods/ITEMS/mcl_chests/sounds/mcl_chests_shulker_close.4.ogg differ diff --git a/mods/ITEMS/mcl_chests/sounds/mcl_chests_shulker_open.0.ogg b/mods/ITEMS/mcl_chests/sounds/mcl_chests_shulker_open.0.ogg new file mode 100644 index 000000000..c63da1d10 Binary files /dev/null and b/mods/ITEMS/mcl_chests/sounds/mcl_chests_shulker_open.0.ogg differ diff --git a/mods/ITEMS/mcl_chests/sounds/mcl_chests_shulker_open.1.ogg b/mods/ITEMS/mcl_chests/sounds/mcl_chests_shulker_open.1.ogg new file mode 100644 index 000000000..1dc602807 Binary files /dev/null and b/mods/ITEMS/mcl_chests/sounds/mcl_chests_shulker_open.1.ogg differ diff --git a/mods/ITEMS/mcl_chests/sounds/mcl_chests_shulker_open.2.ogg b/mods/ITEMS/mcl_chests/sounds/mcl_chests_shulker_open.2.ogg new file mode 100644 index 000000000..e1af5da85 Binary files /dev/null and b/mods/ITEMS/mcl_chests/sounds/mcl_chests_shulker_open.2.ogg differ diff --git a/mods/ITEMS/mcl_chests/sounds/mcl_chests_shulker_open.3.ogg b/mods/ITEMS/mcl_chests/sounds/mcl_chests_shulker_open.3.ogg new file mode 100644 index 000000000..d7ad1a3a9 Binary files /dev/null and b/mods/ITEMS/mcl_chests/sounds/mcl_chests_shulker_open.3.ogg differ diff --git a/mods/ITEMS/mcl_chests/sounds/mcl_chests_shulker_open.4.ogg b/mods/ITEMS/mcl_chests/sounds/mcl_chests_shulker_open.4.ogg new file mode 100644 index 000000000..faf751c9a Binary files /dev/null and b/mods/ITEMS/mcl_chests/sounds/mcl_chests_shulker_open.4.ogg differ