From ea938237d58a31209935a13c4884f92d5a98e070 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Sun, 3 Jan 2021 14:21:35 +0100 Subject: [PATCH 01/11] Animated Chests --- mods/ITEMS/mcl_chests/init.lua | 265 +++++++++++++++--- .../mcl_chests/models/mcl_chests_chest.b3d | Bin 0 -> 6075 bytes .../mcl_chests/models/mcl_chests_chest.obj | 91 ++++++ .../models/mcl_chests_double_chest.b3d | Bin 0 -> 10342 bytes .../mcl_chests/sounds/default_chest_close.ogg | Bin 0 -> 10768 bytes .../mcl_chests/sounds/default_chest_open.ogg | Bin 0 -> 11092 bytes .../textures/mcl_chests_trapped.png | Bin 0 -> 1209 bytes .../textures/mcl_chests_trapped_double.png | Bin 0 -> 2011 bytes 8 files changed, 320 insertions(+), 36 deletions(-) create mode 100644 mods/ITEMS/mcl_chests/models/mcl_chests_chest.b3d create mode 100644 mods/ITEMS/mcl_chests/models/mcl_chests_chest.obj create mode 100644 mods/ITEMS/mcl_chests/models/mcl_chests_double_chest.b3d create mode 100644 mods/ITEMS/mcl_chests/sounds/default_chest_close.ogg create mode 100644 mods/ITEMS/mcl_chests/sounds/default_chest_open.ogg create mode 100644 mods/ITEMS/mcl_chests/textures/mcl_chests_trapped.png create mode 100644 mods/ITEMS/mcl_chests/textures/mcl_chests_trapped_double.png diff --git a/mods/ITEMS/mcl_chests/init.lua b/mods/ITEMS/mcl_chests/init.lua index 3d5fbbca3..fdfae533a 100644 --- a/mods/ITEMS/mcl_chests/init.lua +++ b/mods/ITEMS/mcl_chests/init.lua @@ -7,6 +7,148 @@ if minetest.get_modpath("screwdriver") then simple_rotate = screwdriver.rotate_simple end +-- Chest Entity +local entity_animations = {} +local entity_animation_speed = 25 + +do + local names = {"open", "opened", "close", "closed"} + local following = {["open"] = "opened", ["close"] = "closed"} + local durations = {10, 0, 10, 5} + local anim_start = 0 + for index, name in ipairs(names) do + local duration = durations[index] + local anim_end = anim_start + duration + entity_animations[name] = { + bounds = {x = anim_start, y = anim_end}, + sched_anim = following[name], + sched_time = duration / entity_animation_speed + } + anim_start = anim_end + end +end + +minetest.register_entity("mcl_chests:chest", { + initial_properties = { + visual = "mesh", + visual_size = {x = 3, y = 3}, + pointable = false, + physical = false, + }, + + set_animation = function(self, animname) + local anim = entity_animations[animname] + self.object:set_animation(anim.bounds, entity_animation_speed, 0, false) + if anim.sched_anim then + self.sched_anim = anim.sched_anim + self.sched_time = anim.sched_time + end + end, + + open = function(self, playername) + self.players[playername] = true + if not self.is_open then + self.is_open = true + self:set_animation("open") + minetest.sound_play("default_chest_open", { + pos = self.node_pos, + }) + end + end, + + close = function(self, playername) + local playerlist = self.players + playerlist[playername] = nil + if self.is_open then + for _ in pairs(playerlist) do + return + end + self.is_open = false + self:set_animation("close") + minetest.sound_play("default_chest_close", { + pos = self.node_pos, + }) + end + end, + + initialize = function(self, node_pos, node_name, textures, dir, double) + self.node_pos = node_pos + self.node_name = node_name + local obj = self.object + obj:set_properties({textures = textures}) + obj:set_yaw(minetest.dir_to_yaw(dir)) + obj:set_properties({mesh = double and "mcl_chests_double_chest.b3d" or "mcl_chests_chest.b3d"}) + end, + + check = function(self) + local node_pos, node_name = self.node_pos, self.node_name + if not node_pos or not node_name then + return false + end + local node = minetest.get_node(node_pos) + if node.name ~= node_name then + return false + end + return true + end, + + on_activate = function(self) + self.object:set_armor_groups({immortal = 1}) + self:set_animation("closed") + self.players = {} + end, + + on_step = function(self, dtime) + local sched_anim, sched_time = self.sched_anim, self.sched_time + if not self:check() then + self.object:remove() + elseif sched_anim and sched_time then + sched_time = sched_time - dtime + if sched_time < 0 then + self:set_animation(sched_anim) + self.sched_time = nil + self.sched_anim = nil + else + self.sched_time = sched_time + end + end + end +}) + +local function get_entity_pos(pos, dir, double) + pos = vector.new(pos) + pos.y = pos.y - 0.4375 + if double then + local add, mul, vec, cross = vector.add, vector.multiply, vector.new, vector.cross + pos = add(pos, mul(cross(dir, vec(0, 1, 0)), -0.5)) + end + return pos +end + +local function find_entity(pos) + for _, obj in ipairs(minetest.get_objects_inside_radius(pos, 0)) do + local luaentity = obj:get_luaentity() + if luaentity and luaentity.name == "mcl_chests:chest" then + return luaentity + end + end +end + +local function create_entity(pos, node_name, textures, param2, double, dir, entity_pos) + dir = dir or minetest.facedir_to_dir(param2) + entity_pos = entity_pos or get_entity_pos(pos, dir, double) + local obj = minetest.add_entity(entity_pos, "mcl_chests:chest") + local luaentity = obj:get_luaentity() + luaentity:initialize(pos, node_name, textures, dir, double) + return luaentity +end + +local function find_or_create_entity(pos, node_name, textures, param2, double) + local dir = 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, dir, entity_pos) +end + --[[ List of open chests. Key: Player name Value: @@ -14,8 +156,10 @@ Value: Otherwise: nil ]] local open_chests = {} -- To be called if a player opened a chest -local player_chest_open = function(player, pos) - open_chests[player:get_player_name()] = { pos = pos } +local player_chest_open = function(player, pos, node_name, textures, param2, double) + local name = player:get_player_name() + open_chests[name] = {pos = pos, node_name = node_name, textures = textures, param2 = param2, double = double} + find_or_create_entity(pos, node_name, textures, param2, double):open(name) end -- Simple protection checking functions @@ -67,11 +211,12 @@ end -- To be called if a player closed a chest local player_chest_close = function(player) local name = player:get_player_name() - if open_chests[name] == nil then + local open_chest = open_chests[name] + if open_chest == nil then return end - local pos = open_chests[name].pos - chest_update_after_close(pos) + find_or_create_entity(open_chest.pos, open_chest.node_name, open_chest.textures, open_chest.param2, open_chest.double):close(name) + chest_update_after_close(open_chest.pos) open_chests[name] = nil end @@ -146,18 +291,34 @@ local on_chest_blast = function(pos) minetest.remove_node(pos) end -minetest.register_node("mcl_chests:"..basename, { +local small_name = "mcl_chests:"..basename +local small_textures = tiles_table.small +local left_name = "mcl_chests:"..basename.."_left" +local left_textures = tiles_table.double + +minetest.register_node(small_name, { description = desc, _tt_help = tt_help, _doc_items_longdesc = longdesc, _doc_items_usagehelp = usagehelp, _doc_items_hidden = hidden, - tiles = tiles_table.small, + drawtype = "airlike", + selection_box = { + type = "fixed", + fixed = {-0.4375, -0.5, -0.4375, 0.4375, 0.375, 0.4375}, + }, + collision_box = { + type = "fixed", + fixed = {-0.4375, -0.5, -0.4375, 0.4375, 0.375, 0.4375}, + }, + inventory_image = "mcl_chests_normal.png", + tiles = {"blank.png"}, + _chest_entity_textures = small_textures, paramtype = "light", paramtype2 = "facedir", stack_max = 64, drop = drop, - groups = {handy=1,axey=1, container=2, deco_block=1, material_wood=1,flammable=-1}, + groups = {handy=1,axey=1, container=2, deco_block=1, material_wood=1,flammable=-1,chest_entity=1}, is_ground_content = false, sounds = mcl_sounds.node_sound_wood_defaults(), on_construct = function(pos) @@ -189,12 +350,15 @@ minetest.register_node("mcl_chests:"..basename, { 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) elseif minetest.get_node(mcl_util.get_double_container_neighbor_pos(pos, param2, "left")).name == "mcl_chests:"..canonical_basename 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) 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, param2 = param2 }) + create_entity(pos, small_name, small_textures, param2, false) end end, after_place_node = function(pos, placer, itemstack, pointed_thing) @@ -235,7 +399,7 @@ minetest.register_node("mcl_chests:"..basename, { if name == "" then name = S("Chest") end - + minetest.show_formspec(clicker:get_player_name(), "mcl_chests:"..canonical_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z, "size[9,8.75]".. @@ -253,6 +417,8 @@ minetest.register_node("mcl_chests:"..basename, { if on_rightclick_addendum then on_rightclick_addendum(pos, node, clicker) end + + player_chest_open(clicker, pos, small_name, small_textures, node.param2, false) end, on_destruct = function(pos) @@ -265,11 +431,21 @@ minetest.register_node("mcl_chests:"..basename, { on_rotate = simple_rotate, }) -minetest.register_node("mcl_chests:"..basename.."_left", { - tiles = tiles_table.left, +minetest.register_node(left_name, { + drawtype = "nodebox", + selection_box = { + type = "fixed", + fixed = {-0.4375, -0.5, -0.4375, 1.4375, 0.375, 0.4375}, + }, + collision_box = { + type = "fixed", + fixed = {-0.4375, -0.5, -0.4375, 1.4375, 0.375, 0.4375}, + }, + tiles = {"blank.png"}, + _chest_entity_textures = left_textures, paramtype = "light", paramtype2 = "facedir", - groups = {handy=1,axey=1, container=5,not_in_creative_inventory=1, material_wood=1,flammable=-1}, + groups = {handy=1,axey=1, container=5,not_in_creative_inventory=1, material_wood=1,flammable=-1,chest_entity=1,double_chest=1}, drop = drop, is_ground_content = false, sounds = mcl_sounds.node_sound_wood_defaults(), @@ -281,6 +457,7 @@ minetest.register_node("mcl_chests:"..basename.."_left", { n.name = "mcl_chests:"..canonical_basename minetest.swap_node(pos, n) end + create_entity(pos, left_name, left_textures, param2, true) end, after_place_node = function(pos, placer, itemstack, pointed_thing) minetest.get_meta(pos):set_string("name", itemstack:get_meta():get_string("name")) @@ -305,6 +482,7 @@ minetest.register_node("mcl_chests:"..basename.."_left", { minetest.close_formspec(players[pl]:get_player_name(), "mcl_chests:"..canonical_basename.."_"..p.x.."_"..p.y.."_"..p.z) end minetest.swap_node(p, { name = "mcl_chests:"..basename, param2 = param2 }) + create_entity(p, "mcl_chests:"..basename, small_textures, param2, false) end, after_dig_node = drop_items_chest, on_blast = on_chest_blast, @@ -399,16 +577,26 @@ minetest.register_node("mcl_chests:"..basename.."_left", { if on_rightclick_addendum_left then on_rightclick_addendum_left(pos, node, clicker) end + + player_chest_open(clicker, pos, left_name, left_textures, node.param2, true) end, mesecons = mesecons, on_rotate = no_rotate, }) minetest.register_node("mcl_chests:"..basename.."_right", { - tiles = tiles_table.right, + drawtype = "airlike", paramtype = "light", paramtype2 = "facedir", - groups = {handy=1,axey=1, container=6,not_in_creative_inventory=1, material_wood=1,flammable=-1}, + selection_box = { + type = "fixed", + fixed = {0, 0, 0, 0, 0, 0}, + }, + collision_box = { + type = "fixed", + fixed = {0, 0, 0, 0, 0, 0}, + }, + groups = {handy=1,axey=1, container=6,not_in_creative_inventory=1, material_wood=1,flammable=-1,double_chest=2}, drop = drop, is_ground_content = false, sounds = mcl_sounds.node_sound_wood_defaults(), @@ -540,6 +728,8 @@ minetest.register_node("mcl_chests:"..basename.."_right", { if on_rightclick_addendum_right then on_rightclick_addendum_right(pos, node, clicker) end + + player_chest_open(clicker, pos_other, left_name, left_textures, node.param2, true) end, mesecons = mesecons, on_rotate = no_rotate, @@ -561,29 +751,33 @@ register_chest("chest", chestusage, S("27 inventory slots") .. "\n" .. S("Can be combined to a large chest"), { - small = {"default_chest_top.png", "mcl_chests_chest_bottom.png", + small = {"mcl_chests_normal.png"}, + double = {"mcl_chests_normal_double.png"}, + inv = {"default_chest_top.png", "mcl_chests_chest_bottom.png", "mcl_chests_chest_right.png", "mcl_chests_chest_left.png", "mcl_chests_chest_back.png", "default_chest_front.png"}, - left = {"default_chest_top_big.png", "default_chest_top_big.png", + --[[left = {"default_chest_top_big.png", "default_chest_top_big.png", "mcl_chests_chest_right.png", "mcl_chests_chest_left.png", "default_chest_side_big.png^[transformFX", "default_chest_front_big.png"}, right = {"default_chest_top_big.png^[transformFX", "default_chest_top_big.png^[transformFX", "mcl_chests_chest_right.png", "mcl_chests_chest_left.png", - "default_chest_side_big.png", "default_chest_front_big.png^[transformFX"}, + "default_chest_side_big.png", "default_chest_front_big.png^[transformFX"},]]-- }, false ) local traptiles = { - small = {"mcl_chests_chest_trapped_top.png", "mcl_chests_chest_trapped_bottom.png", + small = {"mcl_chests_trapped.png"}, + double = {"mcl_chests_trapped_double.png"}, + inv = {"mcl_chests_chest_trapped_top.png", "mcl_chests_chest_trapped_bottom.png", "mcl_chests_chest_trapped_right.png", "mcl_chests_chest_trapped_left.png", "mcl_chests_chest_trapped_back.png", "mcl_chests_chest_trapped_front.png"}, - left = {"mcl_chests_chest_trapped_top_big.png", "mcl_chests_chest_trapped_top_big.png", + --[[left = {"mcl_chests_chest_trapped_top_big.png", "mcl_chests_chest_trapped_top_big.png", "mcl_chests_chest_trapped_right.png", "mcl_chests_chest_trapped_left.png", "mcl_chests_chest_trapped_side_big.png^[transformFX", "mcl_chests_chest_trapped_front_big.png"}, right = {"mcl_chests_chest_trapped_top_big.png^[transformFX", "mcl_chests_chest_trapped_top_big.png^[transformFX", "mcl_chests_chest_trapped_right.png", "mcl_chests_chest_trapped_left.png", - "mcl_chests_chest_trapped_side_big.png", "mcl_chests_chest_trapped_front_big.png^[transformFX"}, + "mcl_chests_chest_trapped_side_big.png", "mcl_chests_chest_trapped_front_big.png^[transformFX"},]]-- } register_chest("trapped_chest", @@ -600,7 +794,6 @@ register_chest("trapped_chest", function(pos, node, clicker) minetest.swap_node(pos, {name="mcl_chests:trapped_chest_on", param2 = node.param2}) mesecon.receptor_on(pos, trapped_chest_mesecons_rules) - player_chest_open(clicker, pos) end, function(pos, node, clicker) local meta = minetest.get_meta(pos) @@ -612,8 +805,6 @@ register_chest("trapped_chest", local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "left") minetest.swap_node(pos_other, {name="mcl_chests:trapped_chest_on_right", param2 = node.param2}) mesecon.receptor_on(pos_other, trapped_chest_mesecons_rules) - - player_chest_open(clicker, pos) end, function(pos, node, clicker) local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "right") @@ -623,8 +814,6 @@ register_chest("trapped_chest", minetest.swap_node(pos_other, {name="mcl_chests:trapped_chest_on_left", param2 = node.param2}) mesecon.receptor_on(pos_other, trapped_chest_mesecons_rules) - - player_chest_open(clicker, pos) end ) @@ -634,15 +823,7 @@ register_chest("trapped_chest_on", state = mesecon.state.on, rules = trapped_chest_mesecons_rules, }}, - function(pos, node, clicker) - player_chest_open(clicker, pos) - end, - function(pos, node, clicker) - player_chest_open(clicker, pos) - end, - function(pos, node, clicker) - player_chest_open(clicker, pos) - end, + nil, nil, nil, "trapped_chest", "trapped_chest" ) @@ -676,9 +857,9 @@ local function close_if_trapped_chest(pos, player) end end --- Disable trapped chest when it has been closed +-- Disable chest when it has been closed minetest.register_on_player_receive_fields(function(player, formname, fields) - if formname:find("mcl_chests:trapped_chest_") == 1 then + if formname:find("mcl_chests:") == 1 then if fields.quit then player_chest_close(player) end @@ -1001,6 +1182,18 @@ minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv end end) +minetest.register_lbm({ + label = "Spawn Chest entities", + name = "mcl_chests:spawn_chest_entities", + nodenames = {"group:chest_entity"}, + run_at_every_load = true, + action = function(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) + end +}) minetest.register_lbm({ -- Disable active/open trapped chests when loaded because nobody could diff --git a/mods/ITEMS/mcl_chests/models/mcl_chests_chest.b3d b/mods/ITEMS/mcl_chests/models/mcl_chests_chest.b3d new file mode 100644 index 0000000000000000000000000000000000000000..e82c7e3639236824597be75b0126f74156f491a7 GIT binary patch literal 6075 zcma)8Yiw0T5I#VQATI@_JOoO46$Dyt<<-KSOKFQlfym_{Cd8tGgdiY~m`I>2|9r$B zDvA$GN%&((4CNpRfl`QxAp*gu@s)@|)Px`MP@+_kI^WJt_uR{E@0sMgvvX$d?4H?g z&un#dMNL=~1YLq4s9wA@J(;x~Z{D_L?d0n%^|w+)7h5Na|2pl z8ubBPxK(hH7c?sf8fU}5|HIxX^)IDy59 zY5jBTk6nK!`E7mF@Aog?`Wkuto$&+z_kP_UU*F99x z{??zx&raX}W;$%?cKTO>&g6f6G6?o0@x1FViIn<%{ot=}_qV1)!vFpHusZQ0zxw_A z!!P-B`|J6m;OE!>`~2|R{Dk#6zvZ8tuhMpZB!7he@Z0>9&z~=Uq&{|jssGPfADiFR zFT#KL{rsKz^W@LFKX^agKYxDw{zl%v#qSU569oLf4(fyTdw=fr`~AOje!oAt>)W2+ zzF&_0*ZK3kzvYLn&+`}g>ys4~VN3AW>|@Y(@_!=XdEve`tCiofzo=h9)Su0Nqkfm) z`h9%^_DlZUe(*bE{;d4)+xf|@5B@Cvi$9V-i~lx1<@4vuAE{3k|1;)q!TLP^Q2&hi zJM`ztpLc)U`ys#Ox8J|c>M!31-v18jgZ1wLf7G92{lbsj^CN#}``4ad-;b1k@_hsU z?ELDt@8|gqe@1@0KJQ2V0$Q?oe)=#jLoB!txna=F*?8WaQOGD@+~sVH`C1k5bt>q= z=;dsT`!f14dNcYt8{__rdl~mI1~?nzfsFeZ_c8dMXKjp!Fa|RQF@`!D*%&7nxUQBnDx8h+ zG{#iMLyYOp#<-F(lQDx)J*-G_h`5HJJ+c0hEsU0h1sjL|L|AIMUfAPJ>Mlum%D)LBK2sSOo!lAYc^)41<7O5U>aW zc0s^22v`OIo3Kw{88jFN4YompRnTA?G?)hs)`J?2yIEg zI^}Gz5YMZf1{-06bVSXj6aG1##fo)Yj1}wn z8Y{Liuo5fQ@jh0pI~%cL-T8?X>&{rLSa%L%#k#W^E7qOoSh4QR$BK2|g;=rf+Yu|) zeP3e5x^GadSofWZ73;obv0~l#E>Cm4M7HVMtE6AvwK<Q)fs{lp#4ShU6p|5|$eh1{)G~8WQFi5>^=! z#uySd7?PbfB)e!xcF2%a-;h++kW|f(RK$>U2}9B)3`v(TBwfOgbO}S!B@9WIFeF{V zkaP({(j^QPbD>Zt=@N#dOBfpEo{x4~x`d&z&K~EqbO}S!B@9WIFeF{VkaP({(j^Q@ zmoOwy6bMeDcBg)=cFsyU-Jg0MY3CBN<=$L=nC8DuyZ4CrmJ>IpVyIp?%7P-tX&;N6 z8r%2c!NjWf#)PN8SVcXiTu%z`eJtX14UO-vNenxX2>0*XLbqn@O=_3Wcf0NKLiadu ze#*;NXNJ38*+CoL?vvCmp|Qw`IAF$>gJlTaPqNSzZ}_U$m2!n$~9R5*mvbjlbM_rs-1K%FU!#O_aLggdWqr%P{4O=_3WSmaeq z=>B@*xz8ts*Zx^gUww2csa-;2wFc1t?*20I*@mIvu0PUr_|1OqJC(@?>=|;WhqNWu ooaz}K`?iV>{XWTk%Q9m%clLK#yM(R*`8tZ#E}^j+2c4bwe+Tu<9RL6T literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_chests/models/mcl_chests_chest.obj b/mods/ITEMS/mcl_chests/models/mcl_chests_chest.obj new file mode 100644 index 000000000..36268146f --- /dev/null +++ b/mods/ITEMS/mcl_chests/models/mcl_chests_chest.obj @@ -0,0 +1,91 @@ +# Blender v2.76 (sub 0) OBJ File: 'chest.small.facedir.blend' +# www.blender.org +mtllib chest.small.facedir.mtl +o chest_upper_upper +v 0.062513 -0.063134 -0.500468 +v 0.062513 0.186920 -0.500468 +v 0.062514 -0.063134 -0.437955 +v 0.062514 0.186920 -0.437955 +v -0.062514 -0.063134 -0.500468 +v -0.062514 0.186920 -0.500468 +v -0.062514 -0.063134 -0.437955 +v -0.062514 0.186920 -0.437955 +v 0.437907 0.061263 -0.438085 +v 0.437907 0.373830 -0.438085 +v 0.437907 0.061263 0.437729 +v 0.437907 0.373830 0.437729 +v -0.437907 0.061263 -0.438085 +v -0.437907 0.373830 -0.438085 +v -0.437907 0.061263 0.437729 +v -0.437907 0.373830 0.437729 +v 0.437595 -0.500754 -0.437772 +v 0.437595 0.124381 -0.437772 +v 0.437595 -0.500754 0.437417 +v 0.437595 0.124381 0.437417 +v -0.437595 -0.500754 -0.437772 +v -0.437595 0.124381 -0.437772 +v -0.437595 -0.500754 0.437417 +v -0.437595 0.124381 0.437417 +vt 0.015625 0.921875 +vt 0.015625 0.984375 +vt 0.000000 0.984375 +vt 0.000000 0.921875 +vt 0.093750 0.921875 +vt 0.093750 0.984375 +vt 0.062500 0.984375 +vt 0.062500 0.921875 +vt 0.046875 0.984375 +vt 0.046875 0.921875 +vt 0.078125 0.984375 +vt 0.078125 1.000000 +vt 0.046875 1.000000 +vt 0.015625 1.000000 +vt 0.218750 0.703125 +vt 0.218750 0.781250 +vt 0.000000 0.781250 +vt 0.000000 0.703125 +vt 0.875000 0.703125 +vt 0.875000 0.781250 +vt 0.656250 0.781250 +vt 0.656250 0.703125 +vt 0.437500 0.781250 +vt 0.437500 0.703125 +vt 0.656250 1.000000 +vt 0.437500 1.000000 +vt 0.218750 1.000000 +vt 0.218750 0.328125 +vt 0.218750 0.484375 +vt -0.000000 0.484375 +vt -0.000000 0.328125 +vt 0.875000 0.328125 +vt 0.875000 0.484375 +vt 0.656250 0.484375 +vt 0.656250 0.328125 +vt 0.437500 0.484375 +vt 0.437500 0.328125 +vn 1.000000 0.000000 -0.000000 +vn 0.000000 0.000000 1.000000 +vn -1.000000 0.000000 0.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +usemtl None +s off +f 1/1/1 2/2/1 4/3/1 3/4/1 +f 3/5/2 4/6/2 8/7/2 7/8/2 +f 7/8/3 8/7/3 6/9/3 5/10/3 +f 5/10/4 6/9/4 2/2/4 1/1/4 +f 3/9/5 7/11/5 5/12/5 1/13/5 +f 8/13/6 4/14/6 2/2/6 6/9/6 +f 9/15/1 10/16/1 12/17/1 11/18/1 +f 11/19/2 12/20/2 16/21/2 15/22/2 +f 15/22/3 16/21/3 14/23/3 13/24/3 +f 13/24/4 14/23/4 10/16/4 9/15/4 +f 11/25/5 15/26/5 13/23/5 9/21/5 +f 16/26/6 12/27/6 10/16/6 14/23/6 +f 17/28/1 18/29/1 20/30/1 19/31/1 +f 19/32/2 20/33/2 24/34/2 23/35/2 +f 23/35/3 24/34/3 22/36/3 21/37/3 +f 21/37/4 22/36/4 18/29/4 17/28/4 +f 19/22/5 23/24/5 21/36/5 17/34/5 +f 24/24/6 20/15/6 18/29/6 22/36/6 diff --git a/mods/ITEMS/mcl_chests/models/mcl_chests_double_chest.b3d b/mods/ITEMS/mcl_chests/models/mcl_chests_double_chest.b3d new file mode 100644 index 0000000000000000000000000000000000000000..86c44bfeb96b2de946ffe210f23c56910567d2ca GIT binary patch literal 10342 zcmeHMU1(fI6rSd%Q5$~~ZIyx&lolx^?v3=N*}1NX8f==HM6n_@1foLIG}eTQf>}f~ z1yRs~1-10W2V2D^l_Hhyt}Q}ZOx2f~B8U$Lgi;i=R8bqxH)qby-P@b&px{s43)8uC zzi-Z*b7toBoNOi&v~60c)FP!+ru+V$)zq8!ZKF>jHX3JjX=4TfYL1@uU2W~l zNkVs5S1-Oro(m@mh)M02D|P2+|A2h6{rr}<`?%z^q)_@_{ZQ*zK?z-`xjfkQT#9GM?-(-U*NmQ#!&PFF7^|K^%+n0 zZxNUCXXLy6h5cr};6^`ZAMld%0sMmf>Fw_5*=gG}R= zHEhLq*n}RoqKBR6VKaKzh8{MfhyCbbJ9^eNt6@9F@B@1I06lC)4{V_2cW9wHNhdEy3JI5%F z+ZZRsC~H5V&i)r-_DhV4auLrl=j6W4LCv>kgJTb_(GS0qvhlj;S0h)rpEYHJ+V_75 zx^ih!ZUGql60%boib6-(FwblACxhb@aYx^!2ARIf+rijp{JDxs5N{otgp?A~|UyvUpM#Z_1I}`J-#HctI`eNTs*?sG$ zeUlg!<%-`5vGX7?O1Q#<4)Jp)F)E3Bg3fPEN~#`;agf zENjO9P!*X~z`4Ruf z`gtxGO4iRKp?Cgu1w&+hKFPmUKg`d&`Ne`l^q)_@_{ZQ*KGrX%pTP^s>!V;Q!F5DG z!hqumML*zTKVev(@nruN@p;Y{>^JiThkZ%@ThRXhUqN+oB`Y`qm4eDI(UoMy$7hnP z_;4jz@!?9c;=`3>#fK}&iVs(k6(6o7D?VIFR(!aUtoU#xS@GdYvf{&)WW|Ro$%+s6 zuNPDo*B^a+61+-5RVk<{1yxr6Lj_d|aV_%v`GRWt({;Hs!;`wde%d6YFCBhEH#XE3 zNcdW%_Ot@uySY9T{Gm^lh7QlJ6?|$N|H1{lYH~2o$}tZ4fu8Md>zK*Of^3&z;a`GeoG3&E`3gkc55Av=5%=!*@_ATV!$ozc5{uuoi zkZ=4WxZ6J;{oMYEes2An#J}eJ$o@G00#}O8$2|VU`iv+0w}_kbC-NivEAz{p&jszT z6jc0c9QNYB_}5?PT`8z41y!Y>;$LGc1r;K~zw1}@NgZ zM8fYbzV*G|_x%6!%+8%VXXcza=lssxbMLcy4i5SN9`KLiP3dBf>vE*uRf2Fp{O);K zJ9*;1HF72HZ31!WWei00a#|Emn)|79c$(v6)w97XlK9H6dF z)`l1Cp_)($ak#WNTwEF|@F6?=UloR94k7%z7N)FX2mwgI5x6$AFL)vm4FEI%V95ic zO0n036=CuO9%f)};(C4J(HWTNJ|>$uc>g~esFW=O01yDd0;CBA8=B7J2nQzq1g~6# zldfC|lsM-0DuVR&A)k$VaYM0-`#6l3gwli%01cyflPiKAg=?&%xFVUr<_VkEAXiC_ z7n$J8+)y%!L1>t^#CBnduKf1Pf&}@`0u2+&k$HgkIASyB9}Ve+ z9#C*E%0$ezG|D76_EE6n3@?z?U$vk>FsLS=kwmXqOFvS}Ha5wl_g(llo%E!nn!bS! z8Z5r%Mt*i!KVPh0ph-rASxcZvON7~cg!xf~6;tFt>aW0+BV4^u9SQ+*uOQMs!t%LU z@;@N*@xvo4@Bmw!NuZ?3+_2;V&0>4!DyQrw$MPn(kvid#I*N-a00f+ZE4fZt#s5#W zH%YVm->ahIpdg?K+H$~?ZNQU94aGCyB}{x_;XwfOsUk|a&r3?fTWY}j8dx=aREIFy zV?VU1|LFvr+W|lk&erG2HUwG&B{JxcmWmRdS;*I984ma zXmw$hV2~|S9*GLYUrFGEsJu_mtck3HF$7iCdTuFw_H<9QK{kJDX-4*i2VKXRKZ3r5 z4QKY{W=>>zk84t775(i!q|GL-ES&Hac!Uti69PtV2$kMP|C}#d5pU?}>8~M4Jr28&5N0`t1 zu3!UKu<;g`BmWy%|B4&{44UwZn8aAe!3T1}bd^c}I{2TF<4He|#5R<~qgBVFGbKFs zT}tmjYLZUvwv>)OgZU(b?=+*GzKr>_wB0n?Zr0Ckp~=pyInbo(9|7|>Y*w(o{}DO3 z5aC87e7u=V@bAdU6-f9XmvBWhna3oV?_rulbXIBR^X<}nvj2)4$C#3gn3AZN&8P%{ z=rpJ3tg_a8*Ws$2w*R&MD{?fvc)$uqj+z(Ge?(3$~ z4gi4eL<+5obL2KkWELeoixNQ_DE!Y615#(Dbf%?1!=?fNGXPuxog7XRBYG(gR#5^Bs@h@kys`;U%GbqrG}q-wz+;a9 zxD5co@Im++Ca-bLpZ|Uu@bUN5nsWB<( z+Xm7X0k-b&dm7@(IK(X&lscItvVF zbQ5~v&<&jyxaNa4H?mteLYpuKnPDT=eg>{F;W%SweLdEFNrwXJfe-*cx;JfIjhQe6JIt+cJpeW%THw8@RFpzL#} z;K=Km;kvz@Hn9d@uG?teWsLbpBTx@Fi~G;bjw0&Zu69+P41)}&ej(o8V`~MM)w{ET zWBmt0H>~6miX5`Qot9N*mzD3-xeN7H>?q$x2b!nat;m|2Ty|fPO)$g8=a+qM6CCLT z1;Lm4@3FlSXER@v0SV9QD#-(F29HSJx-9m4p2&av>03}uK|1gh#0CV14Z2~)JT4); zU^xgt#I;GUPb1g|^`Sw1h87yYiMYIVk$r5KTS#Xv%#2_^)F44~Feil;=?KG2p@{Q} zZXsRrFmouE+Tt1OU1%XA(n$m}W$IkoKVuqq$%aN^v(R>2leDM-M*vxE<`z;ZBZ~^@ zwU8o)qactArj%}$7Sif#mNtT{iV7LEknkpYGk5qL8@Qs7)=U%DPp|JL(w}vu9}2P> z!U?~Sv7UheS!ISLBaxM<$*9qs6dbFt1f(XcDH*8^?h1*ljX;^Y!sl{OuF~MHKvu~} zSCM{GGwnuS8dLI%T~#(3x;R(%gTi@>n6!|!jf^ht@C_EEQzcG#X&<9m0w`SHMY?#- z8AmX4Q<%&0Mpn+vpyEM-ja$cTmjB*AHMe#a>7TQ%#0eLyO-%-cZ@e>&Ltv(?K~~AA zIB87))xHi#tMaVXG8{ z8rO89@ft-4k}8iP_)ERCm0>XSs1gZp<2V8a>zhN6@D?#@35xU?y1-zd79wEYaS^se zI?;U)GD;ItKoyMQekgeE5HS}qg-tLO(%aB*7cqf;DWbOlZOi0Mr7Xy7Gp-~63%`XF zghkLGHF=A`43~@z%;#JuFve`)hW?%-mK4?$@JOhSfrQ|taBU=iX$WZ1N?#BPMSY{D z&Xo=GiX@d0a}rv-AQbE?-(;8y0l*hulavKVc!HRrv1PqD{00ce2jHu?e zt#@crE_i0*0S|F!CK5rMhf#<1LovxHP#maIsTT!kyFNo40b}|F3PQtG+K&c=RllhU zva-+ErHZR)&bmSx3xc?DBg+K|5?sbw0bq%c7^uN#Rg>XoA{CUfy-*?;3Yswv9!YN< z1K-S1A%XQ}fH_Vv6E5`tAF{aoBMu~hxBVaivB`#Oa=a7%otXT)NBaL!q7=-tE*XMP z>wYFylD}EGI_<@+jq5*>^o+l^|B38qrO1;MHO$~d%`4r670sE(ihv=91aGb5q$5$_l)icE3V7iZ3XD%Cn+h<1 zOkKdOyNJLV=d9xzLHmOz#GG}k^qeUErBoIsi0G{*CJFvMyXkSivnpSwC7mc;(B~%PTqt@;wb05VwcH28YqPKlnhY*V02OuU16$_YD{VZ~#CuC6t>x3z0zelsb_n=~6On z3LOT7F957Uf~kRE9>S=oDEowh-jDb^sUZ$1(5UXXDO3CZ7A6@rWY-#28%tAEM3 zH)Na`n>k(^X>oBFzofW?fRLnwq<|n?d{Gn}5fl^@5a5HuB_@P;h4}e}Ma4uH`9-Cq z{Yovb`(Xmn-yQc*d-&eT2#w!D5pz7)LpIFEqJ@U>lB z--oIffE1s3p+Ub3w2^xM$UGN9UKIv68|iah%_|p9KQtyE(8F$aK9Jb=WkE0!A9+^P~cp*7me>3OlbOnvwhx?b&OXN_Kaj%H3~0X;hMdPl55+0;Ew1eOM!_gQo^JzUP~L`3F1C_(l2JGVRM=e zzk2l<}myB5+kVIQ1!h$d}61g60FMXUtmbk$r0=M2}LOl(Ofug+yX`qoZj zi?t|KF7K&Twv$we>^%Ku!##P&6$@W(RV>yuHvWX-Olw2j!k-vl z`?|091k_1BAA5L0Dw)Vg)`Yco)m!Q^i1XjTHk`ohD;eIlr55P@u9cF#{PJ;!8xelE zs6q*sduVrSEX+)?3_`3NbUonK-8hF6;~_nyTY4AEYZ1aZ@^5$s628k-wt3G2##-;Q z%5eleqOw-yoS!W-b6!_T+X+<9n73=Niu7CCA`0N1G+|-0w<`a@$)MN=By37HTHCNt zZ(C*BTtYG%mz*3}RzAIz%E6oY?8JG-J#58QnVh4kQpl&ppR+Ht&SSK7mp8Bh`vNPM za~Py~ixZu{-$}duv)`&(T{oxUt0s`l+_>7oG>2}dH2>Zyw70{i@iXV36XAopR+w5` zoWs}41yp+%KWeU{)En|pDfZN&dVKAvt&=;`8U>8fpKF*?)0+k~r~7I7wQE229F{AKAbats^!;oQ zWm8I2&*zbhp~9W#^9Pd$$%@hdE3vL}-}kPq@jX&YhC9^2HI6G(b%fdiW*gMGdE~i} zu>J^*OFeuu7J@ zNTqDhFnqFN+7 zw{8YmO}XCqAh6Zbe(d1hD4cY!d**9!;nmNdq`%loK!6n>$8gAY0ObQ2s&!_(scre- z-oc7|RhWxIO4Y3_!}kHm_)p`e>LeV1tKhc6tt@&K)`1*Yu%(=_=J5NQ$~l^MRwMcH z9|W&PcT+ZCs2@B8;zSq72*_Lu_I|zRTa|O1c+RZ6SGX5cit;`Qc{L0TSm?;;*n&tI zZnK5w8oX?!gxW~mBA;k$_r&A-vhww&e}Q3_@4)A3PFD-)#0W*#0}c6y?>wC-@5pG? zFY9J8$-V0`hH}Jb0c;tpLS>`BoIV(O8MZiaEwRb1&$!HsVzqdkf6@ECI|)@*Y(0Wl)MovDz-0%%qj!EL zPE4WmeowUV~DcA{pTEVT}5a!#*L;9CF5?xOz;+|h~`#gj(8B=rP{mlq@t<|mJ zJniD#E}Y@eHHJs3T5d#2TAf`o(-O~O>+@8O4M77;^w((Eq$>1;ilt?$KwMGecfXKM z=2Y$Mp&3cGt-8f$9n?MxfN0m`Kd*EKUiYYd4fB3oX> zyrCsLB=POy%JMEe{b8|?D|~jM6Q`WiYurwu@+MUryTq+%xo%mP@s_4?AXNNr&hdc( z_3OGt7WdUsRen~GpB<&;OA>2*>@|GL{hDjPW4vT|W=YCcd6Gt&{9^^*WyQVg1srm& z4{=EUsFXM}r4tK=@Bh+{Q7xRY5_{DeFGk{Gd!sH&lIfei{UuPa?5gh-P3~4IOlP7p zzT70@mhue_$S>6$}^H^WhnWP z^s##Ur!)jbxqd7;EOvYMrkc)cFX8k>Q%hG)_-eI{WoRQGpYtCB1?itB2DKjMI$tj%g&Ieue($HK9Mc_s_-L};x?D^2zD(mr)%T{Rbl;T-i<~_1GyDDF6+Ko7Ol{GO!Izd-ivO?<(02>hZCd6 zF;&xxx=Rjh_om5yYf?fep9eozZDRfL{&rX5z{9M?d>GS#O`k+vN|ufQ@Y0-NX2(yS-JCDZ`zxpK4dWN5sf)&!O;lg*OdFBW{+WO)$0n%-KcIQ~XEqo; z^5|+}p-^VoWtxdhyOX=RZ#k$3A zl7#z<#837t<}$9{@@ZF@W^f!FZRl=G59hmC^4KnuwH1^Viefzt8IMNu?7D@{WC6(`EiHzmqzSsl{>*!ieVt@A%8wTr zP!o>{CrX*#!ndJ1d#%4$^c!X~@a;EaN!=Wc=ycc@YF#gAD`3W+J-wsbjEO@wz z(~O@jPSFA!0r3WJNGpt?16`hBTqw3a<25qY-36a4wN-1sy7Y&Bn^)5xO3y#n`_o#p zts$S<(ss8lWu?j58hh!Jnna&#|Jbts(Ls7m5q6=IAh*j$N#|~7Yos#4!`fKq`!gE* z{?JiVwCkgv$9(LOiB3umOhsQ6EJAl~?(lkt*zp+{*JjOXR9L~vm|IO=ss?Ek9}dt^ zj-|57mJvKCH+fh7qMqlNVl4mCYwt-ikGlc=O3#J+U5xWY%*>ivL*4-jY^-H_vs>zf z{zQ3(Ue_C!vnEtcei(SVt+A=H;9i9~$$j4w(z9K1&YzAL%?^fF&O8-$wm{0So($bz z2?}(7^q@Z6#=F9ZngfwBcgiHY^~#vH^AQ_cj|_a;l|4iU{ftn;iPCEOLAhP?h<7ct zZ7%$E%83(Fxf3vQ);6lG;?cu;1B`;aYP!{) zRh#t7Z6;Ln;cN2d$c|oS2h*_|D#41}V(rcZHFOFX@$*&9Y~mCix2&lOtFpGR41%D` zE6?w)2B_5ejO9QbmgGF?s7>}P;sqEXz&VSKGEpee>hhfi2fE-+Pp0_^Gx=-(gS1E{H+F*!*WxE^Y~gDG z4JI`#UjxfIw{wy41nj&H=8C!BHSgm`RzsZ7-?F9Cdu5i&CV5j`a)EXeLHq>wI}9(J zUa^TMFf{}B@LHleDlg^8O7N-j9jC!Bio|-~*fONw@5)|QCTDMzj=N0g{q2+L z^rtDtZNZQiw`uPYtks=N)E79*JH$Vbm3HR&+>w9vV;`d(yUB~qTO@9owwtx^n{AZ$ zM0t2kzA2%+_2nWOss|;r-glb43Dr=S3ZKb*G&z*7Grp5*&QPMd=^S?@O0_A9nfn*A zSaRe@`!~_=Z(ruw9hV3n8tYg$68({2BugxO{!R=^Y4kqu@V7B9aQ-plkDf;E$~!Q7Hx^u4(S=W1S{1GduIfR}ix6F>V#Z+;;C@cE3D* z@p>dF3O&X+fKQrNpRkZ2-l{j_smS?wENO$JH9$wj4 z{+Oy!Gb78Na?auFg3K`Cu00>&S9fF-P)XVCtPsJvm;S(O2>wKaj`B+Cq5>|yG7!*! z-wkmE_mu%3ye7?5#8VAn2gk=J`UiVj+d6uwIbI1@hI@I`tczC4HL_+Dr`~_Ze>Met zpL;z1=lJtxwMp1lhm0Fv?%pe_9T{AgqZuNP6?oZ_w_)bdxyy zHDKOSaPrPFRB*21&1D+mJfqU}(ItgTnc}Ngc7H4V9*nXe27-bYy+SuqG7FQq?bec{ zt_S2*+BkZ*SJd}Z4lb_-C&u#Zy`QOrbpF;>=qvB0v`BbVAo^*PDBfw-7XJ>^Dqk1! zsoA~bw8`mY4Xr?bPr+mLg!&o0X&@JD+{KE#_TuN!VV)w=TSTbAX`#M=4!*oUsnm!OxzX&%XTH3niYP zO&R3WP(QtM`}?kZQt(H@8@Vd#(px-BonepY6yI_~q-ShP^-<6S`T&Y7kLb7p3_!FYaIrX5+t9Zb9rW9|a={|;wxYO;+ch@R$ zB{UjJX15Lmudg|})CSZ%Ox|pMe0m({q?hbp>c^eJn?NefOeJ?$0eNN2_Fjs*%(X{W z*;5+!i%E}KU-yqmG4$tV!NR{Jq6rF{l^WfPZhEGh2ltQ?eTi^WNPN@1@9XhtG-$Pb z*#uoUMml}!C8>q3nU3{4py5}{6x&v2uG2FKdHshwE{vZ$~+ zqpgx5&$FDVPz~A%0?7H#%KaS2(;{zjKnxGK`v}At$^Kl=qh~+&iJi5}X%~{+$X0*8 z*)aVXa>dLxL+s#d7^_`M-AT*u=rfN%iIWKy`U0mpz`ok}TwzZ{2FHL2niJ{u{p2a0o^}Wu-iW}8a zK4O?SEB|jEqYjr_L%Xtf0xuK1yF~pWmIwfzKa_$;cz6WgR~a)g76DR!ufM7bN}{hJ zpLgp#)N5L9x|;3p*5Y)j>+DAbmBG1LX4r@J2Pv%AoJ2Y-iJx@k(s2)!p60AtJ@k0n zQ)2%lb?N)O&4X)iYTiCD`u0{^Ys@h<(#hzd=$Pi^t@=A2UEYpns&6<3a=KMcc4uez zzxwd-<oOD9zv~U&; z@am{q<9R@U+!?k!v(*iM0}Cq&(DYu)lAe*7GeC#5@6zY^3&Nrh!?j=(4KwK zVtuBWP1`Bw^JFu0|hZ^QTmYgtIgbY7J~`& zZ)_*d9^SWapEh^fI>0#4i>}E8UNTOie*5c&tNN1~><@j(oz#OGYwMLsLa|wpc;0km zwgF~T*B^*W-g&IbbYVwvE zPxcTy8oOA2DYzwl8A$<#plD0JgQuf)4)6 zeVa$buYNm6nlzDU-+Gcz`h$~-)Di*&G#*7L5y$^>-Wp-d{O5> zoI#XtK%~*hW;MOL)Os*~O~Q{y!Lgq{g?4lK3O80tTQs2ZJXsQu*|VjyQfR^(swLhF zI8Nhuc>Gl?#&jVj;5uVQ8F`;vOfuJHhK1wQSu}YzK8ww4a~VuI&@P{=I^#Vfs`qMF zD|MTbc7l=`2hq1Ef?bIq**8!^9gpDSGbKS&d_bc`r?=36X8VLAIL2awjjYbsK2vT? zdAY`I|3}0Za`r2&dyW$)FWnmGuD5(^3y;7Drf{>lS9hk@bxP zFL@iPhoy?l;J}yw;k~c+0=l_=XZyU$-of{BS`sE=Q|pqc4;aTXm;$34Ng#j-C$UoW`Ep+;iJPUFB?J-VLP37o!z zaLC1VMj*vQw(X6K`RROu_!nY%>bW4Uy52w5o%glOOzIEkV&gPEzUJ#v*cp{DF+6TB zzr=NCZ0PGH-_*RDk8Hd@ua_QL(8>nJy{nAvjMuv^on!6ec*RiQ_t$UI$=Y7I6)m$| zw#3qph!_~v-S{Q!Qpg-J?49RVotdp9Wl0~==9$m@JbD_7rZ*}ww%xmeKN;xbSt8VW zxxbs!+AVHfG#RP3VWVz>S`>lT*}b^44B06abfjPil9ejb7**WIShiUOd1a8S-?t)F zVy56+L%~HX4n7$!vXgnX})Afr{%QiM}E78q~Z4V!8Tfo+6vx z{-=jMffSh6VaXz-m=`4`O-;zxrTi;xzQMZ5HOgU=Cf+z2rd=dd%7WV@~48D%6hMFO|FBF z>fK^&QdU+XxkDX6NvnU(`BFI{_ix>aw;a8$wL)+q6Q7>;irRFBS4!dam!$%G^m2ON zAsAgZ#zIi_cuvb#3>D|v1czRqkQD5DH@J^=ePQ}Cuyfo#q|JPO=*7*d9FoK+|EVk> z>Q~2nqww9>;Gx5GYC)e2>`w9GEV@*tqVwZd$2Kmwotg7pv?m+21=0Cq;JQpZ`^QX{ z5X*2R`?J~;&2vE9P@k7p>k$eV7d9f6JwEL^98{tHV%9rg6L=o`=Z_xGfYY;;G1b*h ziu9xMNX9z2;3B8E$e-aXifz)s3EMxyP4;T7M?cyNN|Q>2n6-Yhy4uGEd7I-4(l$O^ zv7X3%L%H?bM29HQ{2e?AkHA?dW{X?=v&R%SaKOk=R7!A_*Ulp|>~XNu$ews3lR8zs xdk@jDuH^{zro5W*5-ok4HV7pp&tMOBD+QL-`kxYRahXwe^FeN{{v3?Hg^C3 literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_chests/sounds/default_chest_open.ogg b/mods/ITEMS/mcl_chests/sounds/default_chest_open.ogg new file mode 100644 index 0000000000000000000000000000000000000000..40b0b93416cbf8a724a255ba202bcbf4ec74f429 GIT binary patch literal 11092 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 F{{dc*pj7|> literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_chests/textures/mcl_chests_trapped.png b/mods/ITEMS/mcl_chests/textures/mcl_chests_trapped.png new file mode 100644 index 0000000000000000000000000000000000000000..de21d8f2fa5920d54c01431967f5d97c1f8e8355 GIT binary patch literal 1209 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DkxK$!8B)5ZfpLG}_)Usv`!T!NfJCb4TCx&ehGN?apKg7ec#$`gxH8440J^Gfvc zQcDy}^bGV&Q(KKvfkvx%x;TbZ#J!!qH!s9c!0j{7%b?}Hy&4@Z(weHGtfoRiRa{Y4 zN0>jbmDoI7wE2^x{I!bzHx%^KmMng4J@4ZW>EC(}xpwc~efz}OvuD#@-$~xSef#Yn zzkmNedwhHU{vV&dJQM%bp*U?0fB*V=<>G3ibyIEkYdU@GyZz6H|I_h^ueK}Bn;j5gU zbdU*q82S16Z}V1F*`5(}*0J29%+pwT)ZOPc!=r}Fsm%w{?iNfkX9zrQ(hzYiBlWqV z3*++c7k^k3W;^zL?6O+MXcK+2@{I6S#+)t3)qZd?@Fu>y!1h7%V@~SxjTdo8?`?~Xr$f6}EV%x73s=6Gg)4bzh?n?6VUQ#``<`Id6P4CS_n|B_F_WIiif zq%zwC`dxoL{|3jgN@ju9{+)3-{XfMEnRl$p*|B^-BgbY>r#V0W<*A5YY)~=ht7TSr ze01lLonhbpOmi)|Z28T$*6e`4!eg1=@6;2RSKZLkuU&pE+vxbQwm)%|n>elue0h9Y z-uzzVoXJaPREnhYOTOTunGERfB7=IzO!^TNvH zl7ljh0CYTB`-H)FyuP^{05uK<@*d~ z?;{refJDzq*1lIhzG{1Q58=E!>vkD((k<0O=ACFWo%VUtf zbDbf{#&@3PtnVt)iD$0xGMK$Ke{JmAY58-m^!>#Z$1a;KXz%^@#jrNGY~t%Jo1Slf z`rrDDTdULV6E{?n@3{P0C39j%mlpdfAaC}Wjg_UJPZ>V@eR+EL^%-{WpML$it-_4q z{yv-I$FCLd(O-X3M%we=jSniFhW37YoJE6w?pb%>$Avw?uVp8J;>Leb^*^iE=Oq-D zX|c_7kT*VcxZG>6^XFM-Hg3$E9MQ8x=g4Mpw#7DZSD>ik!f7$%yb_y*mR`q)BHRaq?jk(%^R^f|E*15cl>BKMLHt+1JB;!vuWu;$*Z)_Jk{7g9{ R9$2O@c)I$ztaD0e0sw$&O8Wo+ literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_chests/textures/mcl_chests_trapped_double.png b/mods/ITEMS/mcl_chests/textures/mcl_chests_trapped_double.png new file mode 100644 index 0000000000000000000000000000000000000000..95f768f97c0e7f1243b73df472b10174c7e69246 GIT binary patch literal 2011 zcmZuydpy(o8~?5y#2QJogC#|j>nhVG3^}Z54pOQacE)j=%eHW0l*2iSKcDye^?9D>^}If*Zs(k!N}5Ul z06?+Mr`=^SQD&H(@-ja#n2;a~-v!#a+5te-ZOAu2IoVk;!r7Yw0LsnV1`^v>wa7pP zD%RCeVN^*~QB6)gsNY%!!KjWGsUG10)M&pb5)k1RM5daONz?-;OwCO#NXf@YGS&~+ z({`RQKA-bn-qa`UP7!J%qmKKjC8eM5mjkP6>^r1-!rXk1Tx)-er}=KP7Atd!(uJau zqEF1~hB9IQ7)4rO8Z)yc7H&K#uj~_xq07tD-F3^~)+KdyuN9^`Ztbhvs`PpJ%SN|l z`212Qj=(z<_R3CN&iOeII(Trt)3PWni{gb&$emp)8V&6V@K-fyUPy}dtOgkl+9qsK zZ*vkhw(fE0o2x!{&q43O^wg!{U@#RS9g3gwS>DvmeMe(G0xidz-##M^L^S-A=WNc9 zH-F?#q$D7LT1y=c=O`=TEwtsCLDeaV?AA>};!q_4r{NI{USyd-e8SDH4j$l|0cfRH z8zXFuzDvc7HD0_>uc2PxY&oPo-}MCQt6R@JfuRq;qhZ3~T)oW_I;b`j$jb^eadXO< zLs2O`nPe8q_~2f-7tFos51e^3?(V_fG4|tzfl9*4PVi1-}0y zumVZ!ZF`zJEAh#0H1Nv&wj-mo=`&mdrPXp$G+`J+2N|YRA#qY+9Idy?0+UZ^Ae_`J z&XlV8R-@UFNcw9lLRanxfR(0;DxOJ1b68h#VeVe#wK1X2*je-f56Jd_5W$PFTuY+F zTKFjlyg1(^%8q1gDzZU^{+t=y$At`ml}PDNWOiH0a8r@3^0+}Jf@-79$nWxVO|eOH zy-Cb=@K0PL`^0^pL>%-r861t`q@{v+|HpJ!=>RzkF4}{1l$~@@j}^Q5KXRp3t6s3b zduFY6CowJ3#)3I-uInItU6@1BGpkmm>*pGFJnJcC2PwC4txM4>V)wpJCk=}Y{Jekv z5?z4M@Mx5v&*8aK1*a%*S@NIZO@9Tg;t}Rhq&SM>khf53)IZ{)ls}b7mg>%h68Ech z^N(F!P{|AltLJ-k)uf!@V=olfcsn-f@^*Em*1p!}Bd+n9zEsxs^46);$o4ASJ$}O1 z3G7$tbCs>mgZ4kVz=~|?;P}JzfRd5&my&LrQS$ix)vDn%im_OC#WybM1m+MDP@Eui zvlK(v_d*6Aq^tKH{97A;#eMRF4zzz~#{m?+buh8!+Yy+NrxOyh(uewzSwJL%sR=7b z@sYK@HS!0J=#?1_YP#uZ0Zn76wWw1_`pMN&YH|+i!@D-`|dt>sAbN`5q+N%s68Z}WnKHj($ z0^GDKF|JPT_Ge_$GdL@>{WQ#6#2i+nWF~vT_(83fHjIfEX>N9WSdhC+8vCDYheeCS zMK@8L@9VPX(9Xg;ti=KKK!{fuK<3?pw!EXMg$KWEeSi;c^0Y;17OQ5pL3QmyEP)WV z#=@z_34M*`=jWS5H+tJ5>ztf#w`1A$6xiGg7Vq|GvYggw>fKn zfHaq`dO3SNl$_l^Nr(?)FvLd8a3}7rP8;v-8k3+A-)M`=QM%fi)L-^ztI&Axu9mHF2S0&EGEwja6mKJGqLRid#;2GuEs!DKEWep*WQB%f0 zvH>56Yj#(e2D$uf{X)T`tg!uBgz#+)O;WynkEC$#Ay9<)L z^KOjzi6omRiln*Lw-3!G^W20T0ouqfle9n(qY zGb#sNc>ff&Ubz$=g*Q(zD43-GChJGcP6Xm`i8y9Yw&GcxC#!kduv^z%B1S6aN7rOq z7nkh1LqX7`3olc4w-o&GYy>VmPAuoYzX-lgt=T69k_~F^t7Lh9h`qOzYei3C=E6}&Z?{1MiL|Kgr4X^M@ z`Db!Qt^4)o-G@CJrsl7kM&`6V8qkkcp{6$OMcy^7A9}T|V;%9A{Whvyok8sy1OH~M ohmTro(S=}T Date: Sun, 3 Jan 2021 18:16:12 +0100 Subject: [PATCH 02/11] Inventory + Screwdriver support --- mods/ITEMS/mcl_chests/init.lua | 131 +++++++++++++++++++++++---------- 1 file changed, 92 insertions(+), 39 deletions(-) diff --git a/mods/ITEMS/mcl_chests/init.lua b/mods/ITEMS/mcl_chests/init.lua index fdfae533a..ff533ef5a 100644 --- a/mods/ITEMS/mcl_chests/init.lua +++ b/mods/ITEMS/mcl_chests/init.lua @@ -1,12 +1,6 @@ local S = minetest.get_translator("mcl_chests") local mod_doc = minetest.get_modpath("doc") -local no_rotate, simple_rotate -if minetest.get_modpath("screwdriver") then - no_rotate = screwdriver.disallow - simple_rotate = screwdriver.rotate_simple -end - -- Chest Entity local entity_animations = {} local entity_animation_speed = 25 @@ -35,7 +29,7 @@ minetest.register_entity("mcl_chests:chest", { pointable = false, physical = false, }, - + set_animation = function(self, animname) local anim = entity_animations[animname] self.object:set_animation(anim.bounds, entity_animation_speed, 0, false) @@ -44,7 +38,7 @@ minetest.register_entity("mcl_chests:chest", { self.sched_time = anim.sched_time end end, - + open = function(self, playername) self.players[playername] = true if not self.is_open then @@ -55,7 +49,7 @@ minetest.register_entity("mcl_chests:chest", { }) end end, - + close = function(self, playername) local playerlist = self.players playerlist[playername] = nil @@ -76,10 +70,18 @@ minetest.register_entity("mcl_chests:chest", { self.node_name = node_name local obj = self.object obj:set_properties({textures = textures}) - obj:set_yaw(minetest.dir_to_yaw(dir)) obj:set_properties({mesh = double and "mcl_chests_double_chest.b3d" or "mcl_chests_chest.b3d"}) + self:set_yaw(dir) end, - + + reinitialize = function(self, node_name) + self.node_name = node_name + end, + + set_yaw = function(self, dir) + self.object:set_yaw(minetest.dir_to_yaw(dir)) + end, + check = function(self) local node_pos, node_name = self.node_pos, self.node_name if not node_pos or not node_name then @@ -97,7 +99,7 @@ minetest.register_entity("mcl_chests:chest", { self:set_animation("closed") self.players = {} end, - + on_step = function(self, dtime) local sched_anim, sched_time = self.sched_anim, self.sched_time if not self:check() then @@ -149,6 +151,20 @@ local function find_or_create_entity(pos, node_name, textures, param2, double) return find_entity(entity_pos) or create_entity(pos, node_name, textures, param2, double, dir, entity_pos) end +local no_rotate, simple_rotate +if minetest.get_modpath("screwdriver") then + no_rotate = screwdriver.disallow + simple_rotate = function(pos, node, user, mode, new_param2) + 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):set_yaw(minetest.facedir_to_dir(new_param2)) + else + return false + end + end +end + --[[ List of open chests. Key: Player name Value: @@ -291,11 +307,34 @@ local on_chest_blast = function(pos) minetest.remove_node(pos) end -local small_name = "mcl_chests:"..basename +local small_name = "mcl_chests:"..basename.."_small" local small_textures = tiles_table.small local left_name = "mcl_chests:"..basename.."_left" local left_textures = tiles_table.double +minetest.register_node("mcl_chests:"..basename, { + description = desc, + _tt_help = tt_help, + _doc_items_longdesc = longdesc, + _doc_items_usagehelp = usagehelp, + _doc_items_hidden = hidden, + drawtype = "mesh", + mesh = "mcl_chests_chest.obj", + tiles = small_textures, + paramtype = "light", + paramtype2 = "facedir", + stack_max = 64, + sounds = mcl_sounds.node_sound_wood_defaults(), + on_construct = function(pos, node) + 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) + minetest.get_meta(pos):set_string("name", itemstack:get_meta():get_string("name")) + end, +}) + minetest.register_node(small_name, { description = desc, _tt_help = tt_help, @@ -311,7 +350,6 @@ minetest.register_node(small_name, { type = "fixed", fixed = {-0.4375, -0.5, -0.4375, 0.4375, 0.375, 0.4375}, }, - inventory_image = "mcl_chests_normal.png", tiles = {"blank.png"}, _chest_entity_textures = small_textures, paramtype = "light", @@ -346,18 +384,18 @@ minetest.register_node(small_name, { -- BEGIN OF LISTRING WORKAROUND inv:set_size("input", 1) -- END OF LISTRING WORKAROUND - if minetest.get_node(mcl_util.get_double_container_neighbor_pos(pos, param2, "right")).name == "mcl_chests:"..canonical_basename then + if minetest.get_node(mcl_util.get_double_container_neighbor_pos(pos, param2, "right")).name == "mcl_chests:"..canonical_basename.."_small" then 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) - elseif minetest.get_node(mcl_util.get_double_container_neighbor_pos(pos, param2, "left")).name == "mcl_chests:"..canonical_basename then + 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) 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, param2 = param2 }) + minetest.swap_node(pos, { name = "mcl_chests:"..canonical_basename.."_small", param2 = param2 }) create_entity(pos, small_name, small_textures, param2, false) end end, @@ -399,7 +437,7 @@ minetest.register_node(small_name, { if name == "" then name = S("Chest") end - + minetest.show_formspec(clicker:get_player_name(), "mcl_chests:"..canonical_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z, "size[9,8.75]".. @@ -417,7 +455,7 @@ minetest.register_node(small_name, { if on_rightclick_addendum then on_rightclick_addendum(pos, node, clicker) end - + player_chest_open(clicker, pos, small_name, small_textures, node.param2, false) end, @@ -435,11 +473,11 @@ minetest.register_node(left_name, { drawtype = "nodebox", selection_box = { type = "fixed", - fixed = {-0.4375, -0.5, -0.4375, 1.4375, 0.375, 0.4375}, + fixed = {-0.4375, -0.5, -0.4375, 0.5, 0.375, 0.4375}, }, collision_box = { type = "fixed", - fixed = {-0.4375, -0.5, -0.4375, 1.4375, 0.375, 0.4375}, + fixed = {-0.4375, -0.5, -0.4375, 0.5, 0.375, 0.4375}, }, tiles = {"blank.png"}, _chest_entity_textures = left_textures, @@ -454,7 +492,7 @@ minetest.register_node(left_name, { local param2 = n.param2 local p = mcl_util.get_double_container_neighbor_pos(pos, param2, "left") if not p or minetest.get_node(p).name ~= "mcl_chests:"..canonical_basename.."_right" then - n.name = "mcl_chests:"..canonical_basename + n.name = "mcl_chests:"..canonical_basename.."_small" minetest.swap_node(pos, n) end create_entity(pos, left_name, left_textures, param2, true) @@ -464,7 +502,7 @@ minetest.register_node(left_name, { end, on_destruct = function(pos) local n = minetest.get_node(pos) - if n.name == "mcl_chests:"..basename then + if n.name == small_name then return end @@ -481,8 +519,8 @@ minetest.register_node(left_name, { for pl=1, #players do minetest.close_formspec(players[pl]:get_player_name(), "mcl_chests:"..canonical_basename.."_"..p.x.."_"..p.y.."_"..p.z) end - minetest.swap_node(p, { name = "mcl_chests:"..basename, param2 = param2 }) - create_entity(p, "mcl_chests:"..basename, small_textures, param2, false) + minetest.swap_node(p, { name = small_name, param2 = param2 }) + create_entity(p, small_name, small_textures, param2, false) end, after_dig_node = drop_items_chest, on_blast = on_chest_blast, @@ -577,7 +615,7 @@ minetest.register_node(left_name, { if on_rightclick_addendum_left then on_rightclick_addendum_left(pos, node, clicker) end - + player_chest_open(clicker, pos, left_name, left_textures, node.param2, true) end, mesecons = mesecons, @@ -590,11 +628,11 @@ minetest.register_node("mcl_chests:"..basename.."_right", { paramtype2 = "facedir", selection_box = { type = "fixed", - fixed = {0, 0, 0, 0, 0, 0}, + fixed = {-0.5, -0.5, -0.4375, 0.4375, 0.375, 0.4375}, }, collision_box = { type = "fixed", - fixed = {0, 0, 0, 0, 0, 0}, + fixed = {-0.5, -0.5, -0.4375, 0.4375, 0.375, 0.4375}, }, groups = {handy=1,axey=1, container=6,not_in_creative_inventory=1, material_wood=1,flammable=-1,double_chest=2}, drop = drop, @@ -605,7 +643,7 @@ minetest.register_node("mcl_chests:"..basename.."_right", { local param2 = n.param2 local p = mcl_util.get_double_container_neighbor_pos(pos, param2, "right") if not p or minetest.get_node(p).name ~= "mcl_chests:"..canonical_basename.."_left" then - n.name = "mcl_chests:"..canonical_basename + n.name = "mcl_chests:"..canonical_basename.."_small" minetest.swap_node(pos, n) end end, @@ -614,7 +652,7 @@ minetest.register_node("mcl_chests:"..basename.."_right", { end, on_destruct = function(pos) local n = minetest.get_node(pos) - if n.name == "mcl_chests:"..basename then + if n.name == small_name then return end @@ -631,7 +669,8 @@ minetest.register_node("mcl_chests:"..basename.."_right", { for pl=1, #players do minetest.close_formspec(players[pl]:get_player_name(), "mcl_chests:"..canonical_basename.."_"..p.x.."_"..p.y.."_"..p.z) end - minetest.swap_node(p, { name = "mcl_chests:"..basename, param2 = param2 }) + minetest.swap_node(p, { name = small_name, param2 = param2 }) + create_entity(p, small_name, small_textures, param2, false) local meta = minetest.get_meta(pos) end, after_dig_node = drop_items_chest, @@ -728,7 +767,7 @@ minetest.register_node("mcl_chests:"..basename.."_right", { if on_rightclick_addendum_right then on_rightclick_addendum_right(pos, node, clicker) end - + player_chest_open(clicker, pos_other, left_name, left_textures, node.param2, true) end, mesecons = mesecons, @@ -736,8 +775,8 @@ minetest.register_node("mcl_chests:"..basename.."_right", { }) if mod_doc then - doc.add_entry_alias("nodes", "mcl_chests:"..basename, "nodes", "mcl_chests:"..basename.."_left") - doc.add_entry_alias("nodes", "mcl_chests:"..basename, "nodes", "mcl_chests:"..basename.."_right") + doc.add_entry_alias("nodes", small_name, "nodes", "mcl_chests:"..basename.."_left") + doc.add_entry_alias("nodes", small_name, "nodes", "mcl_chests:"..basename.."_right") end -- END OF register_chest FUNCTION BODY @@ -1182,16 +1221,30 @@ minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv end end) +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) +end + minetest.register_lbm({ label = "Spawn Chest entities", name = "mcl_chests:spawn_chest_entities", nodenames = {"group:chest_entity"}, run_at_every_load = true, + action = select_and_spawn_entity, +}) + +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"}, + run_at_every_load = false, action = function(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.name = node.name .. "_small" + minetest.set_node(pos, node) + select_and_spawn_entity(pos, node) end }) @@ -1201,7 +1254,7 @@ minetest.register_lbm({ -- Fixes redstone weirdness. label = "Disable active trapped chests", name = "mcl_chests:reset_trapped_chests", - nodenames = { "mcl_chests:trapped_chest_on", "mcl_chests:trapped_chest_on_left", "mcl_chests:trapped_chest_on_right" }, + nodenames = { "mcl_chests:trapped_chest_on_small", "mcl_chests:trapped_chest_on_left", "mcl_chests:trapped_chest_on_right" }, run_at_every_load = true, action = function(pos, node) minetest.log("action", "[mcl_chests] Disabled active trapped chest on load: " ..minetest.pos_to_string(pos)) From 978aa38196a5c29e1991b318d11cef3b65bc9586 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Sun, 3 Jan 2021 18:52:24 +0100 Subject: [PATCH 03/11] Trapped chests support --- mods/ITEMS/mcl_chests/init.lua | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/mods/ITEMS/mcl_chests/init.lua b/mods/ITEMS/mcl_chests/init.lua index ff533ef5a..d8ef0f188 100644 --- a/mods/ITEMS/mcl_chests/init.lua +++ b/mods/ITEMS/mcl_chests/init.lua @@ -69,8 +69,10 @@ minetest.register_entity("mcl_chests:chest", { self.node_pos = node_pos self.node_name = node_name local obj = self.object - obj:set_properties({textures = textures}) - obj:set_properties({mesh = double and "mcl_chests_double_chest.b3d" or "mcl_chests_chest.b3d"}) + obj:set_properties({ + textures = textures, + mesh = double and "mcl_chests_double_chest.b3d" or "mcl_chests_chest.b3d", + }) self:set_yaw(dir) end, @@ -204,11 +206,13 @@ local trapped_chest_mesecons_rules = mesecon.rules.pplate local chest_update_after_close = function(pos) local node = minetest.get_node(pos) - if node.name == "mcl_chests:trapped_chest_on" then - minetest.swap_node(pos, {name="mcl_chests:trapped_chest", param2 = node.param2}) + 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):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):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") @@ -220,6 +224,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):reinitialize("mcl_chests:trapped_chest_left") mesecon.receptor_off(pos_other, trapped_chest_mesecons_rules) end end @@ -831,7 +836,8 @@ register_chest("trapped_chest", rules = trapped_chest_mesecons_rules, }}, function(pos, node, clicker) - minetest.swap_node(pos, {name="mcl_chests:trapped_chest_on", param2 = node.param2}) + 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):reinitialize("mcl_chests:trapped_chest_on_small") mesecon.receptor_on(pos, trapped_chest_mesecons_rules) end, function(pos, node, clicker) @@ -839,6 +845,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):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") @@ -852,6 +859,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):reinitialize("mcl_chests:trapped_chest_on_left") mesecon.receptor_on(pos_other, trapped_chest_mesecons_rules) end ) @@ -870,13 +878,15 @@ register_chest("trapped_chest_on", local function close_if_trapped_chest(pos, player) local node = minetest.get_node(pos) - if node.name == "mcl_chests:trapped_chest_on" then - minetest.swap_node(pos, {name="mcl_chests:trapped_chest", param2 = node.param2}) + 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):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):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") @@ -890,6 +900,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):reinitialize("mcl_chests:trapped_chest_left") mesecon.receptor_off(pos_other, trapped_chest_mesecons_rules) player_chest_close(player) @@ -1242,9 +1253,14 @@ minetest.register_lbm({ nodenames = {"mcl_chests:chest", "mcl_chests:trapped_chest", "mcl_chests:trapped_chest_on"}, run_at_every_load = false, action = function(pos, node) - node.name = node.name .. "_small" + local node_name = node.name + node.name = node_name .. "_small" minetest.set_node(pos, node) select_and_spawn_entity(pos, node) + if node_name == "mcl_chests:trapped_chest_on" then + minetest.log("action", "[mcl_chests] Disabled active trapped chest on load: " ..minetest.pos_to_string(pos)) + chest_update_after_close(pos) + end end }) From 2d9ec679c0552ad0c21bc995742133aeda0b2d5a Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Sun, 3 Jan 2021 18:55:41 +0100 Subject: [PATCH 04/11] Fix floating chest entity --- mods/ITEMS/mcl_chests/init.lua | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/mods/ITEMS/mcl_chests/init.lua b/mods/ITEMS/mcl_chests/init.lua index d8ef0f188..0a5883f77 100644 --- a/mods/ITEMS/mcl_chests/init.lua +++ b/mods/ITEMS/mcl_chests/init.lua @@ -121,7 +121,7 @@ minetest.register_entity("mcl_chests:chest", { local function get_entity_pos(pos, dir, double) pos = vector.new(pos) - pos.y = pos.y - 0.4375 + pos.y = pos.y - 0.5 if double then local add, mul, vec, cross = vector.add, vector.multiply, vector.new, vector.cross pos = add(pos, mul(cross(dir, vec(0, 1, 0)), -0.5)) @@ -476,11 +476,7 @@ minetest.register_node(small_name, { minetest.register_node(left_name, { drawtype = "nodebox", - selection_box = { - type = "fixed", - fixed = {-0.4375, -0.5, -0.4375, 0.5, 0.375, 0.4375}, - }, - collision_box = { + node_box = { type = "fixed", fixed = {-0.4375, -0.5, -0.4375, 0.5, 0.375, 0.4375}, }, @@ -628,17 +624,14 @@ minetest.register_node(left_name, { }) minetest.register_node("mcl_chests:"..basename.."_right", { - drawtype = "airlike", + drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", - selection_box = { - type = "fixed", - fixed = {-0.5, -0.5, -0.4375, 0.4375, 0.375, 0.4375}, - }, - collision_box = { + node_box = { type = "fixed", fixed = {-0.5, -0.5, -0.4375, 0.4375, 0.375, 0.4375}, }, + tiles = {"blank.png"}, groups = {handy=1,axey=1, container=6,not_in_creative_inventory=1, material_wood=1,flammable=-1,double_chest=2}, drop = drop, is_ground_content = false, From 84cd8195c6dd8b7455e9420da4df187b67421a44 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Sun, 3 Jan 2021 19:05:07 +0100 Subject: [PATCH 05/11] Fix invalid migration of small chests --- mods/ITEMS/mcl_chests/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_chests/init.lua b/mods/ITEMS/mcl_chests/init.lua index 0a5883f77..cfeb6a682 100644 --- a/mods/ITEMS/mcl_chests/init.lua +++ b/mods/ITEMS/mcl_chests/init.lua @@ -1248,7 +1248,7 @@ minetest.register_lbm({ action = function(pos, node) local node_name = node.name node.name = node_name .. "_small" - minetest.set_node(pos, node) + minetest.swap_node(pos, node) select_and_spawn_entity(pos, node) if node_name == "mcl_chests:trapped_chest_on" then minetest.log("action", "[mcl_chests] Disabled active trapped chest on load: " ..minetest.pos_to_string(pos)) From 41a364b3199456ad239bdb9501cbe7f2e2fd176b Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Sun, 3 Jan 2021 20:08:53 +0100 Subject: [PATCH 06/11] Crack texture is now displayed --- mods/ITEMS/mcl_chests/init.lua | 14 +++++--------- .../mcl_chests/textures/mcl_chests_blank.png | Bin 0 -> 570 bytes 2 files changed, 5 insertions(+), 9 deletions(-) create mode 100644 mods/ITEMS/mcl_chests/textures/mcl_chests_blank.png diff --git a/mods/ITEMS/mcl_chests/init.lua b/mods/ITEMS/mcl_chests/init.lua index cfeb6a682..b4f8e5ae0 100644 --- a/mods/ITEMS/mcl_chests/init.lua +++ b/mods/ITEMS/mcl_chests/init.lua @@ -346,16 +346,12 @@ minetest.register_node(small_name, { _doc_items_longdesc = longdesc, _doc_items_usagehelp = usagehelp, _doc_items_hidden = hidden, - drawtype = "airlike", - selection_box = { + drawtype = "nodebox", + node_box = { type = "fixed", fixed = {-0.4375, -0.5, -0.4375, 0.4375, 0.375, 0.4375}, }, - collision_box = { - type = "fixed", - fixed = {-0.4375, -0.5, -0.4375, 0.4375, 0.375, 0.4375}, - }, - tiles = {"blank.png"}, + tiles = {"mcl_chests_blank.png"}, _chest_entity_textures = small_textures, paramtype = "light", paramtype2 = "facedir", @@ -480,7 +476,7 @@ minetest.register_node(left_name, { type = "fixed", fixed = {-0.4375, -0.5, -0.4375, 0.5, 0.375, 0.4375}, }, - tiles = {"blank.png"}, + tiles = {"mcl_chests_blank.png"}, _chest_entity_textures = left_textures, paramtype = "light", paramtype2 = "facedir", @@ -631,7 +627,7 @@ minetest.register_node("mcl_chests:"..basename.."_right", { type = "fixed", fixed = {-0.5, -0.5, -0.4375, 0.4375, 0.375, 0.4375}, }, - tiles = {"blank.png"}, + tiles = {"mcl_chests_blank.png"}, groups = {handy=1,axey=1, container=6,not_in_creative_inventory=1, material_wood=1,flammable=-1,double_chest=2}, drop = drop, is_ground_content = false, diff --git a/mods/ITEMS/mcl_chests/textures/mcl_chests_blank.png b/mods/ITEMS/mcl_chests/textures/mcl_chests_blank.png new file mode 100644 index 0000000000000000000000000000000000000000..baee128d431db678799b44e683939c65a391d717 GIT binary patch literal 570 zcmV-A0>%A_P)EX>4Tx04R}tkv&MmP!xqvQ;Q-MhjtKg$WWauNELC^DionYs1;guFnQ@8G-*gu zTpR`0f`dPcRRQHpmtPfoUlBkM5rmMCnPtpLQX0PXbx++?cX6KO-}h$?s0E7w0g-r?8KzCVK|H-_ z8=UuvqpU2e#OK80CS8#Dk?V@bZ=6dm3p_JwW;64|QDU*w#Yz{mvZ)bI5yw=bb>jVfs16O*-Uuyz0pQJZB zTI>iI+y*YLJDRcwT zjFl*R-RIqX-E;f5r#-(PFD!D5_eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{000t6L_t(I%VS^|1*2dTi~T%77XSbN literal 0 HcmV?d00001 From ce4e86549bf180826546a5bb28c83f1148a7eb57 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Mon, 4 Jan 2021 11:26:07 +0100 Subject: [PATCH 07/11] Enderchest Support --- mods/ITEMS/mcl_chests/init.lua | 136 +++++++++++------- ..._chest.b3d => mcl_chests_chest_double.b3d} | Bin mods/ITEMS/mcl_chests/sounds/attributions.txt | 2 + .../sounds/mcl_chests_enderchest_close.ogg | Bin 0 -> 17310 bytes .../sounds/mcl_chests_enderchest_open.ogg | Bin 0 -> 14882 bytes 5 files changed, 88 insertions(+), 50 deletions(-) rename mods/ITEMS/mcl_chests/models/{mcl_chests_double_chest.b3d => mcl_chests_chest_double.b3d} (100%) create mode 100644 mods/ITEMS/mcl_chests/sounds/attributions.txt create mode 100644 mods/ITEMS/mcl_chests/sounds/mcl_chests_enderchest_close.ogg create mode 100644 mods/ITEMS/mcl_chests/sounds/mcl_chests_enderchest_open.ogg diff --git a/mods/ITEMS/mcl_chests/init.lua b/mods/ITEMS/mcl_chests/init.lua index b4f8e5ae0..ecd21cba0 100644 --- a/mods/ITEMS/mcl_chests/init.lua +++ b/mods/ITEMS/mcl_chests/init.lua @@ -44,7 +44,7 @@ minetest.register_entity("mcl_chests:chest", { if not self.is_open then self.is_open = true self:set_animation("open") - minetest.sound_play("default_chest_open", { + minetest.sound_play(self.sound_prefix .. "_open", { pos = self.node_pos, }) end @@ -59,19 +59,20 @@ minetest.register_entity("mcl_chests:chest", { end self.is_open = false self:set_animation("close") - minetest.sound_play("default_chest_close", { + minetest.sound_play(self.sound_prefix .. "_close", { pos = self.node_pos, }) end end, - initialize = function(self, node_pos, node_name, textures, dir, double) + initialize = function(self, node_pos, node_name, textures, dir, double, sound_prefix, mesh_prefix) self.node_pos = node_pos self.node_name = node_name + self.sound_prefix = sound_prefix local obj = self.object obj:set_properties({ textures = textures, - mesh = double and "mcl_chests_double_chest.b3d" or "mcl_chests_chest.b3d", + mesh = mesh_prefix .. (double and "_double" or "") .. ".b3d", }) self:set_yaw(dir) end, @@ -138,19 +139,19 @@ local function find_entity(pos) end end -local function create_entity(pos, node_name, textures, param2, double, dir, entity_pos) +local function create_entity(pos, node_name, textures, param2, double, sound_prefix, mesh_prefix, dir, entity_pos) dir = dir or minetest.facedir_to_dir(param2) entity_pos = entity_pos or get_entity_pos(pos, dir, double) local obj = minetest.add_entity(entity_pos, "mcl_chests:chest") local luaentity = obj:get_luaentity() - luaentity:initialize(pos, node_name, textures, dir, double) + luaentity:initialize(pos, node_name, textures, dir, double, sound_prefix, mesh_prefix) return luaentity end -local function find_or_create_entity(pos, node_name, textures, param2, double) +local function find_or_create_entity(pos, node_name, textures, param2, double, sound_prefix, mesh_prefix) local dir = 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, dir, entity_pos) + return find_entity(entity_pos) or create_entity(pos, node_name, textures, param2, double, sound_prefix, mesh_prefix, dir, entity_pos) end local no_rotate, simple_rotate @@ -160,7 +161,7 @@ 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):set_yaw(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):set_yaw(minetest.facedir_to_dir(new_param2)) else return false end @@ -174,10 +175,10 @@ Value: Otherwise: nil ]] local open_chests = {} -- To be called if a player opened a chest -local player_chest_open = function(player, pos, node_name, textures, param2, double) +local player_chest_open = function(player, pos, node_name, textures, param2, double, sound, mesh) local name = player:get_player_name() - open_chests[name] = {pos = pos, node_name = node_name, textures = textures, param2 = param2, double = double} - find_or_create_entity(pos, node_name, textures, param2, double):open(name) + open_chests[name] = {pos = pos, node_name = node_name, textures = textures, param2 = param2, double = double, sound = sound, mesh = mesh} + find_or_create_entity(pos, node_name, textures, param2, double, sound, mesh):open(name) end -- Simple protection checking functions @@ -208,11 +209,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):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"):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):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"):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") @@ -224,7 +225,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):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"):reinitialize("mcl_chests:trapped_chest_left") mesecon.receptor_off(pos_other, trapped_chest_mesecons_rules) end end @@ -236,7 +237,7 @@ local player_chest_close = function(player) if open_chest == nil then return end - find_or_create_entity(open_chest.pos, open_chest.node_name, open_chest.textures, open_chest.param2, open_chest.double):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):close(name) chest_update_after_close(open_chest.pos) open_chests[name] = nil @@ -330,6 +331,7 @@ minetest.register_node("mcl_chests:"..basename, { paramtype2 = "facedir", stack_max = 64, sounds = mcl_sounds.node_sound_wood_defaults(), + groups = {deco_block=1}, on_construct = function(pos, node) local node = minetest.get_node(pos) node.name = small_name @@ -353,11 +355,13 @@ minetest.register_node(small_name, { }, tiles = {"mcl_chests_blank.png"}, _chest_entity_textures = small_textures, + _chest_entity_sound = "default_chest", + _chest_entity_mesh = "mcl_chests_chest", paramtype = "light", paramtype2 = "facedir", stack_max = 64, drop = drop, - groups = {handy=1,axey=1, container=2, deco_block=1, material_wood=1,flammable=-1,chest_entity=1}, + groups = {handy=1,axey=1, container=2, deco_block=1, material_wood=1,flammable=-1,chest_entity=1, not_in_creative_inventory=1}, is_ground_content = false, sounds = mcl_sounds.node_sound_wood_defaults(), on_construct = function(pos) @@ -389,15 +393,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) + create_entity(p, "mcl_chests:"..canonical_basename.."_left", left_textures, param2, true, "default_chest", "mcl_chests_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) + create_entity(pos, "mcl_chests:"..canonical_basename.."_left", left_textures, param2, true, "default_chest", "mcl_chests_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) + create_entity(pos, small_name, small_textures, param2, false, "default_chest", "mcl_chests_chest") end end, after_place_node = function(pos, placer, itemstack, pointed_thing) @@ -457,7 +461,7 @@ minetest.register_node(small_name, { on_rightclick_addendum(pos, node, clicker) end - player_chest_open(clicker, pos, small_name, small_textures, node.param2, false) + player_chest_open(clicker, pos, small_name, small_textures, node.param2, false, "default_chest", "mcl_chests_chest") end, on_destruct = function(pos) @@ -478,6 +482,8 @@ minetest.register_node(left_name, { }, tiles = {"mcl_chests_blank.png"}, _chest_entity_textures = left_textures, + _chest_entity_sound = "default_chest", + _chest_entity_mesh = "mcl_chests_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}, @@ -492,7 +498,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) + create_entity(pos, left_name, left_textures, param2, true, "default_chest", "mcl_chests_chest") end, after_place_node = function(pos, placer, itemstack, pointed_thing) minetest.get_meta(pos):set_string("name", itemstack:get_meta():get_string("name")) @@ -517,7 +523,7 @@ minetest.register_node(left_name, { minetest.close_formspec(players[pl]:get_player_name(), "mcl_chests:"..canonical_basename.."_"..p.x.."_"..p.y.."_"..p.z) end minetest.swap_node(p, { name = small_name, param2 = param2 }) - create_entity(p, small_name, small_textures, param2, false) + create_entity(p, small_name, small_textures, param2, false, "default_chest", "mcl_chests_chest") end, after_dig_node = drop_items_chest, on_blast = on_chest_blast, @@ -613,7 +619,7 @@ minetest.register_node(left_name, { on_rightclick_addendum_left(pos, node, clicker) end - player_chest_open(clicker, pos, left_name, left_textures, node.param2, true) + player_chest_open(clicker, pos, left_name, left_textures, node.param2, true, "default_chest", "mcl_chests_chest") end, mesecons = mesecons, on_rotate = no_rotate, @@ -664,7 +670,7 @@ minetest.register_node("mcl_chests:"..basename.."_right", { minetest.close_formspec(players[pl]:get_player_name(), "mcl_chests:"..canonical_basename.."_"..p.x.."_"..p.y.."_"..p.z) end minetest.swap_node(p, { name = small_name, param2 = param2 }) - create_entity(p, small_name, small_textures, param2, false) + create_entity(p, small_name, small_textures, param2, false, "default_chest", "mcl_chests_chest") local meta = minetest.get_meta(pos) end, after_dig_node = drop_items_chest, @@ -762,7 +768,7 @@ minetest.register_node("mcl_chests:"..basename.."_right", { on_rightclick_addendum_right(pos, node, clicker) end - player_chest_open(clicker, pos_other, left_name, left_textures, node.param2, true) + player_chest_open(clicker, pos_other, left_name, left_textures, node.param2, true, "default_chest", "mcl_chests_chest") end, mesecons = mesecons, on_rotate = no_rotate, @@ -826,7 +832,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):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"):reinitialize("mcl_chests:trapped_chest_on_small") mesecon.receptor_on(pos, trapped_chest_mesecons_rules) end, function(pos, node, clicker) @@ -834,7 +840,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):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"):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") @@ -848,7 +854,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):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"):reinitialize("mcl_chests:trapped_chest_on_left") mesecon.receptor_on(pos_other, trapped_chest_mesecons_rules) end ) @@ -869,13 +875,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):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"):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):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"):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") @@ -889,7 +895,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):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"):reinitialize("mcl_chests:trapped_chest_left") mesecon.receptor_off(pos_other, trapped_chest_mesecons_rules) player_chest_close(player) @@ -930,6 +936,26 @@ minetest.register_craft({ burntime = 15 }) +minetest.register_node("mcl_chests:ender_chest", { + description = S("Ender Chest"), + _tt_help = S("27 interdimensional inventory slots") .. "\n" .. S("Put items inside, retrieve them from any ender chest"), + _doc_items_longdesc = S("Ender chests grant you access to a single personal interdimensional inventory with 27 slots. This inventory is the same no matter from which ender chest you access it from. If you put one item into one ender chest, you will find it in all other ender chests. Each player will only see their own items, but not the items of other players."), + _doc_items_usagehelp = S("Rightclick the ender chest to access your personal interdimensional inventory."), + drawtype = "mesh", + mesh = "mcl_chests_chest.obj", + tiles = {"mcl_chests_ender.png"}, + paramtype = "light", + paramtype2 = "facedir", + stack_max = 64, + groups = {deco_block=1}, + sounds = mcl_sounds.node_sound_stone_defaults(), + on_construct = function(pos, node) + local node = minetest.get_node(pos) + node.name = "mcl_chests:ender_chest_small" + minetest.set_node(pos, node) + end, +}) + local formspec_ender_chest = "size[9,8.75]".. "label[0,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Ender Chest"))).."]".. "list[current_player;enderchest;0,0.5;9,3;]".. @@ -943,17 +969,26 @@ local formspec_ender_chest = "size[9,8.75]".. "listring[current_player;main]" -minetest.register_node("mcl_chests:ender_chest", { +minetest.register_node("mcl_chests:ender_chest_small", { description = S("Ender Chest"), _tt_help = S("27 interdimensional inventory slots") .. "\n" .. S("Put items inside, retrieve them from any ender chest"), _doc_items_longdesc = S("Ender chests grant you access to a single personal interdimensional inventory with 27 slots. This inventory is the same no matter from which ender chest you access it from. If you put one item into one ender chest, you will find it in all other ender chests. Each player will only see their own items, but not the items of other players."), _doc_items_usagehelp = S("Rightclick the ender chest to access your personal interdimensional inventory."), - tiles = {"mcl_chests_ender_chest_top.png", "mcl_chests_ender_chest_bottom.png", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = {-0.4375, -0.5, -0.4375, 0.5, 0.375, 0.4375}, + }, + _chest_entity_textures = {"mcl_chests_ender.png"}, + _chest_entity_sound = "mcl_chests_enderchest", + _chest_entity_mesh = "mcl_chests_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", - "mcl_chests_ender_chest_back.png", "mcl_chests_ender_chest_front.png"}, + "mcl_chests_ender_chest_back.png", "mcl_chests_ender_chest_front.png"},]]-- -- Note: The “container” group is missing here because the ender chest does not -- have an inventory on its own - groups = {pickaxey=1, deco_block=1, material_stone=1}, + groups = {pickaxey=1, deco_block=1, material_stone=1, chest_entity=1, not_in_creative_inventory=1}, is_ground_content = false, paramtype = "light", light_source = 7, @@ -963,10 +998,19 @@ minetest.register_node("mcl_chests:ender_chest", { 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") + 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") + end, + on_receive_fields = function(pos, formname, fields, sender) + if fields.quit then + player_chest_close(sender) + end end, _mcl_blast_resistance = 3000, _mcl_hardness = 22.5, - _mcl_silk_touch_drop = true, + _mcl_silk_touch_drop = {"mcl_chests:ender_chest"}, on_rotate = simple_rotate, }) @@ -1225,7 +1269,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) + create_entity(pos, node_name, node_def._chest_entity_textures, node.param2, double_chest, node_def._chest_entity_sound, node_def._chest_entity_mesh) end minetest.register_lbm({ @@ -1239,7 +1283,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"}, + nodenames = {"mcl_chests:chest", "mcl_chests:trapped_chest", "mcl_chests:trapped_chest_on", "mcl_chests:ender_chest"}, run_at_every_load = false, action = function(pos, node) local node_name = node.name @@ -1249,6 +1293,9 @@ minetest.register_lbm({ if node_name == "mcl_chests:trapped_chest_on" then minetest.log("action", "[mcl_chests] Disabled active trapped chest on load: " ..minetest.pos_to_string(pos)) chest_update_after_close(pos) + elseif node_name == "mcl_chests:ender_chest" then + local meta = minetest.get_meta(pos) + meta:set_string("formspec", formspec_ender_chest) end end }) @@ -1267,17 +1314,6 @@ minetest.register_lbm({ end, }) --- Legacy -minetest.register_lbm({ - label = "Update ender chest formspecs (0.60.0)", - name = "mcl_chests:update_ender_chest_formspecs_0_60_0", - nodenames = { "mcl_chests:ender_chest" }, - run_at_every_load = false, - action = function(pos, node) - local meta = minetest.get_meta(pos) - meta:set_string("formspec", formspec_ender_chest) - end, -}) minetest.register_lbm({ label = "Update shulker box formspecs (0.60.0)", name = "mcl_chests:update_shulker_box_formspecs_0_60_0", diff --git a/mods/ITEMS/mcl_chests/models/mcl_chests_double_chest.b3d b/mods/ITEMS/mcl_chests/models/mcl_chests_chest_double.b3d similarity index 100% rename from mods/ITEMS/mcl_chests/models/mcl_chests_double_chest.b3d rename to mods/ITEMS/mcl_chests/models/mcl_chests_chest_double.b3d diff --git a/mods/ITEMS/mcl_chests/sounds/attributions.txt b/mods/ITEMS/mcl_chests/sounds/attributions.txt new file mode 100644 index 000000000..2943aecc0 --- /dev/null +++ b/mods/ITEMS/mcl_chests/sounds/attributions.txt @@ -0,0 +1,2 @@ +default_chest_open and default_chest_close - Taken from minetest_game https://github.com/minetest/minetest_game +mcl_chests_enderchest_open and mcl_chests_enderchest_close - https://www.minecraftforum.net/forums/mapping-and-modding-java-edition/resource-packs/1245112-snowsong-the-epic-sound-pack-sound-resource-pack diff --git a/mods/ITEMS/mcl_chests/sounds/mcl_chests_enderchest_close.ogg b/mods/ITEMS/mcl_chests/sounds/mcl_chests_enderchest_close.ogg new file mode 100644 index 0000000000000000000000000000000000000000..7ecf4c98d6c16864eaf0bb1284a22cafa11e4d97 GIT binary patch literal 17310 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 literal 0 HcmV?d00001 From e26a644df06fbc97d57d11ac209e72ee2e984fbb Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Mon, 4 Jan 2021 17:02:36 +0100 Subject: [PATCH 08/11] Fix ender chest migration --- mods/ITEMS/mcl_chests/init.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_chests/init.lua b/mods/ITEMS/mcl_chests/init.lua index ecd21cba0..6932be9e4 100644 --- a/mods/ITEMS/mcl_chests/init.lua +++ b/mods/ITEMS/mcl_chests/init.lua @@ -1015,9 +1015,9 @@ minetest.register_node("mcl_chests:ender_chest_small", { }) minetest.register_lbm({ - label = "Update ender chest + shulker box formspecs (0.51.0)", + label = "Update shulker box formspecs (0.51.0)", name = "mcl_chests:update_formspecs_0_51_0", - nodenames = { "mcl_chests:ender_chest", "group:shulker_box" }, + 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)) From de810cee81b29de3ac65ecccc0c669f6ecea02fb Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Mon, 4 Jan 2021 17:10:07 +0100 Subject: [PATCH 09/11] Fix chest migration in general --- mods/ITEMS/mcl_chests/init.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_chests/init.lua b/mods/ITEMS/mcl_chests/init.lua index 6932be9e4..bb0206cc4 100644 --- a/mods/ITEMS/mcl_chests/init.lua +++ b/mods/ITEMS/mcl_chests/init.lua @@ -1269,7 +1269,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) + find_or_create_entity(pos, node_name, node_def._chest_entity_textures, node.param2, double_chest, node_def._chest_entity_sound, node_def._chest_entity_mesh) end minetest.register_lbm({ @@ -1284,7 +1284,7 @@ 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"}, - run_at_every_load = false, + run_at_every_load = true, action = function(pos, node) local node_name = node.name node.name = node_name .. "_small" From 17ff0c9be5b16c99aa26f8c9b8207a5c74edb609 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Mon, 4 Jan 2021 17:14:51 +0100 Subject: [PATCH 10/11] No static_save for chest entities --- mods/ITEMS/mcl_chests/init.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/mods/ITEMS/mcl_chests/init.lua b/mods/ITEMS/mcl_chests/init.lua index bb0206cc4..ebe7a0611 100644 --- a/mods/ITEMS/mcl_chests/init.lua +++ b/mods/ITEMS/mcl_chests/init.lua @@ -28,6 +28,7 @@ minetest.register_entity("mcl_chests:chest", { visual_size = {x = 3, y = 3}, pointable = false, physical = false, + static_save = false, }, set_animation = function(self, animname) From 378dca593e9d60f9a30af8d198a4b0ed7c75163b Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Mon, 4 Jan 2021 17:16:48 +0100 Subject: [PATCH 11/11] Always create chest entities --- mods/ITEMS/mcl_chests/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_chests/init.lua b/mods/ITEMS/mcl_chests/init.lua index ebe7a0611..e7609bef1 100644 --- a/mods/ITEMS/mcl_chests/init.lua +++ b/mods/ITEMS/mcl_chests/init.lua @@ -1270,7 +1270,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 - find_or_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) end minetest.register_lbm({