From 011ad78b42146725d93761473c7fd06698b2ca73 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Sun, 17 Jan 2016 15:32:50 -0800 Subject: [PATCH] Improve Chest appearance - opening chests. Adds a mesh model that appears when a chest is opened. The chest stays visibly open as long as the player keeps it open. When the player closes the formspec, the chest returns back to the closed shape. While opening and closing, a sound plays. A second person inspecting the chest will trigger a second sound open. However, only after the last player closes the chest, does the chest actually visually close and is the sound close played. This keeps mesh updates to a minimum. While it's possible that a server shutting down may cause chests to remain open, this does not affect the chests' working matter, and opening or closing them should fix them. Old chests are converted to the new style by LBM. I previously had them converted on open but this was unreliable, and LBMs don't have that problem. Open chests cannot be dug up. This prevents people from keeping a chest open and digging it out as well, since closing a chest would place a chest back (swap) at the spot. We could protect against this, but it still messes up the client and causes a lot of "missing node inventory" error messages otherwise. It's unlikely but possible that a player lagging out causes a chest to stay "open" and thus unremovable by digging, but there are other ways of dealing with that - a server restart fixes that issue. If the lid of the chest is obstructed, the sounds continue to play, but the lid isn't opened. Obstructed means that a node is present above the chest lid, however, we ignore several node types like signs, torches (not 3d) and wallmounted nodeboxes (typically signs) since they don't pose any major obstruction in almost any case, and are typically found above chests. Additionally, the selection box of the opened chest does not include the lid, and so one can still interact with e.g. a sign behind an open lid. Due to the fact that chests now have 7+ textures, we can no longer use materials (limit: 6) to texture the chest, and so there is now a single UV mapped image that applies both to open and closed chests. While this does mean texture pack makers need to create it, this is extremely simple and consists of a simple cut'n'paste over the template and should be really easy to do. Only one texture file is now then used for both open and closed chests. --- mods/default/README.txt | 13 + mods/default/models/chest_open.obj | 82 ++++ mods/default/models/cube.obj | 38 ++ mods/default/nodes.lua | 390 +++++++++++------- mods/default/sounds/default_chest_close.ogg | Bin 0 -> 10099 bytes mods/default/sounds/default_chest_open.ogg | Bin 0 -> 10578 bytes mods/default/textures/default_chest_front.png | Bin 423 -> 0 bytes mods/default/textures/default_chest_lock.png | Bin 469 -> 0 bytes mods/default/textures/default_chest_side.png | Bin 375 -> 0 bytes mods/default/textures/default_chest_top.png | Bin 422 -> 0 bytes mods/default/textures/default_chest_wood.png | Bin 0 -> 2320 bytes .../textures/default_chest_wood_locked.png | Bin 0 -> 2418 bytes 12 files changed, 372 insertions(+), 151 deletions(-) create mode 100644 mods/default/models/chest_open.obj create mode 100644 mods/default/models/cube.obj create mode 100644 mods/default/sounds/default_chest_close.ogg create mode 100644 mods/default/sounds/default_chest_open.ogg delete mode 100644 mods/default/textures/default_chest_front.png delete mode 100644 mods/default/textures/default_chest_lock.png delete mode 100644 mods/default/textures/default_chest_side.png delete mode 100644 mods/default/textures/default_chest_top.png create mode 100644 mods/default/textures/default_chest_wood.png create mode 100644 mods/default/textures/default_chest_wood_locked.png diff --git a/mods/default/README.txt b/mods/default/README.txt index 8d1357c..8e8541c 100644 --- a/mods/default/README.txt +++ b/mods/default/README.txt @@ -154,6 +154,9 @@ sofar (CC BY-SA 3.0): default_aspen_tree default_aspen_tree_top, derived from default_pine_tree_top (by paramat) default_aspen_wood, derived from default_pine_wood (by paramat) + default_chest_wood, default_chest_wood_locked derived from default_chest_* textures by BlockMen + +sofar (WTFPL): default_gravel.png -- Derived from Gambit's PixelBOX texture pack light gravel Neuromancer (CC BY-SA 2.0): @@ -285,3 +288,13 @@ https://www.freesound.org/people/AGFX/packs/1253/ blukotek (CC0 1.0) https://www.freesound.org/people/blukotek/sounds/251660/ default_dig_snappy.ogg + +Chests sounds added by sofar, derived of several files mixed together: + default_chest_open.ogg + default_chest_close.ogg + - http://www.freesound.org/people/Sevin7/sounds/269722/ CC0 + - http://www.freesound.org/people/Percy%20Duke/sounds/23448/ CC-BY-3.0 + - http://www.freesound.org/people/kingsamas/sounds/135576/ CC-BY-3.0 + - http://www.freesound.org/people/bulbastre/sounds/126887/ CC-BY-3.0 + - http://www.freesound.org/people/Yoyodaman234/sounds/183541/ CC0 + diff --git a/mods/default/models/chest_open.obj b/mods/default/models/chest_open.obj new file mode 100644 index 0000000..a1dcce8 --- /dev/null +++ b/mods/default/models/chest_open.obj @@ -0,0 +1,82 @@ +# Blender v2.76 (sub 0) OBJ File: 'chest_open.blend' +# www.blender.org +mtllib chest_open.mtl +o Bottom_Cube.001 +v -0.500000 -0.500000 0.500000 +v -0.500000 0.187500 0.500000 +v -0.500000 -0.500000 -0.500000 +v -0.500000 0.187500 -0.500000 +v 0.500000 -0.500000 0.500000 +v 0.500000 0.187500 0.500000 +v 0.500000 -0.500000 -0.500000 +v 0.500000 0.187500 -0.500000 +vt 0.750000 0.343750 +vt 0.500000 0.343750 +vt 0.500000 0.000000 +vt 0.750000 0.000000 +vt 0.250000 0.343750 +vt 0.250000 0.000000 +vt 0.000000 0.343750 +vt 0.000000 0.000000 +vt 0.750000 0.875000 +vt 0.500000 0.875000 +vt 0.500000 0.500000 +vt 0.750000 0.500000 +vt 0.250000 0.500000 +vt 0.250000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.500000 +vt 1.000000 0.500000 +vt 1.000000 0.000000 +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 2/1/1 4/2/1 3/3/1 1/4/1 +f 4/2/2 8/5/2 7/6/2 3/3/2 +f 8/5/3 6/7/3 5/8/3 7/6/3 +f 6/9/4 2/10/4 1/11/4 5/12/4 +f 1/13/5 3/14/5 7/15/5 5/16/5 +f 6/4/6 8/12/6 4/17/6 2/18/6 +o Top_Cube.002 +v -0.499900 0.187501 0.499900 +v -0.499900 0.408471 0.720970 +v -0.499900 0.894607 -0.207108 +v -0.499900 1.115578 0.013863 +v 0.499900 0.187501 0.499900 +v 0.499900 0.408471 0.720970 +v 0.499900 0.894607 -0.207108 +v 0.499900 1.115578 0.013863 +vt 0.750000 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.343750 +vt 0.750000 0.343750 +vt 0.250000 0.500000 +vt 0.250000 0.343750 +vt 0.000000 0.500000 +vt 0.000000 0.343750 +vt 0.750000 1.000000 +vt 0.500000 1.000000 +vt 0.500000 0.843750 +vt 0.750000 0.843750 +vt 1.000000 0.500000 +vt 1.000000 1.000000 +vt 0.250000 1.000000 +vn -1.000000 0.000000 0.000000 +vn 0.000000 0.707100 -0.707100 +vn 1.000000 0.000000 0.000000 +vn 0.000000 -0.707100 0.707100 +vn 0.000000 -0.707100 -0.707100 +vn 0.000000 0.707100 0.707100 +usemtl None +s off +f 10/19/7 12/20/7 11/21/7 9/22/7 +f 12/20/8 16/23/8 15/24/8 11/21/8 +f 16/23/9 14/25/9 13/26/9 15/24/9 +f 14/27/10 10/28/10 9/29/10 13/30/10 +f 9/31/11 11/32/11 15/27/11 13/19/11 +f 14/33/12 16/23/12 12/20/12 10/28/12 diff --git a/mods/default/models/cube.obj b/mods/default/models/cube.obj new file mode 100644 index 0000000..7bbec5d --- /dev/null +++ b/mods/default/models/cube.obj @@ -0,0 +1,38 @@ +# Blender v2.76 (sub 0) OBJ File: 'chest_close.blend' +# www.blender.org +mtllib chest_close.mtl +o Cube_Cube.001 +v -0.500000 -0.500000 0.500000 +v -0.500000 0.500000 0.500000 +v -0.500000 -0.500000 -0.500000 +v -0.500000 0.500000 -0.500000 +v 0.500000 -0.500000 0.500000 +v 0.500000 0.500000 0.500000 +v 0.500000 -0.500000 -0.500000 +v 0.500000 0.500000 -0.500000 +vt 0.750000 0.500000 +vt 0.500000 0.500000 +vt 0.500000 -0.000000 +vt 0.750000 0.000000 +vt 0.250000 0.500000 +vt 0.250000 0.000000 +vt 0.000000 0.500000 +vt -0.000000 0.000000 +vt 0.750000 1.000000 +vt 0.500000 1.000000 +vt 0.250000 1.000000 +vt -0.000000 1.000000 +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 2/1/1 4/2/1 3/3/1 1/4/1 +f 4/2/2 8/5/2 7/6/2 3/3/2 +f 8/5/3 6/7/3 5/8/3 7/6/3 +f 6/9/4 2/10/4 1/2/4 5/1/4 +f 1/5/5 3/11/5 7/12/5 5/7/5 +f 6/11/6 8/5/6 4/2/6 2/10/6 diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index facb28e..c410b21 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -1766,188 +1766,276 @@ minetest.register_node("default:lava_flowing", { -- Tools / "Advanced" crafting / Non-"natural" -- -local chest_formspec = - "size[8,9]" .. - default.gui_bg .. - default.gui_bg_img .. - default.gui_slots .. - "list[current_name;main;0,0.3;8,4;]" .. - "list[current_player;main;0,4.85;8,1;]" .. - "list[current_player;main;0,6.08;8,3;8]" .. - "listring[current_name;main]" .. - "listring[current_player;main]" .. - default.get_hotbar_bg(0,4.85) - -local function get_locked_chest_formspec(pos) +local function get_chest_formspec(pos) local spos = pos.x .. "," .. pos.y .. "," .. pos.z local formspec = "size[8,9]" .. default.gui_bg .. default.gui_bg_img .. default.gui_slots .. - "list[nodemeta:" .. spos .. ";main;0,0.3;8,4;]" .. + "list[nodemeta:" .. spos .. ";default:chest;0,0.3;8,4;]" .. "list[current_player;main;0,4.85;8,1;]" .. "list[current_player;main;0,6.08;8,3;8]" .. - "listring[nodemeta:" .. spos .. ";main]" .. + "listring[nodemeta:" .. spos .. ";default:chest]" .. "listring[current_player;main]" .. default.get_hotbar_bg(0,4.85) - return formspec + return formspec end -minetest.register_node("default:chest", { - description = "Chest", - tiles = {"default_chest_top.png", "default_chest_top.png", "default_chest_side.png", - "default_chest_side.png", "default_chest_side.png", "default_chest_front.png"}, - paramtype2 = "facedir", - groups = {choppy = 2, oddly_breakable_by_hand = 2}, - legacy_facedir_simple = true, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), +local function chest_lid_obstructed(pos) + local above = { x = pos.x, y = pos.y + 1, z = pos.z } + local def = minetest.registered_nodes[minetest.get_node(above).name] + -- allow ladders, signs, wallmounted things and torches to not obstruct + if def.drawtype == "airlike" or + def.drawtype == "signlike" or + def.drawtype == "torchlike" or + (def.drawtype == "nodebox" and def.paramtype2 == "wallmounted") then + return false + end + return true +end - on_construct = function(pos) - local meta = minetest.get_meta(pos) - meta:set_string("formspec", chest_formspec) - local inv = meta:get_inventory() - inv:set_size("main", 8*4) - end, - can_dig = function(pos,player) - local meta = minetest.get_meta(pos); - local inv = meta:get_inventory() - return inv:is_empty("main") - end, - on_metadata_inventory_move = function(pos, from_list, from_index, +local open_chests = {} + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname ~= "default:chest" then + return + end + if not fields.quit then + return + end + local pn = player:get_player_name() + + local pos = open_chests[pn].pos + local sound = open_chests[pn].sound + local swap = open_chests[pn].swap + local node = minetest.get_node(pos) + + open_chests[pn] = nil + for k, v in pairs(open_chests) do + if v.pos.x == pos.x and v.pos.y == pos.y and v.pos.z == pos.z then + return true + end + end + minetest.after(0.2, minetest.swap_node, pos, { name = "default:" .. swap, + param2 = node.param2 }) + minetest.sound_play(sound, {gain = 0.3, pos = pos, max_hear_distance = 10}) + return true +end) + +function default.register_chest(name, d) + local def = table.copy(d) + def.drawtype = "mesh" + def.visual = "mesh" + def.paramtype = "light" + def.paramtype2 = "facedir" + def.legacy_facedir_simple = true + def.is_ground_content = false + + if def.protected then + def.on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", "Locked Chest") + meta:set_string("owner", "") + local inv = meta:get_inventory() + inv:set_size("default:chest", 8*4) + end + def.after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + meta:set_string("owner", placer:get_player_name() or "") + meta:set_string("infotext", "Locked Chest (owned by " .. + meta:get_string("owner") .. ")") + end + def.can_dig = function(pos,player) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("default:chest") and + default.can_interact_with_node(player, pos) + end + def.allow_metadata_inventory_move = function(pos, from_list, from_index, + to_list, to_index, count, player) + if not default.can_interact_with_node(player, pos) then + return 0 + end + return count + end + def.allow_metadata_inventory_put = function(pos, listname, index, stack, player) + if not default.can_interact_with_node(player, pos) then + return 0 + end + return stack:get_count() + end + def.allow_metadata_inventory_take = function(pos, listname, index, stack, player) + if not default.can_interact_with_node(player, pos) then + return 0 + end + return stack:get_count() + end + def.on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + if not default.can_interact_with_node(clicker, pos) then + return itemstack + end + + minetest.sound_play(def.sound_open, {gain = 0.3, + pos = pos, max_hear_distance = 10}) + if not chest_lid_obstructed(pos) then + minetest.swap_node(pos, + { name = "default:" .. name .. "_open", + param2 = node.param2 }) + end + minetest.after(0.2, minetest.show_formspec, + clicker:get_player_name(), + "default:chest", get_chest_formspec(pos)) + open_chests[clicker:get_player_name()] = { pos = pos, + sound = def.sound_close, swap = name } + end + def.on_blast = function() end + def.on_key_use = function(pos, player) + local secret = minetest.get_meta(pos):get_string("key_lock_secret") + local itemstack = player:get_wielded_item() + local key_meta = itemstack:get_meta() + + if key_meta:get_string("secret") == "" then + key_meta:set_string("secret", minetest.parse_json(itemstack:get_metadata()).secret) + itemstack:set_metadata("") + end + + if secret ~= key_meta:get_string("secret") then + return + end + + minetest.show_formspec( + player:get_player_name(), + "default:chest_locked", + get_chest_formspec(pos) + ) + end + def.on_skeleton_key_use = function(pos, player, newsecret) + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + local pn = player:get_player_name() + + -- verify placer is owner of lockable chest + if owner ~= pn then + minetest.record_protection_violation(pos, pn) + minetest.chat_send_player(pn, "You do not own this chest.") + return nil + end + + local secret = meta:get_string("key_lock_secret") + if secret == "" then + secret = newsecret + meta:set_string("key_lock_secret", secret) + end + + return secret, "a locked chest", owner + end + else + def.on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", "Chest") + local inv = meta:get_inventory() + inv:set_size("default:chest", 8*4) + end + def.can_dig = function(pos,player) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("default:chest") + end + def.on_rightclick = function(pos, node, clicker) + minetest.sound_play(def.sound_open, {gain = 0.3, pos = pos, + max_hear_distance = 10}) + if not chest_lid_obstructed(pos) then + minetest.swap_node(pos, { + name = "default:" .. name .. "_open", + param2 = node.param2 }) + end + minetest.after(0.2, minetest.show_formspec, + clicker:get_player_name(), + "default:chest", get_chest_formspec(pos)) + open_chests[clicker:get_player_name()] = { pos = pos, + sound = def.sound_close, swap = name } + end + end + + def.on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) minetest.log("action", player:get_player_name() .. " moves stuff in chest at " .. minetest.pos_to_string(pos)) - end, - on_metadata_inventory_put = function(pos, listname, index, stack, player) + end + def.on_metadata_inventory_put = function(pos, listname, index, stack, player) minetest.log("action", player:get_player_name() .. " moves " .. stack:get_name() .. " to chest at " .. minetest.pos_to_string(pos)) - end, - on_metadata_inventory_take = function(pos, listname, index, stack, player) + end + def.on_metadata_inventory_take = function(pos, listname, index, stack, player) minetest.log("action", player:get_player_name() .. " takes " .. stack:get_name() .. " from chest at " .. minetest.pos_to_string(pos)) - end, - on_blast = function(pos) + end + def.on_blast = function(pos) local drops = {} default.get_inventory_drops(pos, "main", drops) drops[#drops+1] = "default:chest" minetest.remove_node(pos) return drops - end, -}) + end -minetest.register_node("default:chest_locked", { - description = "Locked Chest", - tiles = {"default_chest_top.png", "default_chest_top.png", "default_chest_side.png", - "default_chest_side.png", "default_chest_side.png", "default_chest_lock.png"}, - paramtype2 = "facedir", - groups = {choppy = 2, oddly_breakable_by_hand = 2}, - legacy_facedir_simple = true, - is_ground_content = false, + local def_opened = table.copy(def) + local def_closed = table.copy(def) + + def_opened.mesh = "chest_open.obj" + def_opened.drop = "default:" .. name + def_opened.groups.not_in_creative_inventory = 1 + def_opened.selection_box = { + type = "fixed", + fixed = { -1/2, -1/2, -1/2, 1/2, 3/16, 1/2 }, + } + def_opened.can_dig = function() + return false + end + + def_closed.mesh = "cube.obj" + + minetest.register_node("default:" .. name, def_closed) + minetest.register_node("default:" .. name .. "_open", def_opened) + + -- convert old chests to this new variant + minetest.register_lbm({ + label = "update chests to opening chests", + name = "default:upgrade_" .. name, + nodenames = {"default:" .. name}, + action = function(pos, node) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", nil) + local inv = meta:get_inventory() + local list = inv:get_list("main") + inv:set_list("main", nil) + inv:set_size("default:chest", 8*4) + inv:set_list("default:chest", list) + end + }) +end + + +default.register_chest("chest", { + description = "Chest", + tiles = { "default_chest_wood.png" }, sounds = default.node_sound_wood_defaults(), - - after_place_node = function(pos, placer) - local meta = minetest.get_meta(pos) - meta:set_string("owner", placer:get_player_name() or "") - meta:set_string("infotext", "Locked Chest (owned by " .. - meta:get_string("owner") .. ")") - end, - on_construct = function(pos) - local meta = minetest.get_meta(pos) - meta:set_string("owner", "") - local inv = meta:get_inventory() - inv:set_size("main", 8 * 4) - end, - can_dig = function(pos,player) - local meta = minetest.get_meta(pos); - local inv = meta:get_inventory() - return inv:is_empty("main") and default.can_interact_with_node(player, pos) - end, - allow_metadata_inventory_move = function(pos, from_list, from_index, - to_list, to_index, count, player) - if not default.can_interact_with_node(player, pos) then - return 0 - end - return count - end, - allow_metadata_inventory_put = function(pos, listname, index, stack, player) - if not default.can_interact_with_node(player, pos) then - return 0 - end - return stack:get_count() - end, - allow_metadata_inventory_take = function(pos, listname, index, stack, player) - if not default.can_interact_with_node(player, pos) then - return 0 - end - return stack:get_count() - end, - on_metadata_inventory_put = function(pos, listname, index, stack, player) - minetest.log("action", player:get_player_name() .. - " moves " .. stack:get_name() .. - " to locked chest at " .. minetest.pos_to_string(pos)) - end, - on_metadata_inventory_take = function(pos, listname, index, stack, player) - minetest.log("action", player:get_player_name() .. - " takes " .. stack:get_name() .. - " from locked chest at " .. minetest.pos_to_string(pos)) - end, - on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) - if default.can_interact_with_node(clicker, pos) then - minetest.show_formspec( - clicker:get_player_name(), - "default:chest_locked", - get_locked_chest_formspec(pos) - ) - end - return itemstack - end, - on_blast = function() end, - on_key_use = function(pos, player) - local secret = minetest.get_meta(pos):get_string("key_lock_secret") - local itemstack = player:get_wielded_item() - local key_meta = itemstack:get_meta() - - if key_meta:get_string("secret") == "" then - key_meta:set_string("secret", minetest.parse_json(itemstack:get_metadata()).secret) - itemstack:set_metadata("") - end - - if secret ~= key_meta:get_string("secret") then - return - end - - minetest.show_formspec( - player:get_player_name(), - "default:chest_locked", - get_locked_chest_formspec(pos) - ) - end, - on_skeleton_key_use = function(pos, player, newsecret) - local meta = minetest.get_meta(pos) - local owner = meta:get_string("owner") - local name = player:get_player_name() - - -- verify placer is owner of lockable chest - if owner ~= name then - minetest.record_protection_violation(pos, name) - minetest.chat_send_player(name, "You do not own this chest.") - return nil - end - - local secret = meta:get_string("key_lock_secret") - if secret == "" then - secret = newsecret - meta:set_string("key_lock_secret", secret) - end - - return secret, "a locked chest", owner - end, + sound_open = "default_chest_open", + sound_close = "default_chest_close", + groups = {choppy = 2, oddly_breakable_by_hand = 2}, }) +default.register_chest("chest_locked", { + description = "Locked Chest", + tiles = { "default_chest_wood_locked.png" }, + sounds = default.node_sound_wood_defaults(), + sound_open = "default_chest_open", + sound_close = "default_chest_close", + groups = {choppy = 2, oddly_breakable_by_hand = 2}, + protected = true, +}) local bookshelf_formspec = "size[8,7;]" .. diff --git a/mods/default/sounds/default_chest_close.ogg b/mods/default/sounds/default_chest_close.ogg new file mode 100644 index 0000000000000000000000000000000000000000..53ff23d219cec9d3a10778cd797ff6cbde79bd13 GIT binary patch literal 10099 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 KF)OpVjC=svzK?GJ literal 0 HcmV?d00001 diff --git a/mods/default/sounds/default_chest_open.ogg b/mods/default/sounds/default_chest_open.ogg new file mode 100644 index 0000000000000000000000000000000000000000..c73c072c05d0b42e5e9ed50e3d7398dcc476fa16 GIT binary patch literal 10578 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 literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_chest_front.png b/mods/default/textures/default_chest_front.png deleted file mode 100644 index 85227d8fd636ace9592070a2f7e86df531dc03a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 423 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4rT@h1`S>QU)QPLi@jU2UAuD~=akuZryAsj=w}6J-MxEv$A-lZHdh^;le%wO z?BW{N_FR{yH2VWPRxe(>c=PIcueaBgm6a`MjF?jHKe^0rdZl+qo_9r}U4EqH9B!->qY&@gpFr%+CLxm`F%ga zD*67ymFw1hH-DEF{C??_d+T2RVoI1U_ zw>X(I^mqkd68HldUi8&LwkMT=D+s(SLTE= zWakES%sTc#;ej?oG)q9BhTG>q90nE^4ZOJ#({3;csPB5B*HW=duaj1Gwg1_lNOPgg&ebxsLQ0MGWd3;+NC diff --git a/mods/default/textures/default_chest_lock.png b/mods/default/textures/default_chest_lock.png deleted file mode 100644 index 73f46c7864e7878d4724cc166d9035291eee845f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 469 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4rT@h1`S>QUGqGfrkSz)+Aeu&=L z#aSm8WNhvYpVtt+y481XxkE*Q)r3rw(kPSeRD-8apWeNDcgKds3l}bYu(|5s%=rD& z|ar#x+0EvL;mdxS@qB z0|UbmPZ!4!iOZ?yT!juB@UUJuwK18)+$S|H?cLw^A=MXse}~U9mwFlg?{g8?^|LnT zx8}yydlby$Q9RtUt0gGOQ{$IZ=h_!y+oP5TOi!47pgmf#&)Gx$^ZSKSxqJVdySnQA z@7bZn^L=gCPq@IHX}!An;srsc;H`~{QYLz5cZtTG-^emuwWss&yL+lFQLng-8kz;z zE}57F9JQL|v)ngBfW?;cv*8Cj2LGLzYJFB#ho0s%8Orrub}{{0_%BZ9ROGzrGdzEs aWnbAO;KhD+??wg&1_n=8KbLh*2~7Z64%A`* diff --git a/mods/default/textures/default_chest_side.png b/mods/default/textures/default_chest_side.png deleted file mode 100644 index 44a65a43d3c3f2ba44bceb519a0696e1ba441800..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 375 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4rT@h1`S>QUkyn`}t!H;V*MkfU3=E#GelF{r5}E)`f}a}z diff --git a/mods/default/textures/default_chest_top.png b/mods/default/textures/default_chest_top.png deleted file mode 100644 index f1a5cb594f4ee6ef23813aeb68ddd38a472c4801..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 422 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4rT@h1`S>QUIdB=qC>4nx)^DU3hPhZ#Oe{w;_{^@ZWyMnrNon{u<9G#PTcvixeo{*JI-gCYQDib!2w(lIE~w4W3gps|Abz^<`r4byEDZcX!46R-czszLdW{UZ^2g8!z&_ d=HDOr=s&!N9B1)vXJBAp@O1TaS?83{1OUy_x!V8$ diff --git a/mods/default/textures/default_chest_wood.png b/mods/default/textures/default_chest_wood.png new file mode 100644 index 0000000000000000000000000000000000000000..408fddb22872a6cd9d9bdd1e2faca55415a98ebc GIT binary patch literal 2320 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 literal 0 HcmV?d00001