From 92fd95538f3cafad9c781f72d659c0c185b1035f Mon Sep 17 00:00:00 2001 From: Juraj Vajda Date: Thu, 30 Mar 2023 22:45:16 -0400 Subject: [PATCH] Remove hard dependency on default --- LICENSE.txt | 13 + api.lua | 73 +++++ chests.lua | 345 ++++++++++++++++++++++ crafting.lua | 34 ++- init.lua | 1 + loot_chests.lua | 2 +- nodes.lua | 14 +- sounds/everness_chest_close.ogg | Bin 0 -> 10234 bytes sounds/everness_chest_open.ogg | Bin 0 -> 10650 bytes textures/everness_chest_front.png | Bin 0 -> 262 bytes textures/everness_chest_inside.png | Bin 0 -> 267 bytes textures/everness_chest_side.png | Bin 0 -> 253 bytes textures/everness_chest_top.png | Bin 0 -> 246 bytes textures/everness_chest_ui_bg.png | Bin 0 -> 510 bytes textures/everness_chest_ui_bg_hb_slot.png | Bin 0 -> 125 bytes textures/everness_chest_ui_bg_slot.png | Bin 0 -> 125 bytes textures/everness_gui_hb_bg.png | Bin 0 -> 98 bytes 17 files changed, 458 insertions(+), 24 deletions(-) create mode 100644 chests.lua create mode 100644 sounds/everness_chest_close.ogg create mode 100644 sounds/everness_chest_open.ogg create mode 100644 textures/everness_chest_front.png create mode 100644 textures/everness_chest_inside.png create mode 100644 textures/everness_chest_side.png create mode 100644 textures/everness_chest_top.png create mode 100644 textures/everness_chest_ui_bg.png create mode 100644 textures/everness_chest_ui_bg_hb_slot.png create mode 100644 textures/everness_chest_ui_bg_slot.png create mode 100644 textures/everness_gui_hb_bg.png diff --git a/LICENSE.txt b/LICENSE.txt index f572fc0..9072029 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -828,6 +828,14 @@ GNU Lesser General Public License v2.1 or later (see included LICENSE file) - everness_glass.png - everness_glass_detail.png - everness_tinted_glass_detail.png +- everness_chest_front.png +- everness_chest_inside.png +- everness_chest_side.png +- everness_chest_top.png +- everness_chest_ui_bg.png -- Derived from texture by XSSheep (CC BY 4.0) +- everness_chest_ui_bg_hb_slot.png -- Derived from texture by XSSheep (CC BY 4.0) +- everness_chest_ui_bg_slot.png -- Derived from texture by XSSheep (CC BY 4.0) +- everness_gui_hb_bg.png **CC-BY-SA-4.0, Pixel Perfection by XSSheep**, https://minecraft.curseforge.com/projects/pixel-perfection-freshly-updated @@ -1072,6 +1080,11 @@ GNU Lesser General Public License v2.1 or later (see included LICENSE file) - everness_door_glass_close.ogg - everness_door_glass_open.ogg +**CC-BY-4.0, by SFXAFRIK**, https://freesound.org/people/SFXAFRIK/sounds/584850/ + +- everness_chest_open.ogg +- everness_chest_close.ogg + **CC0-1.0, by Nox_Sound**, https://freesound.org - everness_stone_dug.1.ogg diff --git a/api.lua b/api.lua index 75f709c..37df502 100644 --- a/api.lua +++ b/api.lua @@ -1182,6 +1182,18 @@ function Everness.log_player_action(player, ...) minetest.log('action', msg) end +function Everness.set_inventory_action_loggers(def, name) + def.on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + Everness.log_player_action(player, 'moves stuff in', name, 'at', pos) + end + def.on_metadata_inventory_put = function(pos, listname, index, stack, player) + Everness.log_player_action(player, 'moves', stack:get_name(), 'to', name, 'at', pos) + end + def.on_metadata_inventory_take = function(pos, listname, index, stack, player) + Everness.log_player_action(player, 'takes', stack:get_name(), 'from', name, 'at', pos) + end +end + -- 'can grow' function - copy from MTG function Everness.can_grow(pos) @@ -1203,3 +1215,64 @@ function Everness.can_grow(pos) return true end + +-- +-- This method may change in future. +-- Copy from MTG +-- + +function Everness.can_interact_with_node(player, pos) + if player and player:is_player() then + if minetest.check_player_privs(player, 'protection_bypass') then + return true + end + else + return false + end + + local meta = minetest.get_meta(pos) + local owner = meta:get_string('owner') + + if not owner or owner == '' or owner == player:get_player_name() then + return true + end + + -- Is player wielding the right key? + local item = player:get_wielded_item() + + if minetest.get_item_group(item:get_name(), 'key') == 1 then + local key_meta = item:get_meta() + + if key_meta:get_string('secret') == '' then + local key_oldmeta = item:get_metadata() + + if key_oldmeta == '' or not minetest.parse_json(key_oldmeta) then + return false + end + + key_meta:set_string('secret', minetest.parse_json(key_oldmeta).secret) + item:set_metadata('') + end + + return meta:get_string('key_lock_secret') == key_meta:get_string('secret') + end + + return false +end + +-- +-- Optimized helper to put all items in an inventory into a drops list +-- copy from MTG +-- + +function Everness.get_inventory_drops(pos, inventory, drops) + local inv = minetest.get_meta(pos):get_inventory() + local n = #drops + for i = 1, inv:get_size(inventory) do + local stack = inv:get_stack(inventory, i) + if stack:get_count() > 0 then + drops[n + 1] = stack:to_table() + n = n + 1 + end + end +end diff --git a/chests.lua b/chests.lua new file mode 100644 index 0000000..367de05 --- /dev/null +++ b/chests.lua @@ -0,0 +1,345 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + GNU Lesser General Public License, version 2.1 + Copyright (C) 2011-2018 celeron55, Perttu Ahola + Copyright (C) 2011-2018 Various Minetest developers and contributors + Copyright (C) 2022 SaKeL + + This program is free software; you can redistribute it and/or modify it under the terms + of the GNU Lesser General Public License as published by the Free Software Foundation; + either version 2.1 of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details: + https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html +--]] + +Everness.chest = {} + +-- support for MT game translation. +local S = minetest.get_translator(minetest.get_current_modname()) + +function Everness.chest.get_chest_formspec(pos) + local spos = pos.x .. ',' .. pos.y .. ',' .. pos.z + local hotbar_bg = '' + local list_bg = '' + local chest_bg = '' + + for i = 0, 7, 1 do + hotbar_bg = hotbar_bg .. 'image[' .. 0 + i .. ', ' .. 4.85 .. ';1,1;everness_chest_ui_bg_hb_slot.png]' + end + + for row = 0, 2, 1 do + for i = 0, 7, 1 do + list_bg = list_bg .. 'image[' .. 0 + i .. ',' .. 6.08 + row .. ';1,1;everness_chest_ui_bg_slot.png]' + end + end + + for row = 0, 3, 1 do + for i = 0, 7, 1 do + chest_bg = chest_bg .. 'image[' .. 0 + i .. ',' .. 0.3 + row .. ';1,1;everness_chest_ui_bg_slot.png]' + end + end + + local formspec = + 'size[8,9]' .. + 'listcolors[#FFFFFF00;#FFFFFF1A;#5E5957]' .. + 'background[5,5;1,1;everness_chest_ui_bg.png;true]' .. + 'list[nodemeta:' .. spos .. ';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[nodemeta:' .. spos .. ';main]' .. + 'listring[current_player;main]' .. + list_bg .. + hotbar_bg .. + chest_bg + return formspec +end + +function Everness.chest.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 and + (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 + +function Everness.chest.chest_lid_close(pn) + local chest_open_info = Everness.chest.open_chests[pn] + local pos = chest_open_info.pos + local sound = chest_open_info.sound + local swap = chest_open_info.swap + + Everness.chest.open_chests[pn] = nil + + for _, v in pairs(Everness.chest.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 + + local node = minetest.get_node(pos) + + minetest.after(0.2, minetest.swap_node, pos, { name = swap, param2 = node.param2 }) + minetest.sound_play(sound, { gain = 0.3, pos = pos, max_hear_distance = 10 }, true) +end + +Everness.chest.open_chests = {} + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname ~= 'everness:chest' then + return + end + + if not player or not fields.quit then + return + end + + local pn = player:get_player_name() + + if not Everness.chest.open_chests[pn] then + return + end + + Everness.chest.chest_lid_close(pn) + + return true +end) + +minetest.register_on_leaveplayer(function(player) + local pn = player:get_player_name() + + if Everness.chest.open_chests[pn] then + Everness.chest.chest_lid_close(pn) + end +end) + +function Everness.chest.register_chest(prefixed_name, d) + local name = prefixed_name:sub(1, 1) == ':' and prefixed_name:sub(2, -1) or prefixed_name + 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 + -- Locked chest + def.on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string('infotext', S('Locked Chest')) + meta:set_string('owner', '') + local inv = meta:get_inventory() + inv:set_size('main', 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', S('Locked Chest (owned by @1)', 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('main') and Everness.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 Everness.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 Everness.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 Everness.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 Everness.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 }, true) + + if not Everness.chest.chest_lid_obstructed(pos) then + minetest.swap_node(pos, { name = name .. '_open', param2 = node.param2 }) + end + + minetest.after(0.2, minetest.show_formspec, clicker:get_player_name(), 'everness:chest', Everness.chest.get_chest_formspec(pos)) + Everness.chest.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 itemstack:get_metadata() == '' then + return + end + + 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(), + 'everness:chest_locked', + Everness.chest.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, S('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, S('a locked chest'), owner + end + else + -- Public (unlocked) chest + def.on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string('infotext', S('Chest')) + local inv = meta:get_inventory() + inv:set_size('main', 8 * 4) + end + + def.can_dig = function(pos,player) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty('main') + end + + def.on_rightclick = function(pos, node, clicker) + minetest.sound_play(def.sound_open, { gain = 0.3, pos = pos, max_hear_distance = 10 }, true) + + if not Everness.chest.chest_lid_obstructed(pos) then + minetest.swap_node(pos, { name = name .. '_open', param2 = node.param2 }) + end + + minetest.after(0.2, minetest.show_formspec, clicker:get_player_name(), 'everness:chest', Everness.chest.get_chest_formspec(pos)) + Everness.chest.open_chests[clicker:get_player_name()] = { pos = pos, sound = def.sound_close, swap = name } + end + + def.on_blast = function(pos) + local drops = {} + Everness.get_inventory_drops(pos, 'main', drops) + drops[#drops + 1] = name + minetest.remove_node(pos) + return drops + end + end + + Everness.set_inventory_action_loggers(def, 'chest') + + local def_opened = table.copy(def) + local def_closed = table.copy(def) + + def_opened.mesh = 'chest_open.obj' + + for i = 1, #def_opened.tiles do + if type(def_opened.tiles[i]) == 'string' then + def_opened.tiles[i] = { name = def_opened.tiles[i], backface_culling = true } + elseif def_opened.tiles[i].backface_culling == nil then + def_opened.tiles[i].backface_culling = true + end + end + + def_opened.drop = 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_opened.on_blast = function() end + + def_closed.mesh = nil + def_closed.drawtype = nil + def_closed.tiles[6] = def.tiles[5] -- swap textures around for 'normal' + def_closed.tiles[5] = def.tiles[3] -- drawtype to make them match the mesh + def_closed.tiles[3] = def.tiles[3] .. '^[transformFX' + + minetest.register_node(prefixed_name, def_closed) + minetest.register_node(prefixed_name .. '_open', def_opened) +end + +Everness.chest.register_chest('everness:chest', { + description = S('Chest'), + tiles = { + 'everness_chest_top.png', + 'everness_chest_top.png', + 'everness_chest_side.png', + 'everness_chest_side.png', + 'everness_chest_front.png', + 'everness_chest_inside.png' + }, + sounds = Everness.node_sound_wood_defaults(), + sound_open = 'everness_chest_open', + sound_close = 'everness_chest_close', + groups = { choppy = 2, oddly_breakable_by_hand = 2 }, +}) + +minetest.register_craft({ + output = 'everness:chest', + recipe = { + { 'group:everness_wood', 'group:everness_wood', 'group:everness_wood' }, + { 'group:everness_wood', '', 'group:everness_wood' }, + { 'group:everness_wood', 'group:everness_wood', 'group:everness_wood' }, + } +}) + +minetest.register_craft({ + type = 'fuel', + recipe = 'everness:chest', + burntime = 30, +}) diff --git a/crafting.lua b/crafting.lua index 4806892..90f55ea 100644 --- a/crafting.lua +++ b/crafting.lua @@ -20,23 +20,25 @@ -- Blocks -- -minetest.register_craft({ - output = 'everness:snowcobble 9', - recipe = { - { 'default:snowblock', 'default:snowblock', 'default:snowblock' }, - { 'default:snowblock', 'default:snowblock', 'default:snowblock' }, - { 'default:snowblock', 'default:snowblock', 'default:snowblock' }, - } -}) +if minetest.get_modpath('default') then + minetest.register_craft({ + output = 'everness:snowcobble 9', + recipe = { + { 'default:snowblock', 'default:snowblock', 'default:snowblock' }, + { 'default:snowblock', 'default:snowblock', 'default:snowblock' }, + { 'default:snowblock', 'default:snowblock', 'default:snowblock' }, + } + }) -minetest.register_craft({ - output = 'everness:icecobble 9', - recipe = { - { 'default:ice', 'default:ice', 'default:ice' }, - { 'default:ice', 'default:ice', 'default:ice' }, - { 'default:ice', 'default:ice', 'default:ice' }, - } -}) + minetest.register_craft({ + output = 'everness:icecobble 9', + recipe = { + { 'default:ice', 'default:ice', 'default:ice' }, + { 'default:ice', 'default:ice', 'default:ice' }, + { 'default:ice', 'default:ice', 'default:ice' }, + } + }) +end minetest.register_craft({ output = 'everness:snowcobble 9', diff --git a/init.lua b/init.lua index 69beea1..fac411d 100644 --- a/init.lua +++ b/init.lua @@ -28,6 +28,7 @@ dofile(path .. '/bamboo.lua') dofile(path .. '/functions.lua') dofile(path .. '/trees.lua') dofile(path .. '/vines.lua') +dofile(path .. '/chests.lua') dofile(path .. '/mapgen.lua') diff --git a/loot_chests.lua b/loot_chests.lua index 057c559..f1bb8e1 100644 --- a/loot_chests.lua +++ b/loot_chests.lua @@ -33,7 +33,7 @@ minetest.register_lbm({ }, run_at_every_load = true, action = function(pos, node) - minetest.set_node(pos, { name = 'default:chest', param2 = minetest.get_node(pos).param2 }) + minetest.set_node(pos, { name = 'everness:chest', param2 = minetest.get_node(pos).param2 }) local rand = PcgRandom(pos.x * pos.y * pos.z) local inv = minetest.get_inventory({ type = 'node', pos = pos }) diff --git a/nodes.lua b/nodes.lua index 8193c53..1ecd41e 100644 --- a/nodes.lua +++ b/nodes.lua @@ -1527,7 +1527,7 @@ Everness:register_node('everness:willow_wood', { place_param2 = 0, tiles = { 'everness_willow_wood.png' }, is_ground_content = false, - groups = { choppy = 3, oddly_breakable_by_hand = 2, flammable = 3, wood = 1 }, + groups = { choppy = 3, oddly_breakable_by_hand = 2, flammable = 3, wood = 1, everness_wood = 1 }, sounds = Everness.node_sound_wood_defaults(), }) @@ -1537,7 +1537,7 @@ Everness:register_node('everness:dry_wood', { place_param2 = 0, tiles = { 'everness_dry_wood.png' }, is_ground_content = false, - groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1 }, + groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1, everness_wood = 1 }, sounds = Everness.node_sound_wood_defaults(), }) @@ -1597,7 +1597,7 @@ minetest.register_node('everness:crystal_wood', { place_param2 = 0, tiles = { 'everness_crystal_wood.png' }, is_ground_content = false, - groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1 }, + groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1, everness_wood = 1 }, sounds = Everness.node_sound_wood_defaults(), }) @@ -3795,7 +3795,7 @@ Everness:register_node('everness:bamboo_wood', { place_param2 = 0, tiles = { 'everness_dry_bamboo_block_side.png' }, is_ground_content = false, - groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1 }, + groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1, everness_wood = 1 }, sounds = Everness.node_sound_wood_defaults(), }) @@ -3805,7 +3805,7 @@ Everness:register_node('everness:bamboo_mosaic_wood', { place_param2 = 0, tiles = { 'everness_bamboo_mosaic.png' }, is_ground_content = false, - groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1 }, + groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1, everness_wood = 1 }, sounds = Everness.node_sound_wood_defaults(), }) @@ -3815,7 +3815,7 @@ Everness:register_node('everness:baobab_wood', { place_param2 = 0, tiles = { 'everness_baobab_wood.png' }, is_ground_content = false, - groups = { choppy = 3, oddly_breakable_by_hand = 2, flammable = 3, wood = 1 }, + groups = { choppy = 3, oddly_breakable_by_hand = 2, flammable = 3, wood = 1, everness_wood = 1 }, sounds = Everness.node_sound_wood_defaults(), }) @@ -3825,7 +3825,7 @@ Everness:register_node('everness:sequoia_wood', { place_param2 = 0, tiles = { 'everness_sequoia_wood.png' }, is_ground_content = false, - groups = { choppy = 3, oddly_breakable_by_hand = 2, flammable = 3, wood = 1 }, + groups = { choppy = 3, oddly_breakable_by_hand = 2, flammable = 3, wood = 1, everness_wood = 1 }, sounds = Everness.node_sound_wood_defaults(), }) diff --git a/sounds/everness_chest_close.ogg b/sounds/everness_chest_close.ogg new file mode 100644 index 0000000000000000000000000000000000000000..784716594d4291a057c48ca11c70dfc24562e88a GIT binary patch literal 10234 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 literal 0 HcmV?d00001 diff --git a/textures/everness_chest_front.png b/textures/everness_chest_front.png new file mode 100644 index 0000000000000000000000000000000000000000..46c5b7421a74fd8262b10b83840ad8c31aa5d24d GIT binary patch literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!L4Z$)s}MJXx)i&YmzS9uUx2^A zz9NsDFq5mRtCPNvm8O8NxwyHRnZ3QekrI1;UT$<`AAou%db&7FW%$%U_NlilUBt4`U}d$X|#8?dIG1v-ww)78&q Iol`;+02u06>i_@% literal 0 HcmV?d00001 diff --git a/textures/everness_chest_inside.png b/textures/everness_chest_inside.png new file mode 100644 index 0000000000000000000000000000000000000000..3a05d1098b91111a7480272abc8586a3f0e43992 GIT binary patch literal 267 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!3-pI!a4o{DT4r?5LY1Z^z`)e^K)=;u(Y%c z2@Y11Vi)IQG*RV~6J}v%61CJ6&{g0vR_5g4)^auw=~30X2Gl#v)5S5Q;#TgY(|m^& z1eo{UV^?YX^uIouFLU>VUri=L$~PG}(y#c;5n<>NDt)%Xbde0p>6t+?Jv>QG+Rbhr z^Pj(-tmtrZ0mqg!frf27vmD*o?v}OZ_GQ(})G}|IX1pVK0oTlhyX_Br?)tX$ElV!D zX>-;AtB0}ge4cJe{ZRUcZI^7O(@RMn#`Q-X4aC};S0A3=zqh{KT**;Lah-r;1JH#G Mp00i_>zopr0H0`CBme*a literal 0 HcmV?d00001 diff --git a/textures/everness_chest_side.png b/textures/everness_chest_side.png new file mode 100644 index 0000000000000000000000000000000000000000..211195d13332c7cd61b6b4fe67290b6f685cbfc4 GIT binary patch literal 253 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!L4Z$)tGPPAmzS5nzrUd}uP`@* zi=nWbFq5$oySfy+t+s%3#XqI}nEl_WVr;B4q#jVgYfqcx0 z94r?YLmXCB|G!;U^82!SV~Wy)iL0VkdwI-nz535*jqNZ0wEoU6pZD)}NUYd7J2FD* ze-7Jw)2XX>H1Qe>JePR>;!a)bZ<|I{qj!?mG(x10d^^|l#!vnl;;bkGHy)W zsa&iv&ur)4#l4K`49VRRz6%y@d1e!wQp;$p$9kS)-<{h)H!*m+`njxgN@xNAH?>$R literal 0 HcmV?d00001 diff --git a/textures/everness_chest_top.png b/textures/everness_chest_top.png new file mode 100644 index 0000000000000000000000000000000000000000..2c24e9d06239a8fee2bcf65383e87fb1bbc815df GIT binary patch literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!L4Z$)tBZlKFgJsRI$xlbgn=TD zhlfXCK!B_eqp=dZswBIEgM+!bxvh>MF9(B(DzCjZ_qCcj4WQmePZ!6Kid&(5(R?h5 z94r@EMO>c$+kW@m%{QytYbQ{3G!XlbCS!mVFs qACGk#Mo1|)EzIL9(%qN#lf|Np_3i545kG;BVeoYIb6Mw<&;$VZ-%IfT literal 0 HcmV?d00001 diff --git a/textures/everness_chest_ui_bg.png b/textures/everness_chest_ui_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..c6cc3a797258bfaf8e9cd796ca82376b3d81e77f GIT binary patch literal 510 zcmeAS@N?(olHy`uVBq!ia0vp^tAKa|3p0?+6@B3Yq(lRJLR{k_!z2CNbMvywON#q? zI(!|ivJ)a5I|D@-7#Np$x;TbZ#J#=knDyF0pygrK!8f~8H%(`?a!}aAt-?Nm?H9|= z|FTK_hD?dQs>{DB1pL1zzcuru^ux#6`~3en*W71cIls0>zGC|izY6!7|Gu*Pf$Fv{ zz4x@9y)zG0+WsxQoHxAiTV7ANso&pfuu!M@_Q zVw9^?)REPfdfZn?9J)G*ZAD|?Qm?66p{qhx1|b+)?JLCAcb$k8-7_I+DT8U&YKExW ztMpd}^e`B#JMsBi-u)Yko^8EEx$}3*vgqTx zZqMHR{8g^$y>HVuY+aH%>FKZHgbY^eSpk#Ovw~vp#g@KuySnRdaASH_oS*2%Q&(oL zU)5!s8?yYV=nAfR>Y=7vJF>&Rp5Mz0a#yILlGw^st7hIX-TQ^XV*diC9KL>`+QQd+ z+oPrb-n}+8@NwPNGgFNsOg?Ze*%9EusN$k~;m`S)vr1Q|o@|?2Zd)0fr+TnlWxK+hDA@n(>`Xp} X+`xp3e=D``fDH6>^>bP0l+XkKc`zu1 literal 0 HcmV?d00001 diff --git a/textures/everness_gui_hb_bg.png b/textures/everness_gui_hb_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..99248e1768bb3e599db1496743d0d881f715c8c8 GIT binary patch literal 98 zcmeAS@N?(olHy`uVBq!ia0vp^h9Jzy3?w~+F2@5Y<^Z1%S0KH-%JvqJVk`;r3)X%U prKkqv@Orv9hDb;zORzRG0i`+^7$4|}O$16Xc)I$ztaD0e0svDU6Ey$; literal 0 HcmV?d00001