From 3275c4089606a12268ddcdacd8d9d6f861e493b3 Mon Sep 17 00:00:00 2001 From: Leslie Krause Date: Sat, 23 Dec 2017 22:03:00 -0500 Subject: [PATCH] Build 03 - merged colored giftboxes from mt_seasons mod - added aliases for original colored giftboxes --- config.lua | 51 ++++++++ depends.txt | 1 + init.lua | 243 +++++++++++++++++++++++++++++++++++ models/giftbox.obj | 62 +++++++++ textures/giftbox_black.png | Bin 0 -> 2452 bytes textures/giftbox_blue.png | Bin 0 -> 3051 bytes textures/giftbox_bottom.png | Bin 0 -> 171 bytes textures/giftbox_cyan.png | Bin 0 -> 3175 bytes textures/giftbox_green.png | Bin 0 -> 3106 bytes textures/giftbox_magenta.png | Bin 0 -> 3155 bytes textures/giftbox_red.png | Bin 0 -> 3067 bytes textures/giftbox_side.png | Bin 0 -> 97 bytes textures/giftbox_top.png | Bin 0 -> 282 bytes textures/giftbox_white.png | Bin 0 -> 2313 bytes textures/giftbox_yellow.png | Bin 0 -> 3102 bytes 15 files changed, 357 insertions(+) create mode 100644 config.lua create mode 100644 depends.txt create mode 100644 init.lua create mode 100644 models/giftbox.obj create mode 100644 textures/giftbox_black.png create mode 100644 textures/giftbox_blue.png create mode 100644 textures/giftbox_bottom.png create mode 100644 textures/giftbox_cyan.png create mode 100644 textures/giftbox_green.png create mode 100644 textures/giftbox_magenta.png create mode 100644 textures/giftbox_red.png create mode 100644 textures/giftbox_side.png create mode 100644 textures/giftbox_top.png create mode 100644 textures/giftbox_white.png create mode 100644 textures/giftbox_yellow.png diff --git a/config.lua b/config.lua new file mode 100644 index 0000000..daf521d --- /dev/null +++ b/config.lua @@ -0,0 +1,51 @@ +-- giftbox mod configuration file + +giftbox.present_infotext = "Christmas Present" +giftbox.present_greeting = "present_greeting.png" + +giftbox.present_items = { + "default:torch 60", + "default:apple 40", + "farming:bread 20", + "mt_seasons:pumpkin_slice 10", + + "default:junglesapling 5", + "default:pine_sapling 5", + "default:aspen_sapling 5", + "default:acacia_sapling 5", + + "default:pick_diamond", + "default:sword_diamond", + "default:pick_bronze", + "default:sword_bronze", + + "3d_armor:helmet_diamond", + "3d_armor:leggings_diamond", + "3d_armor:chestplate_diamond", + "3d_armor:boots_diamond", + + "default:coalblock 20", + "tnt:tnt 15", + "default:obsidian 10", + "default:snowblock 5", + + "mobs:cursed_stone", + "jt_mods:griefer_soul_block", + "default:meselamp_white 10", + "default:meselamp 10", +} + +giftbox.giftbox_drops = { + -- digging gift box allows for a single drop of items with a given a rarity + { items = { "default:sword_diamond" }, rarity = 50 }, + { items = { "default:sword_bronze" }, rarity = 25 }, + + { items = { "default:pick_diamond" }, rarity = 50 }, + { items = { "default:pick_bronze" }, rarity = 25 }, + + { items = { "default:gold_lump 5" }, rarity = 10 }, + { items = { "default:coal_lump 10" }, rarity = 10 }, + + -- default drop must be placed last and have rarity of 0 to avoid empty drops + { items = { "farming:gingerbread_cookie 5", "farming:candycane 10" }, rarity = 0 }, +} diff --git a/depends.txt b/depends.txt new file mode 100644 index 0000000..4ad96d5 --- /dev/null +++ b/depends.txt @@ -0,0 +1 @@ +default diff --git a/init.lua b/init.lua new file mode 100644 index 0000000..01269ba --- /dev/null +++ b/init.lua @@ -0,0 +1,243 @@ +-------------------------------------------------------- +-- Minetest :: Giftbox Mod v2.0 alpha (giftbox) +-- +-- See README.txt for licensing and other information. +-- Copyright (c) 2016-2017, Leslie Ellen Krause +-- +-- ./games/just_test_tribute/mods/giftbox/init.lua +-------------------------------------------------------- + +giftbox = { } + +dofile( minetest.get_modpath( "giftbox" ) .. "/config.lua" ) + +local box_colors = { "black", "blue", "cyan", "green", "magenta", "red", "white", "yellow" } + -- black = black + grey + -- blue = blue + magenta + -- brown => yellow + -- cyan = cyan + yellow + -- dark_green => green + -- dark_grey => cyan + -- green = green + red + -- grey => white + -- magenta = magenta + cyan + -- orange => red + -- pink => magenta + -- red = red + green + -- violet => blue + -- white = white + grey + -- yellow = yellow + green + +minetest.register_node( "giftbox:giftbox", { + description = "Gift Box", + tiles = { "giftbox_top.png", "giftbox_bottom.png", "giftbox_side.png", + "giftbox_side.png", "giftbox_side.png", "giftbox_side.png" }, + is_ground_content = false, + groups = { choppy = 2, oddly_breakable_by_hand = 2 }, + sounds = default.node_sound_wood_defaults( ), + + after_place_node = function( pos, player ) + local owner = player:get_player_name( ) or "singleplayer" + local meta = minetest.get_meta( pos ) +-- meta:set_string( "owner", owner ) + meta:set_string( "infotext", giftbox.present_infotext .. " (placed by " .. owner .. ")" ) + end, + on_construct = function ( pos ) + local meta = minetest.get_meta( pos ) + meta:get_inventory( ):set_size( "main", 1 ) + meta:set_string( "oldtime", os.time( ) ) + meta:set_string( "newtime", os.time( ) ) + end, + can_dig = function ( pos, player ) + return not minetest.is_protected( pos, player:get_player_name( ) ) and default.is_empty( pos ) + end, + allow_metadata_inventory_take = function( pos, listname, index, stack, player ) + if not default.is_owner( pos, player ) then + return 0 + end + return stack:get_count( ) + end, + allow_metadata_inventory_put = function( pos, listname, index, stack, player ) + return 0 + end, + on_metadata_inventory_take = function( pos, listname, index, stack, player ) + if default.is_empty( pos ) then + minetest.remove_node( pos ) + end + minetest.log( "action", string.format( default.STATUS_CONTAINER_GET, player:get_player_name( ), "giftbox", minetest.pos_to_string( pos ) ) ) + end, + on_open = function( pos, clicker ) + local pname = clicker:get_player_name( ) + local spos = pos.x .. "," .. pos.y .. "," .. pos.z + + if minetest.check_player_privs( pname, { give = true } ) then + local slot, name + local formspec = + "size[8,6]" .. + default.gui_bg .. + default.gui_bg_img .. + default.gui_slots .. + "label[1,0.8;Select an item to place in the gift box.]" .. + "list[nodemeta:%s;main;6,0.5;1,1;]" + + slot = 0 + for _, name in ipairs( giftbox.present_items ) do + formspec = formspec .. "item_image_button[ " .. ( slot % 8 ) .. "," .. ( math.floor ( slot / 8 ) + 2 ) .. ";1,1;" .. name .. ";add " .. name .. ";]" + slot = slot + 1 + end + return string.format( formspec, spos ) + elseif not minetest.is_protected( pos, pname ) then + local formspec = + "size[10,6.5]" .. + "image[0,0;12,6;" .. giftbox.present_greeting .. "]" .. + default.gui_bg .. + default.gui_bg_img .. + default.gui_slots .. + "list[nodemeta:%s;main;7,4;1,1;]" .. + "list[current_player;main;1,5.5;8,1;]" .. + default.get_hotbar_bg(1,5.5) + return string.format( formspec, spos ) + end + end, + on_close = function( pos, player, fields ) + local fname, item + + fname = next( fields, nil ) -- use next since we only care about the name of a single button + if minetest.check_player_privs( player:get_player_name( ), { give = true } ) and fname then + item = string.match( fname, "add (.+)" ) + if item then + minetest.get_meta( pos ):get_inventory( ):set_stack( "main", 1, item ) + minetest.log( "action", string.format( default.STATUS_CONTAINER_PUT, player:get_player_name( ), "present", minetest.pos_to_string( pos ) ) ) + end + end + end, +}) + +for i, color in ipairs( box_colors ) do + minetest.register_node( "giftbox:giftbox_" .. color, { + description = ( color:gsub( "^%l", string.upper ) ) .. " Gift Box", + drawtype = "mesh", + mesh = "giftbox.obj", + tiles = { "giftbox_" .. color .. ".png" }, + paramtype = "light", + visual_scale = 0.45, + wield_scale = { x = 1, y = 1, z = 1 }, -- apparently no way to set wield scale of mesh? + sunlight_propagates = true, + is_ground_content = false, + groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 1 }, + sounds = default.node_sound_dirt_defaults(), + paramtype2 = "facedir", + + selection_box = { + type = "fixed", + fixed = { + { -0.45, -0.5, -0.45, 0.45, 0.45, 0.45 }, + } + }, + + drop = { max_items = 1, items = giftbox.giftbox_drops }, + + after_place_node = function( pos, player ) + -- initial item string: Gift Box (placed by sorcerykid) + + local placer = player:get_player_name( ) or "singleplayer" + local meta = minetest.get_meta( pos ) + meta:set_string( "owner", default.OWNER_NOBODY ) + meta:set_string( "placer", placer ) + meta:set_string( "is_anonymous", "false" ) + meta:set_string( "infotext", "Public Gift Box (from " .. placer .. ")" ) + end, + on_open = function( pos, player, fields ) + local meta = minetest.get_meta( pos ) + local formspec = + "size[8,3]" .. + default.gui_bg .. + default.gui_bg_img .. + "button_exit[6,2.5;2,0.3;save;Save]" .. + "checkbox[6,1.6;is_anonymous;Anonymous Sender;" .. meta:get_string( "is_anonymous" ) .. "]" .. + "label[0.1,0;Personalize your holiday greeting (or leave blank for the default):]" .. + "field[0.4,1;7.5,0.25;message;;" .. meta:get_string( "message" ) .. "]" .. + "label[0.1,1.5;Recipient:]" .. + "field[1.8,1.9;3.5,0.25;owner;;" .. meta:get_string( "owner" ) .. "]" + + -- only placer of gift box should edit properties, not the receiver + if meta:get_string( "placer" ) ~= placer then + return formspec + end + end, + on_close = function( pos, player, fields ) + local placer = player:get_player_name( ) + local meta = minetest.get_meta( pos ) + + -- only placer of gift box should edit properties, not the receiver + if meta:get_string( "placer" ) ~= placer then return end + + if fields.is_anonymous then + -- in next version of active formspecs, we should save checkbox state + -- in form meta first rather than directly to node meta + meta:set_string( "is_anonymous", fields.is_anonymous ) + + elseif fields.save and fields.message and fields.owner then + local infotext + + if string.len( fields.message ) > 50 then + minetest.chat_send_player( placer, "The specified message is too long." ) + return + elseif fields.owner == placer then + minetest.chat_send_player( placer, "You cannot send a gift to yourself." ) + return + elseif not "" and not string.find( fields.owner, "^[_A-Za-z0-9]+$" ) then + minetest.chat_send_player( placer, "The specified recipient is invalid." ) + return + end + + -- item string with message: Dear sorcerykid: "Happy holidays!" (placed by sorcerykid) + -- item string without message: Gift Box for maikerumine (placed by sorcerykid) + + if fields.owner == default.OWNER_NOBODY then + -- public gift box + infotext = fields.message == "" and "Gift Box" or "\"" .. fields.message .. "\"" + else + -- private gift box + infotext = fields.message == "" and "Gift Box for " .. fields.owner or "Dear " .. fields.owner .. ": \"" .. fields.message .. "\"" + end + + if meta:get_string( "is_anonymous" ) == "false" then + infotext = infotext .. " (from " .. placer .. ")" + end + + minetest.log( "action", string.format( default.STATUS_SIGNATURE_SET, player:get_player_name( ), fields.message, "giftbox", minetest.pos_to_string( pos ) ) ) + + meta:set_string( "owner", fields.owner ) + meta:set_string( "message", fields.message ) + meta:set_string( "infotext", infotext ) + end + end, + } ) + + minetest.register_craft( { + output = "giftbox:giftbox_" .. color, + recipe = { + { "wool:" .. color, "farming:cotton", "wool:" .. color }, + { "default:paper", "default:mese_crystal", "default:paper" }, + { "wool:" .. color, "default:paper", "wool:" .. color }, + } + } ) +end + +minetest.register_alias( "mt_seasons:gift_box_brown", "giftbox:giftbox_yellow" ) +minetest.register_alias( "mt_seasons:gift_box_dark_green", "giftbox:giftbox_green" ) +minetest.register_alias( "mt_seasons:gift_box_dark_grey", "giftbox:giftbox_cyan" ) +minetest.register_alias( "mt_seasons:gift_box_grey", "giftbox:giftbox_white" ) +minetest.register_alias( "mt_seasons:gift_box_orange", "giftbox:giftbox_red" ) +minetest.register_alias( "mt_seasons:gift_box_pink", "giftbox:giftbox_magenta" ) +minetest.register_alias( "mt_seasons:gift_box_violet", "giftbox:giftbox_blue" ) + +minetest.register_alias( "mt_seasons:gift_box_red", "giftbox:giftbox_red" ) +minetest.register_alias( "mt_seasons:gift_box_green", "giftbox:giftbox_green" ) +minetest.register_alias( "mt_seasons:gift_box_blue", "giftbox:giftbox_blue" ) +minetest.register_alias( "mt_seasons:gift_box_cyan", "giftbox:giftbox_cyan" ) +minetest.register_alias( "mt_seasons:gift_box_magenta", "giftbox:giftbox_magenta" ) +minetest.register_alias( "mt_seasons:gift_box_yellow", "giftbox:giftbox_yellow" ) +minetest.register_alias( "mt_seasons:gift_box_white", "giftbox:giftbox_white" ) +minetest.register_alias( "mt_seasons:gift_box_black", "giftbox:giftbox_black" ) diff --git a/models/giftbox.obj b/models/giftbox.obj new file mode 100644 index 0000000..469df81 --- /dev/null +++ b/models/giftbox.obj @@ -0,0 +1,62 @@ +# Blender v2.78 (sub 0) OBJ File: '' +# www.blender.org +mtllib present.mtl +o Shape1 +v 1.000000 -1.000000 -1.000000 +v -1.000000 -1.000000 -1.000000 +v -1.000000 1.000000 -1.000000 +v 1.000000 1.000000 -1.000000 +v -1.000000 -1.000000 1.000000 +v 1.000000 -1.000000 1.000000 +v 1.000000 1.000000 1.000000 +v -1.000000 1.000000 1.000000 +v -0.707107 1.000000 0.707107 +v 0.707107 1.000000 -0.707107 +v 0.707107 3.000000 -0.707106 +v -0.707107 3.000000 0.707108 +v 0.707107 1.000000 0.707107 +v -0.707107 1.000000 -0.707107 +v -0.707107 3.000000 -0.707106 +v 0.707107 3.000000 0.707108 +vt 0.2500 0.0000 +vt 0.5000 0.0000 +vt 0.5000 0.5000 +vt 0.2500 0.5000 +vt 0.7500 0.0000 +vt 1.0000 0.0000 +vt 1.0000 0.5000 +vt 0.7500 0.5000 +vt 0.5000 1.0000 +vt 0.2500 1.0000 +vt 0.5000 0.5000 +vt 0.7500 0.5000 +vt 0.7500 1.0000 +vt 0.5000 1.0000 +vt 0.0000 0.0000 +vt 0.0000 0.5000 +vt -0.0000 0.5000 +vt 0.2500 0.5000 +vt 0.2500 1.0000 +vt -0.0000 1.0000 +vt 0.0000 0.5000 +vt 0.2500 0.5000 +vt 0.2500 1.0000 +vt 0.0000 1.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 -0.0000 1.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -1.0000 -0.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.7071 -0.0000 0.7071 +vn 0.7071 0.0000 -0.7071 +usemtl None +s 1 +f 1/1/1 2/2/1 3/3/1 4/4/1 +f 5/5/2 6/6/2 7/7/2 8/8/2 +f 4/4/3 3/3/3 8/9/3 7/10/3 +f 6/11/4 5/12/4 2/13/4 1/14/4 +f 6/15/5 1/1/5 4/4/5 7/16/5 +f 2/2/6 5/5/6 8/8/6 3/3/6 +f 9/17/7 10/18/7 11/19/7 12/20/7 +f 13/21/8 14/22/8 15/23/8 16/24/8 diff --git a/textures/giftbox_black.png b/textures/giftbox_black.png new file mode 100644 index 0000000000000000000000000000000000000000..63ecf577397d38cf9c8d6bf1ba98ea74e6d91e5c GIT binary patch literal 2452 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 literal 0 HcmV?d00001 diff --git a/textures/giftbox_bottom.png b/textures/giftbox_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..4181d0cb892bcedc3669f2283818ec715411cad5 GIT binary patch literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sDEfH31!Z9ZwBpo6E2V~B-+@||Bk-|U%1D&AY3-Ej4&$SLK% z^Gr#5yz|((4P2Zwf`0f2i2ZDsn0S$UhxiG`#fb(|Yzjck!^7Yxo?OXjux1j_ECx?k KKbLh*2~7YTzb^Cu literal 0 HcmV?d00001 diff --git a/textures/giftbox_cyan.png b/textures/giftbox_cyan.png new file mode 100644 index 0000000000000000000000000000000000000000..696e4fca8264a920856f06433583e7ee96c11d4f GIT binary patch literal 3175 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 literal 0 HcmV?d00001 diff --git a/textures/giftbox_magenta.png b/textures/giftbox_magenta.png new file mode 100644 index 0000000000000000000000000000000000000000..e98686204c5c9b5d67168156577b2e96aa45cef3 GIT binary patch literal 3155 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 literal 0 HcmV?d00001 diff --git a/textures/giftbox_red.png b/textures/giftbox_red.png new file mode 100644 index 0000000000000000000000000000000000000000..72becf5691382c733e74aff1f3b2542b49eb82a0 GIT binary patch literal 3067 zcmVY_gC9EI>LOc|Lgpdbez<@!NQ5blZke~>Y2uDe~?Cy4TSJk=a zvCn=j2K%0}#fa{Kw`y?islE4EYwz`~?^}!TnB$eFo+_m%t)-MP1f}(GdHIc>`=^VG zt6zHOC8bn-$;>$=65^c)4%hTu z?}ZT7xtx+VMhF2Q%ri6RoO8~l6cU0<8Gr}~AOQqOKm$MmSgocTKmh<4k3H1mE-=<6 zA(YnhGzlR}DIfwMgeW-^k+Bv)DW&9GN-;nHETDi0D1ZUxOvD6ifB}#|1~x!>d z00WorzH8f-b5_R05azy@T3=rF0F*IODL;<$e!snWGshT1@XX8lr5Yp&n5LOX7~m~t z4J4oe!s_Q^4SN5NTLM?d;k!!X>t_nYiGKC{~ajI2_T||*%Qe%^1+;ljB`!SB}NZWDX%=?4cxi&XUE68&8B_$ z@Yk6iF#qGNTYr4#&eOMV-}>e^|5K^oP3emO9zD8DDL;C2NkrA+lv1_Z7*n@m=F`)Y zl(JHiITA@C1(4Pf*ucB&9}e(UymN$0}lN1+55jU4}-RrgaA-d0`S+{m#1m^{P>4b>l`DOqLZsh>EmLO zK&(-o5CBW~3V$Kz@>%gE2Y4W_D9^w@Kd}Q>SJTna(RaS{#z#K#p`0&IPJY}u_x9WO zzyJOJ20ZiM9#Ajk@#*P2jwPkd(NPS6nRmO6nZtv*bFT7Q&Utfm6uf_Go+rQp3(x=_ zn3(~@7&D@SEYlh^5@108A4LBD z9eDQHS8v?dedaU2;GFrtetyyS z!wWC`gb;N1?%kuKPD;7ioB(bZX788RU;oB~2QO8Ppp+t_lCy1^{lx{XIcIxv;^!HF zR7x2WmPH6*R^zHns9Hz}BZL-f9xOlvCLli<4>145+1an0oqdn!2oTKajW>P}?(FPd zO^X1yl(=--+8m=F$5INHl46{$u3Xn?YlmSvJG&>9l1il*b4n?MDoCHXd2`)F_z5Dhv=h8T*tj#e>t+^Bu;!jH9QgTXCskki0xv}rR_S0W^>#cWw z`N2!O8#g#-5D6)x_qJ_SPN}MZT7qyXuIreYnM=-Lo|Q2v1QG(wLQ0`j34w%Yce@k< zfMuF0HY&Ke6fTuzxxU{VAD5h&**Hf;wrxu(^%SI1(R-;B=Pb3Z7U!HRu8ecqx!Cu0 zpKiNN%c88UWl707crWxypA~#=vl*_gYV4*ET-OOHrPj@M8$(#8$qz%xIW9|>=aMrC zk#bHcl~Sg8mQr#l+FE5y^d8J}-^XPE&}_HbTB-H8-&YEcKs_njwo>b|y3M7e5R}$J zDL)KWh!`V)dB3kkk`Q9v@3|CZjFMW<7Z)XG?c525w zBDFrcb*rv#w%f}G4?;*WMgo{wX`N$S=9!43l*_UJFij(bs5NH_A%p~=05#CLl#;V; z+Z2M363kNTWtv>q`C$k#dLJqjr@pV#s`^q|3#E09xq56wlya`O>Blk0Xq$$Jh)5Ze zV-!M^l!EsuM(tdRk%6i}wbpT2n7Nc<+qT(m58xq6%M#`}crTU8R~ zflFDuuYhdYHl~z9n1IX6K7<%zG+O&{+?QfQIH-?LfBIjiX=di8an_ogGZE!nn7K;j zdG7+2TQYxi1O*1ogyKb6h08QiSgLBqe!-s*CQk_4~ zKBc_dbs>bhe~dBbQunWuD_7PY!Zgh}m(8XLAy#1g26G{*g^@Tk4LGj)3M+v!pldM> zFhIF>Xd=1x93*ohQb1w8F7a!hrL4uhAQJ0L!JLT{^Yw1LF5&f0 z0ZhNARP8tM%IXF98~6LuH2$i1HLWCHn^XKg)fH9+FMuy^Uf%EbpBJyTKm_Q0U7-3L z00rpP(!X#2U>N#e6JNr*p(bndanh=OcJ9k}_`f=<+I5|01O57f#>pC#kOwFa3 zrV&lo)m%1RT^-0vYauA5QduE|z@;=@M?{s0UDx?>tOUfR2q^)iluIe5X_jfK#6(2f zlardk+TBiD+wOL*>s;FsQ3y!_CFh!ga*T0Vl-9LxIrY6C$9fja0ha7nWl*(nT$bp) zIOwxdn(cO(rkWoCXf1^hLI@I~cCsq3)i>JOlCvL2(=;(gAxJ4Hm74eaDw%SOW8deT zr@k+x#AP8Ns&B(I2|>mv>s(ER^>U`Wo80$jKjr6j literal 0 HcmV?d00001 diff --git a/textures/giftbox_side.png b/textures/giftbox_side.png new file mode 100644 index 0000000000000000000000000000000000000000..53bd4abede77d653dac0e3d49ec8101daac758b5 GIT binary patch literal 97 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|8lEnWAr-fhQzE`3ef(t0!^5+2 uqF!{Y&wbVHkJF6}Cvdo#_GC#|Nin1x6j*ie(mP3@9tKZWKbLh*2~7ZYn;Y2x literal 0 HcmV?d00001 diff --git a/textures/giftbox_top.png b/textures/giftbox_top.png new file mode 100644 index 0000000000000000000000000000000000000000..5e54c884a9682f60af162228da5b3ed0653403f9 GIT binary patch literal 282 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sDEfH31!Z9ZwB;CfFN#}EtuFVdQ&MBb@0Ls>0WB>pF literal 0 HcmV?d00001 diff --git a/textures/giftbox_white.png b/textures/giftbox_white.png new file mode 100644 index 0000000000000000000000000000000000000000..c9b47e7534c4de8dadafd98da3d106d42f9eb09f GIT binary patch literal 2313 zcmV+k3HJ7hP)6h4nBzEQSt_NhwMwa}si`g5<8IXfOs}d+DdqdVF-B{xwRRk* zsw&5Ej4{R-tg+T+S=KZS-YTU$&+|O5u4|%z>7M7|v$OTb+wum_BgVa9a~y{Nv%qm2 zGGMI@f}kwRAPBV9WXxL22c=XT$61zXt(&Gvl7tiftpkL)swxb{zIMA^mL)N6nue9u zTGw^MFs$pkX&PgU>$+O&FbtJaN-2CM3UM6gdG5MfMufYKtQli`-?!ERhNfw(wQFl@ zQ51n6KotZ55CU&NMJZJjh41@7u`EktjOTe}SrU$a?ttfcFqMZed!EvTGf<3v#u$8opYHO9no97PdH2!enG{}w`7mcd=fP!xshx~r?J@EdNF zWf{jY9u`G`^;+w0w_BEF(=?#P_x+`%CDIs0k*wU(qk6wgO-*^8clYky-XE`DzrL}t zar^ddzTUifv#Kg`jS$s!U6y5%B&ZF6m+g-pJ!+Z;dL&7b=Q%)vuT@orVHn3T3agZQ z`0(L2GjQd~m7$@b{{H?`r%o*`Exmd3=F+80yLay%A0L1H`t{`GbeHpp6B_#uaweS_x1Hbn^vo}xw+|ip0zg5bD+2lCH?C_Q4~c{ z96EGp-@bkK?%j*y_{fnXgM))FU%veD;|Jp7IL`6o$BUvMiV)gyocs6hcRHQP$w>qe ze#71I@o@wc56Rxl%#1N+Vqzi;!=flSgotcE18JHL4i3J0^=kkA{q1&p@7}$wR_p86 zukYW#?{qq^UcLH*Ii>pg`gm&`$8}vhjx#VYfVzvk0HnIEM@L8VJV$L|bDrmbhZ86f z#GasRM}@9kyVh>E7Z(@Hvi$Yy*PcCl+U@p>7cXAEe7Ul+a`5268#ivqo~CJ}pwde0 z*s%i<#1tt7Q50Eg!!YDCNP{7)!BxN`S>3V&SFc_j9v(h-?pzp#i;Ihki;GE;96NUG z)2B~AfBrmq^5lU72m1Q@E?>UPD=`skT-Q}fwOXyREW6#V{{I0##uy5AS(f|=wAjT1 zuH65h?KtrH^XKK|<#xM$`0!z+)WX8T;NYO=c_SkuQ52w4$Tol?=FD8f*TuByuSeaZqr&$5i8ilP8f z_$gAcWe&j6cDuc{wgwH-G)$5=oTfIBeNQ6>}U%J$dp3_Q1%ZC>+Om`}Xbk@86L{j6l>WRo2?xX46_bJ3IUB z+qW}k&R_}-kO3MV3av=f+}zy4!otMF1Y#f~1X<;987+#Uc=ztz!otGo)2Cal7R3jH zgCKB?F?C&I4S(qrB+?XG&J~_1rNS`ueZO}MKwH=-5wh0O$$xfDKgaiU$C2n9MQwUZDL6D}Yq?LE`FCxM@1Ojt6 zH#aetrcg>GA}fVLaM+AITp67vY<^)!vtvHsZsn&XPa}&Z4Bc&8=5}hg0#Z|ViudkB| z_>kwhjD+gety@`^S!6vlHTcb>bf2o8R>L7Xb9s7gB7yFUz&n6O|7+qgM(D7 zBuV%XMG<2=Arxzf)X>ln^8lbV#)M%g>wznw%(ASm>;C?Ju&%kP|04c zkVzaTVG@EM3uV1`)Q7)R~W~nSo zR2B3ZW3nuJ`t<3>#>UyRX9;3&rT0K~tJT6q$8k0`Hg@gW)o!;31_mVR=m1VvRfVBM zuBxih(NW*`hlhs&H1MMdrHYA05zDc$u`mq7Fyy_2Q_OH6IY?8QVMk=SA4)>!8BCnWc-mXNQUV=&!IBz z;R#F=@xau-?KCj}i@lWUy^2FsPz<&}jNUGi-BbreN1Mc^R~h|JTx zowC66BfY28U`ebiH?@5K+h;4)t4_cJm855;zb9>!Uw!PSp*xtSX<|#jCZm9(^dM6w zq7w&#*dgjrLI!cDjS!V6KG2DR5S%DJG7^Ozh0r0yXk(My+qe7nl@$rRBO!`tFizdW)EX&4DYS+dWw&d8^8z6F`FHU2(;7fZLIe>gg*V=qA89=5Q3JRd zdQwVxA8KW5ol*)w&QU~at+m$H8j%ud$D@=2t-&lr&>GH>us~ofr6fwhTGAQ-MDWPt zdDI7-^UTT^yRM5;s7(*ct z2%yWPB0_5z23i&=MLzKW0MyFXdJ%EXrxclsKrZ$do6Yr}Kh`>9>@bWXay&}TLIff> zM@k_^Axor5Ys4t6UFH%1@97f{z&Wp!W-hfdGmA8>jaGVIXXcVp>@7kg!tR>F<0RE-+%u4$@OWR&VTD%K9KZh>FGC~e)cDxJ-c=Go$r5V`ua3~ zZ3b|Ecb_Yt@6L&+kC-d>aXagJS0ZwD97fL0m6 zH~l!T^XoZkZMp>6^Lr_+MD*E@mDb2vL=Xa}Bq7jW+>qAVFMgy#pcsW&lp-Q9%U?cr z0Q+Ts?d00`{{4F|{NxLDS8sgkMhM}(d+)vdA8*Sl=?^c{Qz?Dz+O2h+TdUJ_Qc4z) zlg&w!miOnI&9&}pwbp4m$vHjwq*@laeqH4(!$2|0vIu}u3Nyx0IR~vTGnq&|rV4%L zo1ftw-~I4zF8TiM{;lV3T|Bt>?)Sg@=38&dxjggIGoSyf&p%8L=F)|-lx&PS9(S8@ z10aNrF}AhJTzboC+KOC?<3qJEh5$$vrAR4=Kx-0#wS7?^J%AVf;Dzfa*T4AM7rpbh zKe+wD#~)0?^o5`O!jJ#!$L(Hw<>y{`@%a~rFg*Kv&jQd|_ZWy&YgKDQMB^})Qs()A zweBjmq?D?aJLlvq*7m=Yvp@lahvrbqWiU!TRsiq)=)I3FKH4AlpL^+Ziq!2pw@){x zTI=!VNP&*)F{b$DzrOkIZ@k+X!5BkCtyS-b!(sPu-M8E8F|Gi#HpbYTlTyk#()!YL zyO>%F?XAN{brUF3ntQQrB%JMZXs zWV!6xS{LIo3{zJjV=Mq>e&WUx>cP2l{&3h$)7Dz&9JSUuY+lg>03o6}R{++kl%!*v z_oOv)eq0vnH7Yx47YzmJqa?Fn04$^k6w)83ha4dy%W|COLr2k^qcLU(!?GOKbsmPP z)>=xwsu|P@k;^au5P`oyIsb7i)da z>p%R|Pv3s;_OBc-oD0UdT3Kr&BHd3!TEA0DaxTpC{-0j_nLF>_`Q_dD$;ma529Q#! zl;r(jYUNG=onEfSBqGvU&3QG(F=rwLh*DZ9-C2Jew_R;gT6%5t;_i?3u>1XKI&H0r zh;xC6ydPU@eHQvCwKiAZvva=I+Uv@>V6E?n+FILew#?ZW*9Y8M%Q-1~WuIMPLYR)n z2R(P0a|j!ywAOYQHl^g0mKf*OYAGq_*f#*om6@BgWm&b>BF$Q7j4LGpvaW}oPQ$RV z)@g0#`Oq!A6!e+$e&`F^!xjZJ#$2fbhODO=>^+2RLs;uj=^O(`vtn02dZ>_&H z6T-4Ctu>`|j7MXfQi{1~Z9*8eHm%hM56-RiT`ofy=4Do-h`?N!i!s(1Q%WLIAxv89 z7#F2fAEozUUgo|&56Qf5iIj3Ft;RSaVrJ%St*@11irwa{b-l6o1ArJ8lhV4~USF0& zDajaTtCOK9Fl=_ak22@Ng$N>IjIEVBM`*26$~_sB zQhm?KoHJ(ttw~QIk=8|-xhSOp(b}f8gfPW8=Uifr07Tld9K0WybFUU-tTM*-oHNFC zfoHCLHDjD>W$yPOilmiO3ieQzRnqy!XCcT_R$PVdiCB1ah)DS=I%> z5QhFG_~5;ltBaX?`!%jy`DAmFbMF0@QfjNc|K7NJWj{k$)}^*O4O1=|0EMpxRFESn z0u2bzfC326H!a)^>5}Q8fCea_0A0Y+6~`MufPS*j00S660}L3T02XKfU+!-}fCd`S zu6ovh2Fle__Ui2wmm3BGhTv!{KmvebwVgrGN;f2niVhRTM^9#TZzkTA>vF~$oSqKdH36KTpFef$sSA7YL@ixC zl+w#`n5M2p65~8gr?qkyjg*$N8)weACr`PHU29b-O+*h{<{UdKGiMQ;-8l2s5BvS; z=_w$sHEUh1br>=cS?eEeN@H9$n|$;1rcvf>TtnCZ!d#4TBF(v=hGFU!xGZ}B%q0Y? zNO9|v~*)4qV4v2SFmy1TI*qDRw<>F zB2xV%tNWr-s!vjDHO9rcP)bpxjP9Oz?AB8&&-1?4x-5s*S}B=GrL=lK9FL14<&5(_ zbe-snqqQMYA&m39cW&sf6Omelh=L8yk@w@nvi5!?QmRXDH#X-&Yt^|>xb(BmZXY78 z6Nt5*nNwOi?F_?|(&~MvtrF4UaP)p0$1On4`ElH)v>0QZ^IDsZF}=^ig@|H|SNW!{ z98C^~`_?*RjB}nyc|RzHjvlQ+Yn{^CkEeRriik?-s4T5DW1QBe7egOq&m!jRoNukR zR(qx?rRRBXjO#=sB1EW_kH=lDrJs#&c@hj8mzGZa+Z`9rF1Eoxp+Ss zW3;y2$YNYN?Sx=@%pnXNtB7b_=hhl?R;6TXeM)Qp{Xd*dB!bQn##m!)j7w{+lr)ap zTFbH=ydP>UJx%~h!8vb?>s8TL*%&L*LKsDwwZ7KccWnT+TkrkQqXJNCskL@dS(XD4 sITvzH%(agvrBy`6ahr2=F7!_R8zvr?3UW(k)c^nh07*qoM6N<$f@vxaF#rGn literal 0 HcmV?d00001