From 98816ffce14df5c3a8180439a536d05c46d3e4db Mon Sep 17 00:00:00 2001 From: Jean-Patrick Guerrero Date: Sun, 28 Feb 2021 22:12:18 +0100 Subject: [PATCH] Add more nodes --- LICENSE | 16 +-- handlers/helpers.lua | 2 +- src/nodes.lua | 28 +++++- src/recipes.lua | 30 ++++++ src/workbench.lua | 142 ++++++++++++--------------- textures/xdecor_candle_hanging.png | Bin 0 -> 15657 bytes textures/xdecor_radio_back.png | Bin 0 -> 1184 bytes textures/xdecor_radio_front.png | Bin 0 -> 1208 bytes textures/xdecor_radio_side.png | Bin 0 -> 15650 bytes textures/xdecor_radio_top.png | Bin 0 -> 1214 bytes textures/xdecor_rooster.png | Bin 0 -> 1322 bytes textures/xdecor_speaker_back.png | Bin 0 -> 1172 bytes textures/xdecor_speaker_front.png | Bin 0 -> 1239 bytes textures/xdecor_speaker_side.png | Bin 0 -> 1172 bytes textures/xdecor_speaker_top.png | Bin 0 -> 1187 bytes textures/xdecor_wooden2_lightbox.png | Bin 0 -> 15686 bytes 16 files changed, 128 insertions(+), 90 deletions(-) create mode 100644 textures/xdecor_candle_hanging.png create mode 100644 textures/xdecor_radio_back.png create mode 100644 textures/xdecor_radio_front.png create mode 100644 textures/xdecor_radio_side.png create mode 100644 textures/xdecor_radio_top.png create mode 100644 textures/xdecor_rooster.png create mode 100644 textures/xdecor_speaker_back.png create mode 100644 textures/xdecor_speaker_front.png create mode 100644 textures/xdecor_speaker_side.png create mode 100644 textures/xdecor_speaker_top.png create mode 100644 textures/xdecor_wooden2_lightbox.png diff --git a/LICENSE b/LICENSE index 8b744c6..a026df4 100644 --- a/LICENSE +++ b/LICENSE @@ -1,15 +1,17 @@ ┌──────────────────────────────────────────────────────────────────────┐ │ Copyright (c) 2015-2017 kilbith │ -│ │ -│ Code: BSD │ -│ Textures: WTFPL (credits: Gambit, kilbith, Cisoun) │ -│ Sounds: │ +│ │ +│ Code: BSD │ +│ Textures: WTFPL (credits: Gambit, kilbith, Cisoun) │ +│ Textures (radio, speaker, hanging candle, rooster) by │ + gigomaf (CC BY-NC 3.0) │ +│ Sounds: │ │ - xdecor_boiling_water.ogg - by Audionautics - CC BY-SA │ -│ freesound.org/people/Audionautics/sounds/133901/ │ +│ freesound.org/people/Audionautics/sounds/133901/ │ │ - xdecor_enchanting.ogg - by Timbre - CC BY-SA-NC │ │ freesound.org/people/Timbre/sounds/221683/ │ -│ - xdecor_bouncy.ogg - by Blender Foundation - CC BY 3.0 │ -│ opengameart.org/content/funny-comic-cartoon-bounce-sound │ +│ - xdecor_bouncy.ogg - by Blender Foundation - CC BY 3.0 │ +│ opengameart.org/content/funny-comic-cartoon-bounce-sound │ └──────────────────────────────────────────────────────────────────────┘ diff --git a/handlers/helpers.lua b/handlers/helpers.lua index c80d9ae..dc14b24 100644 --- a/handlers/helpers.lua +++ b/handlers/helpers.lua @@ -52,7 +52,7 @@ function xdecor.stairs_valid_def(def) not (def.groups.not_cuttable == 1) and not def.groups.wool and (def.tiles and type(def.tiles[1]) == "string" and not - def.tiles[1]:find("default_mineral")) and + def.tiles[1]:find("default_mineral")) and not def.mesecons and def.description and def.description ~= "" and diff --git a/src/nodes.lua b/src/nodes.lua index fae8aba..2c62503 100644 --- a/src/nodes.lua +++ b/src/nodes.lua @@ -143,7 +143,7 @@ xdecor.register("candle", { animation = {type="vertical_frames", length = 1.5} }, { - name = "xdecor_candle_floor.png", + name = "xdecor_candle_hanging.png", animation = {type="vertical_frames", length = 1.5} }, { @@ -397,6 +397,15 @@ xdecor.register("ivy", { sounds = default.node_sound_leaves_defaults() }) +xdecor.register("rooster", { + description = S("Rooster"), + drawtype = "torchlike", + inventory_image = "xdecor_rooster.png", + walkable = false, + groups = {snappy = 3, attached_node = 1}, + tiles = {"xdecor_rooster.png"}, +}) + xdecor.register("lantern", { description = S("Lantern"), light_source = 13, @@ -418,6 +427,7 @@ xdecor.register("lantern", { local xdecor_lightbox = { iron = S("Iron Light Box"), wooden = S("Wooden Light Box"), + wooden2 = S("Wooden Light Box 2"), } for l, desc in pairs(xdecor_lightbox) do @@ -609,3 +619,19 @@ xdecor.register("woodframed_glass", { groups = {cracky = 2, oddly_breakable_by_hand = 1}, sounds = default.node_sound_glass_defaults() }) + +for _, v in ipairs({"radio", "speaker"}) do + xdecor.register(v, { + description = v:gsub("^%l", string.upper), + on_rotate = screwdriver.rotate_simple, + tiles = { + "xdecor_" .. v .. "_top.png", + "xdecor_" .. v .. "_side.png", + "xdecor_" .. v .. "_side.png", + "xdecor_" .. v .. "_side.png", + "xdecor_" .. v .. "_back.png", + "xdecor_" .. v .. "_front.png", + }, + groups = {cracky = 2, not_cuttable = 1}, + }) +end diff --git a/src/recipes.lua b/src/recipes.lua index ec51ee0..10fd33a 100644 --- a/src/recipes.lua +++ b/src/recipes.lua @@ -180,6 +180,30 @@ minetest.register_craft({ } }) +minetest.register_craft({ + output = "xdecor:radio", + type = "shapeless", + recipe = {"xdecor:speaker", "xdecor:speaker"} +}) + +minetest.register_craft({ + output = "xdecor:rooster", + recipe = { + {"default:gold_ingot", "", "default:gold_ingot"}, + {"", "default:gold_ingot", ""}, + {"default:gold_ingot", "", "default:gold_ingot"} + } +}) + +minetest.register_craft({ + output = "xdecor:speaker", + recipe = { + {"default:gold_ingot", "default:copper_ingot", "default:gold_ingot"}, + {"default:copper_ingot", "", "default:copper_ingot"}, + {"default:gold_ingot", "default:copper_ingot", "default:gold_ingot"} + } +}) + minetest.register_craft({ output = "xdecor:stone_tile 2", recipe = { @@ -267,3 +291,9 @@ minetest.register_craft({ } }) +minetest.register_craft({ + output = "xdecor:wooden2_lightbox", + type = "shapeless", + recipe = {"xdecor:wooden_lightbox"}, +}) + diff --git a/src/workbench.lua b/src/workbench.lua index 92aa2e2..66567f1 100644 --- a/src/workbench.lua +++ b/src/workbench.lua @@ -1,37 +1,19 @@ local workbench = {} -WB = {} +local nodes = {} + screwdriver = screwdriver or {} local min, ceil = math.min, math.ceil -local registered_nodes = minetest.registered_nodes local S = minetest.get_translator("xdecor") local FS = function(...) return minetest.formspec_escape(S(...)) end -- Nodes allowed to be cut -- Only the regular, solid blocks without metas or explosivity can be cut -local nodes = {} -for node, def in pairs(registered_nodes) do +for node, def in pairs(minetest.registered_nodes) do if xdecor.stairs_valid_def(def) then nodes[#nodes + 1] = node end end --- Optionally, you can register custom cuttable nodes in the workbench -WB.custom_nodes_register = { - -- "default:leaves", -} - -setmetatable(nodes, { - __concat = function(t1, t2) - for i = 1, #t2 do - t1[#t1 + 1] = t2[i] - end - - return t1 - end -}) - -nodes = nodes .. WB.custom_nodes_register - -- Nodeboxes definitions workbench.defs = { -- Name YieldX YZ WH L @@ -187,7 +169,7 @@ function workbench.allow_put(pos, listname, index, stack, player) local stackname = stack:get_name() if (listname == "tool" and stack:get_wear() > 0 and workbench:repairable(stackname)) or - (listname == "input" and registered_nodes[stackname .. "_cube"]) or + (listname == "input" and minetest.registered_nodes[stackname .. "_cube"]) or (listname == "hammer" and stackname == "xdecor:hammer") or listname == "storage" then return stack:get_count() @@ -232,7 +214,7 @@ function workbench.on_take(pos, listname, index, stack, player) local stackname = stack:get_name() if listname == "input" then - if stackname == inputname and registered_nodes[inputname .. "_cube"] then + if stackname == inputname and minetest.registered_nodes[inputname .. "_cube"] then workbench:get_output(inv, input, stackname) else inv:set_list("forms", {}) @@ -274,69 +256,67 @@ xdecor.register("workbench", { allow_metadata_inventory_move = workbench.allow_move }) -minetest.register_on_mods_loaded(function() - for _, d in ipairs(workbench.defs) do - for i = 1, #nodes do - local node = nodes[i] - local mod_name, item_name = node:match("^(.-):(.*)") - local def = registered_nodes[node] +for _, d in ipairs(workbench.defs) do +for i = 1, #nodes do + local node = nodes[i] + local mod_name, item_name = node:match("^(.-):(.*)") + local def = minetest.registered_nodes[node] - if item_name and d[3] then - local groups = {} - local tiles - groups.not_in_creative_inventory = 1 + if item_name and d[3] then + local groups = {} + local tiles + groups.not_in_creative_inventory = 1 - for k, v in pairs(def.groups) do - if k ~= "wood" and k ~= "stone" and k ~= "level" then - groups[k] = v - end + for k, v in pairs(def.groups) do + if k ~= "wood" and k ~= "stone" and k ~= "level" then + groups[k] = v end - - if def.tiles then - if #def.tiles > 1 and (def.drawtype:sub(1,5) ~= "glass") then - tiles = def.tiles - else - tiles = {def.tiles[1]} - end - else - tiles = {def.tile_images[1]} - end - - --TODO: Translation support for Stairs/Slab - if not registered_nodes["stairs:slab_" .. item_name] then - stairs.register_stair_and_slab(item_name, node, - groups, tiles, def.description .. " Stair", - def.description .. " Slab", def.sounds) - end - - minetest.register_node(":" .. node .. "_" .. d[1], { - --TODO: Translation support - description = def.description .. " " .. d[1]:gsub("^%l", string.upper), - paramtype = "light", - paramtype2 = "facedir", - drawtype = "nodebox", - sounds = def.sounds, - tiles = tiles, - groups = groups, - -- `unpack` has been changed to `table.unpack` in newest Lua versions - node_box = xdecor.pixelbox(16, {unpack(d, 3)}), - sunlight_propagates = true, - on_place = minetest.rotate_node - }) - - elseif item_name and mod_name then - minetest.register_alias_force( - ("%s:%s_innerstair"):format(mod_name, item_name), - ("stairs:stair_inner_%s"):format(item_name) - ) - minetest.register_alias_force( - ("%s:%s_outerstair"):format(mod_name, item_name), - ("stairs:stair_outer_%s"):format(item_name) - ) end + + if def.tiles then + if #def.tiles > 1 and (def.drawtype:sub(1,5) ~= "glass") then + tiles = def.tiles + else + tiles = {def.tiles[1]} + end + else + tiles = {def.tile_images[1]} + end + + --TODO: Translation support for Stairs/Slab + if not minetest.registered_nodes["stairs:slab_" .. item_name] then + stairs.register_stair_and_slab(item_name, node, + groups, tiles, def.description .. " Stair", + def.description .. " Slab", def.sounds) + end + + minetest.register_node(":" .. node .. "_" .. d[1], { + --TODO: Translation support + description = def.description .. " " .. d[1]:gsub("^%l", string.upper), + paramtype = "light", + paramtype2 = "facedir", + drawtype = "nodebox", + sounds = def.sounds, + tiles = tiles, + groups = groups, + -- `unpack` has been changed to `table.unpack` in newest Lua versions + node_box = xdecor.pixelbox(16, {unpack(d, 3)}), + sunlight_propagates = true, + on_place = minetest.rotate_node + }) + + elseif item_name and mod_name then + minetest.register_alias_force( + ("%s:%s_innerstair"):format(mod_name, item_name), + ("stairs:stair_inner_%s"):format(item_name) + ) + minetest.register_alias_force( + ("%s:%s_outerstair"):format(mod_name, item_name), + ("stairs:stair_outer_%s"):format(item_name) + ) end - end -end) +end +end -- Craft items diff --git a/textures/xdecor_candle_hanging.png b/textures/xdecor_candle_hanging.png new file mode 100644 index 0000000000000000000000000000000000000000..b8595a7ec119b61b6ab38201bb0cadd5d8fa8934 GIT binary patch literal 15657 zcmeI3du$xV9mgk1N{rKlR6&W;N@jIQODep#kK23f=I-EpXUA52!LeQ9l+v)bJ7+Js zyFGT-xr=EFqErf?N^OKlYtgDzD^VoEOGuS4Q6SV+K&@m`A*4`33o2^TR92{HN+ce$ z_gv524OYdUS4FK3UJd_$k-<#3`(6X)9_s;MH)l*tI+N)UMKkk$RW~!xU(Od%Zvdh~T`s7yJZE7(do z=Bwx`=(pR<`It%<=WxuIa1%0<=}{(WT966)L#)P!!c1893&C($3imN0F9bP0zy)|# z3@8$>NFr1F^ToT-uc)PGm9f-dEgiCAzG=rPDjZiTmHefE-?XMUL6&8X7dcU6Q4iKW zT5!}dTd;RjMd~^!Xls^HbPTh=xVmb_oN;14pPQ)hSG%r!F`aItD%dr8h$B~4i=5!+ zxqO~$7il|VusO)Kk@m#VBIL%PZO&L4MBR6^7aBN%MpwJqRR|3nfd!|n6q+-#P`muP z)`%(2Sh)&lUE^R5=20FSF%a4UC{CM>X-}ISQa0Qbi0u+PMz#Y$*V8c!mW>W!uBRGS zsj2EzM-h~CTDjFSQ2DF5l&Q_Q*EO7qBZpr%bR`_@?@uQC!y#cn6odh}KP4vRK_SsE zCL)p;9*lAwC7KmgOVdU^nc#y-o)3h1IpE6619CVih2&tOUyg)>QeEB?+9Eq#upPCa z!P=+|H0ppZXLTu(VPy>pEFY2tHX}fh4Fn^C8WJTzfSJ0qC%i>E1uf$U)CVmyUs)_g z)v}>mxG`V7avQ6wMzm7;iqSeIiRXDet3fsZBO9TJ#ES~g*N0l^)mg+gvrb91U}6d_ zy?FJ&7_ILgOfp$HAedbTjDl{K>~GdpSB7<#*QV9N6x8EfJ+R(@heSDd>T<@)nX9(0 zoX~o8v=)H7(v_qIRa6)grkPvK<=`RBaW&OoN_C)@G%qVsSP>hf8zR-7m`2*vjqFie z1D`Ed!_yPjKqtGdI_j!aynQ`7x~61JE3Z0nBd<s?blg|kmC@%)!+&EP6et#)IqmikI6UgRXEQTJGO4^p&-)yi%qM7fqW&s0@>lkO>!o2m2< zi|ByhIl=v`g?in1=s|L**NulZBfnKJoVZxahBbSl++Z++@l?w-mO!e+!{n4DM(fc(555LiYicWR*aVqZU}5IM1DJrL3#1=)M`JkWGq<%m?#QTo@3tNpX?+U|xy~ z141?_E;1j?OL1X9$R@=_=7V`DE({3Sq`1g@FfYZ00U?_d7nu*{rMNI4WRv0|^TE6n z7Y2lEQe0#{n3v+hfRIfhuI}bju&{t0eJ!D9T-i^2$I$b!j5aiu24ME<0NnRO06zK@ zeO~}zh6mu{od76517MqZ{LsQ60Bg`ggNcdqxl1RW-TTVu=0Bd^_QJZ6#ILtr7(H?P z^_$KY0usJ=PuhnSvP)s zPkR0S^NGK`{Pz5OY59Zqe#ty2J-d6~@2-FAw%F3(-nafbeQq5Cy59NPGfU5J`L|_k z>RuRoclOCIpZVvb7hV_dIQ!h9zVzW;UjoxV_ajf{8*_ciYbVbRe|ziPrAy^=YyW#| z=7puc=O1}(?R{OnSG#VzYjHky`P5e7x}Cpy`qVvVi?J7<5PGh@sJx@kZG82A!K>$) zT<`v096EF6Upqb+?0s`v{;8A8UGwiPUb*J=_~wUic>H_!{NTo`FTMSbgTIYL;_vo> zKJ!}RE6b0E{_v;AF3KuJ hqNCBCz47&6=fiz}&pi3SPWNHv;emarr~2=_|1(U#Dg*!k literal 0 HcmV?d00001 diff --git a/textures/xdecor_radio_back.png b/textures/xdecor_radio_back.png new file mode 100644 index 0000000000000000000000000000000000000000..35ee768f0e10a12594f85416ce2ba66a04c21372 GIT binary patch literal 1184 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuU%v{0TQqR!T z+}y-mN5ROz&{W^RSl`${*T~q)#K6kLNC66zfVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD#PU%0_}#n6BP2AO_EVu8M)o`HUDF34YC)x{-2sR(CaRb3oXS&*t9 zlvryA&s6}2k5wiXH#j?6 zI60db0Nw9m0dl{EqnoRxv7?crxr>FfrMaaNRBs9vzeDvJ;nb@Sbc{YIa*-k%CIn1D zASOKN0y*%+pPC0u@kPL--SsmCn7bGSJY5_^DsD{)I?Z>`LBw^LO2~yg6`{nZ8#jrT z{X3xl!zOyZL(W>8u&G|+Vo{6M$nsqe@k+XMZ_dv5#^2T44;MX}zxV@xmFVgagU?|P z-t!**&@4RV0)qn+w}k&RFQ?e+jb~=x%-VWxb;adI2g93plehEhhcn#%#P@Ha-?mVd zcjeaKU5x!bT`QcWZ+|b@*HPe*QSps2Y_{&FnLBgTCbKzIX|QfcUz(m}nq{wLV^zOJ zxboPm}Yg-owYC@$9kkvAowAUCR!!A7C-8W7s2C6QTI?ebs#y35H&y Vjbi1AEv}$4!_(EzWt~$(699t>kx~Ev literal 0 HcmV?d00001 diff --git a/textures/xdecor_radio_front.png b/textures/xdecor_radio_front.png new file mode 100644 index 0000000000000000000000000000000000000000..6300aa81ce94f317aae205199998973daaa66dd7 GIT binary patch literal 1208 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuU%v{0TQqR!T z+}y-mN5ROz&{W^RSl`${*T~q)#K6kLNC66zfVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD#PU%0_}#n6BP2AO_EVu8M)o`HUDF34YC)x{-2sR(CaRb3oXS&*t9 zlvryA&s6}2k5wiXHy9ci z8oHUgnVT89xPsm9W@&0+VQOq*=xFI|>0+S-)tiFF?@+xKIQ8lS9itD5T%^c`2?0|O zhzU=+Kn^_dr{)1ud=W5dzmJ{Z!oa|&;pyTSQgJKEhi_7X0_z5bjhnY_nV?|Lzy8AS za{b82$oqT$bBM5XF-STHooF)-%inp7=^}ed;*75%oh*h8&zy1@Uf12ad$;wt>e8jD zMMYga?(>Ztb6UEURv%a;yo7Oy=v9L?Z`}LeF?+ftXsEi~Iul>llJKMDSB9f4?-i~m z49=WMY(*y&xSeA7zJB@Ju75seUz?PjLR;s$4U6{t=w6VoeqY}Bem<*6V$+E^JO6xp zValk$+{@C%EXjXA-l5ZiW5cyy4O3Zmxs=W|J2Lk|K$8XEYF+{McJXPFKQ$NrIOy`7 zo%wLIk90#FgVDWxw|V>H#X5K$=D&QE!E`g;Zh!M~nGO+y1$l4(GYGnKseKk+5S{O}4GMJTDo|INNz;I~G9Ja%mtE53?iKnZd%Q~loCID7dmdyYF literal 0 HcmV?d00001 diff --git a/textures/xdecor_radio_side.png b/textures/xdecor_radio_side.png new file mode 100644 index 0000000000000000000000000000000000000000..cf6074062937f96cfe16e3afc3ad384b30a695ff GIT binary patch literal 15650 zcmeI3du$X%9LJ~iAE{|VghWHs90w8z-tF$~J(ugz(!1I!S4vx<6$SQo=i0S*x99Da zUJ(O|%ELzhMIM2~D4-#c5FsWY3gICdMTDpbF_lD&AXQKT1{1;Adw1?`tO{Aw$KzpG8)LIsP!EgNAJfI8C8mu_ zi)3~DP?Hi$TvybX$$Rx!$!&zCTOi(aL4vR)h zMrwL1%&)BEfLeQh95Ss?Q+pE-b>`nFcspDyyI9rLyYM(aA%itmTgOgW-eo==$bg(@Z)^6e4?VMe3 z*aV)P%-RH&Ef7if#597ctc3fEG#rA17kF2pMnO+p10|v?>f*3e3i}S#2?m9xn5K&{ z2{!qCXzf--kp-CxyThU^SvZ$lv_OYFWC^)gw?%Y{V#s3?Stl>17CAJ$NZPMTy~aVx zNXtk%z`9*Fm&@hk0xZV`Je~%R+i!EB#(RpHER}em+Rtn|8}(SL*mD<$}<>at=d&so1$j=w~Dp zRMy2v0V`t%{|)965(Se$YG{~7MML@1UogJ0Zlk!i!6%2dW*re_m>ZMZ9#qly2V%*lzmKg zW!VNi#LF047g7F;J2$+-Q?&8;67#2{^v>mr?Ehfr()&3y6|?1|ICZ_UB!tyORMdS+ zRP2IGJl5r9@{M_v-rQYWs8=Iu0^N(CkM}aAnhTCAbVqBgvLhf%j9 zy{Y~#8;d>+XZ&VD3*C5VCpomxjfdtVABict&z2btYc7Z~9x~D}+R%eF^f?_4-r;5N zW;~)rNy12nUqQD*%_wjjsy?Y0+)*;Hvs_?-BNLcD3I&hAsT@zYq6cjBY|rE#?u*ht zS6FZ5pZtn$r7EUH2f=`lO^S=m2lG-~7!a~aagq68UWy9?LN+NbG9S!KabZBnCdEbO zgLx?~3<%kzxX64kFU5rcA)6EznGfcrxG*4Olj0)t!Mqd~283)JkWGq< z%m?#QTo@3tNpX?+U|xy~141?_E;1j?OL1X9$R@=_=7V`DE({3Sq`1g@FfYZ00U?_d z7nu*{rMNI4WRv0|^TE6n7Y2lEQe0#{n3v+hfRIg!i_8b}Qd}4ivPp4~`Cwj(3j;zn zDK0V}%u8`$K*%N$S5^LXSr|j_$o8R^VaLB$Js!PCYmypUg8(eNAAluG0l0n>T`vI8 z%L4H8d;o;?0NkannRlcCfC_(;zpg!b=Cw7!hY!_`eBt}o4^P`W_S17Mb&qXqo4RlL z?&ar?Ej~N%@=yI&2ahd1>uDG{yVBGC$%L)S@%y$-mrm6GvGa2)f5ms@#Gd_AJ|26t zBL39V(`LT0X#3#7-pA)yDq2Q=`$W@BQ2WxdqhGE5((3|?epEJJZrgYInd)V){`S|k z8*9T8wpG?DJ%D?D>$~cXFDkk>pWPGppP2R8$#1q_S}}Rqke1${bk0*{pTNg=l7=ThmT(qcHdk)>D-i@7X&r b^)|3%+R?SGu_g7!Tg**?X8(?9^Pl}2wbUx` literal 0 HcmV?d00001 diff --git a/textures/xdecor_radio_top.png b/textures/xdecor_radio_top.png new file mode 100644 index 0000000000000000000000000000000000000000..fe5f88a9b8e51c7a92d1ad42c1d57503f05eb4c3 GIT binary patch literal 1214 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuU%v{0TQqR!T z+}y-mN5ROz&{W^RSl`${*T~q)#K6kLNC66zfVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD#PU%0_}#n6BP2AO_EVu8M)o`HUDF34YC)x{-2sR(CaRb3oXS&*t9 zlvryA&s6}2k5wiXH<&q_ z8XH?!8Ux*60CK;hiJO75k&~&jvx%dDqnVQuRBs9vzeDw!;MA)Rbc{YIa*-k%CIn1D zASOKN0y*%+pPC0u@kPL-ZPE4SE&~Ijo~MgrNX4xwlMZ?v4iIq7^)NF%`mJs^i0VDNy5+?3#}MZ5_LSSQZ~coxr@DVxyx=m=lH3Ei5$$TG zuh(VHU;UKz=|!FyKUZy>{CMX5CCVOsj=;=@U=qqih6Ibrh zu#f%y`oj1BK_3cM&Sty89edMb-4Tz(4X>-}xeXX%7wr9%x!x}jRHAsg`njxgN@xNA Dz`U#j literal 0 HcmV?d00001 diff --git a/textures/xdecor_rooster.png b/textures/xdecor_rooster.png new file mode 100644 index 0000000000000000000000000000000000000000..b68a173e0e15bf415371e8dd039cb81f03584945 GIT binary patch literal 1322 zcmaJ>ZEVzJ9PdEcB*URDz%Gz#IJ)+^t!{l;+wE@4 zKqP#@h#}bkmu$iK!Ng<`VxmzO93d!9lYKA-WjcHzVUi_cH1TDF#i!eD@?oJ#`#gR6 z|NZ{I|67kYH9WInePBI;AR7{O(G*Y9CxGyjaHDZ)Lrl;s8X_tX6;~ z45baEfTHzwO@L|yS$jlJXS_`ESy8nNLh)^gykSE$f>hV!ZAI+>9@+}pbTfk885_q? zU5jANp(K^GWzeqI^*LaFUqf2$>re#^tJ#BA=S4_h08c^lMyKhD`3SbiE5f~hOk(Jw ziPsUqmPBQeO{i=+01Xiwu2LM2@&ZAJcs|JQLK%tkP?Fox_n{Ko1h>ZSRJs&`VJDL-#HPEPD3~%buh=9_P^4k_aV=WAUJCp#V^wQ6-D?9f1zfA! zQDHr@+Y4Zry9Yb+4WSyb(a~X1l+LK7b{oL-643|-zYvK)z^R*JkNE{yy`B;fzsM;7GkFioPEHOd>n=oBZF;!6Tt3$ub zSmA+KQFeghSx(xrItv}p)NXl}+iuyYEH73Z-Px?0nw4{(_Di%BaTGXu576R{WuS{W z7WGv$a9J8?D(n^kFaTGSU>H|aMZm*aFvw9rP~n0tM@Ht#O5Qwrep}T) zKg7lcdwx56P_j?_dy8oM=)*w%$&YUhwB(-3K6>){L{aJ7jqg$y7edX`fy2k1OAS?S z9L%mMsTnyp7-FXy$)7(MKi4zcTlV^wKYd@{I+Gghmk)f~9sYDK{dZTc{Pb&^XD%MO zb79-qC~{exs=(0V`q`-y#XHpGzWEWNvS{kv>o1*YyxAXoiwk6)e`x2%;M(}Et(qt9W&*iGS05u@o_zJ4<4E%Y ss?Yb&E(~v8*z(nlKUz*z)~qQ--ur#@^G^c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuU%v{0TQqR!T z+}y-mN5ROz&{W^RSl`${*T~q)#K6kLNC66zfVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD#PU%0_}#n6BP2AO_EVu8M)o`HUDF34YC)x{-2sR(CaRb3oXS&*t9 zlvxv7((k+Yeh ztC69htEHo%qnopZo3W*{k&B75n+r^@XI^nhVqS78Om8MauM=LqR?bDKi6!|(A^G_^ zu-FU8$S=t+&d4uNaCQdAmV!ojW?o8ud9fxac%iOMEy^rQO>ryA&s6}2k5wiXH#iwt zn3-BSxtJNcSb*K{VrXt@YGmT#X5eUOWCnCUL~jZfzeDx9;?%1Tbc{YIa*-k%CIn1D zASOKN0y*%+pPC0u@kPL-UAN_UE&~H2i>HfYNX4xwK?k{-90bl@=+=B%wPNzawMzN5 zp8GGnFXQNWrN+rB7vwYffH(iLG)^0PEqcc4pY>>!vVpr&$Dcd>M@yz|BslOsJyIW6w zUikOjQPt~j%IpQcU1j{D)us-eb?i!?1nowAR%IM`nS_2~Sr) Jmvv4FO#rybjL851 literal 0 HcmV?d00001 diff --git a/textures/xdecor_speaker_front.png b/textures/xdecor_speaker_front.png new file mode 100644 index 0000000000000000000000000000000000000000..b19b8352411fa10dd581a32ec036658e2e6447bc GIT binary patch literal 1239 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuU%v{0TQqR!T z+}y-mN5ROz&{W^RSl`${*T~q)#K6kLNC66zfVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD#PU%0_}#n6BP2AO_EVu8M)o`HUDF34YC)x{-2sR(CaRb3oXS&*t9 zlvP;hnz$CiRdcxGNoetEGbD0rc+O)bhSOHFYr%Fk5*hmTbz7B?6g zxf;6~IJuY^y10Pc?_^?OY-!-+YG`C(U}j=yp#;^Ng2nGpy{H{644~kr*$c704 zQxJ#=Pr5)3Jn^UI0aJVtFlpBuR$0fu!07Jj;uunKE6Im%Qi1~O28NBD>kKAbxq7kY z|2tJ}?bo}%%Qwa-I@T#LdobN}ICk9MzM;o>`h6qEFPf*i?W;=uf1aMdzy3elDbut6 zqAq;pS;VnOeg(s#Nt}7&M+_Fs>(u_w*2Fl0QLx=ZaSjX1clmuRlm67m?6HaY`Osc% zT@3$|XYIz$J?#;#ix`t4$`!?reB(^zDVWdTxqw^om!Oo|6i>!j{uGRbb$Dl-*VLw<=~^=y%KYzt0`}%*seoTCL;-YZTrbi!6q%|&a{4;Og-xr#5 ccm)y|b{(D^^4cWqC8((JboFyt=akR{09Cr8#sB~S literal 0 HcmV?d00001 diff --git a/textures/xdecor_speaker_side.png b/textures/xdecor_speaker_side.png new file mode 100644 index 0000000000000000000000000000000000000000..7b28936c50c96811c5b606fcf43ab8d2537cbd88 GIT binary patch literal 1172 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuU%v{0TQqR!T z+}y-mN5ROz&{W^RSl`${*T~q)#K6kLNC66zfVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD#PU%0_}#n6BP2AO_EVu8M)o`HUDF34YC)x{-2sR(CaRb3oXS&*t9 zlvxv7((k+Yeh ztC69htEHo%qnopZo3W*{k&B75n+r^@XI^nhVqS78Om8MauM=LqR?bDKi6!|(A^G_^ zu-FU8$S=t+&d4uNaCQdAmV!ojW?o8ud9fxac%iOMEy^rQO>ryA&s6}2k5wiXH#iwt zn3-BSxtJNcSb*K{VrXt@YGmT#X5eUOWCnCUL~jZfzeDx9;?%1Tbc{YIa*-k%CIn1D zASOKN0y*%+pPC0u@kPL-UAN_UE&~H2i>HfYNX4xwK?k{-90bl@=+=B%wPNzawMzN5 zp8GGnFXQNWrN+rB7vwYffH(iLG)^0PEqcc4pY>>!vVpr&$Dcd>M@yz|BslOsJyIW6w zUikOjQPt~j%IpQcU1j{D)us-eb?i!?1nowAR%IM`nS_2~Sr) Jmvv4FO#rybjL851 literal 0 HcmV?d00001 diff --git a/textures/xdecor_speaker_top.png b/textures/xdecor_speaker_top.png new file mode 100644 index 0000000000000000000000000000000000000000..b45f3f14278f943d260bc1ad967de07272cea0c8 GIT binary patch literal 1187 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuU%v{0TQqR!T z+}y-mN5ROz&{W^RSl`${*T~q)#K6kLNC66zfVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD#PU%0_}#n6BP2AO_EVu8M)o`HUDF34YC)x{-2sR(CaRb3oXS&*t9 zlvryA&s6}2k5wiXH&_@r zI=h+~S(+KTSc2Sd>Fj9g=w{(;;p%4KW^C@L1l5~@#qUtPjyUz|10ACeid>|~h6w>v z5Qqs+xRCzBw~EPV&l28E?~>wZ`xD&ChSnugUxJr=+;BkF{1VeDl@A zclX^{ni=&@J1@zO^})f0S0Da<`gK$7fZnvvZ_AkHr93{mh(TahZ+nBfdf|fm$A7U* zU2L*3wdX=v!0Q|#%NCxr^(JfVrp;x`>s)!trsYIIuE@^jG`_yX*{=@89hm>$V~*Cg zWslgjBqrVPzH=pkKXT|s~pWA-l#hvGW cyEia0+}ga!XTyQ>7eU2_r>mdKI;Vst03hO}j{pDw literal 0 HcmV?d00001 diff --git a/textures/xdecor_wooden2_lightbox.png b/textures/xdecor_wooden2_lightbox.png new file mode 100644 index 0000000000000000000000000000000000000000..a53ad96a37caa56485ebe46b8a76ba13a09c18ac GIT binary patch literal 15686 zcmeI3eQ*@z9mkh2q#-Q8b=h@Hmw*Tzr6?MyI6_ylY7&fc6#!(NhbEI!U9{7E7u+0E2Geb2k z0)~Bip7foDJv($ehEYDQu~}?(JwSQ*KqbxaZniQK2!YxdW?m8r(VlizRJd6m7pzi_ z|Msv_!7)|JCcR7T3fb8;TBz5HX6@*%&$JJU~t5y+O zN~flDgd+Y?S_;8GbC~f`^$useIS^GT+e9%$;dob9S7n#Bk`McEjmc!f)dWruDo{fu zbO%K`q6!M7F_VOkgB3hsE+le%P$Bu!ZoWgTQYxi}lAri}1wt-YvZ$*h?|V|R$f>sf*C2zyviy)?T~btmXu{BEaURNcu2#jI9f%+N;J z+Gjk;oKQ#D9|g^LaMsTTKsy3ppvej#)W(av(8lLzGATzPW@}jFyg2|$O3pMk!sSSl zlvrAHPQ`}W44}AN)bcO~ra$d>@SYCozG@v7AXG9OLy>x$&2G1m22C}g(Nvpk4#IA7 zYOFTGYSa;=(~Re|NX@8tGg<7dCWqZV$n-YKCoX zP!Q>$hmH4|1HCpFXohrq2o<5xGb)zU=~YHX&#Fvbn$>w&l4iU~>$LO?YX=+VI$6dU z<^$2i5~9NbD^1)gWn$(gS67^9bm~)FW}gU#F|m45uhQ%Ew2Gv4UX{^EGb)c;f59yLL!!F-BYMQi0Y5qPiIMTc3d4=glG?08s_*ew)xd-OO^+||Sd8NN%XNVrZ; z%Wdyzqk}${vEYfsL;;*)#-*Y2bCX9dRyuh=6SE_80!ZtcvWHn3OpHdJ_fO?^;FMIq zQf{n+7Fme2PD^Rj3DQZESWU>o#WS3@JB!Dp(ULsUYQi4i9A{{eo{~#?-83J@LwWgd zfEF!WfcCL?DCjfeslv3H$@74+^L{=Iy2Vl;-jJcECfxpQ=sXO{6T_G>I z5eNu6lyRZ?K&p%j0)h@@TxdR!D&vBHphFoKnh&JPxF8_tP{xJk1F14D2nafqaiRG@ zs*DQ)f(~U|Xg-iCa#)akssWL7I2s)H;q4_|nj0*yS4rN?u zK9DNof`Fhy85f!lq{_G;Am~uWh2{gPGA;-RI+Sst`9P|S3j%@;Wn5@JkSgPXfS^Me z7n%>G%D5mP=upOm<^!oRE(i!ZlyRZ?K&p%j0)h@@TxdR!D&vBHphFoKnh&JPxF8_t z5Q(cW_4X(m1h0&Cfp%<1 zhGDnyTUw7eF)Xj8)?saoj4}1gYlxrk!c09ZL-}}b* zyt?wSgT(#|4T~{jb=~OY{OPk!Uw3p`{#tx|Z0nm9#PHkL3-stjpR@SdHp|41_s##~ zHC53W`^7~);_%$1k9eQn`PRYe$9-7n0nOp9cPu=9Y132Be5c`!hL?tvzVZ?5AKO2h zccRk&@^7}cYIiy@$H<#P=fB>oXv8i*nt!r{GMg|4QxT*nahqFqs`s) z`HSWkKN#r`8cz(AxyKF|-Z@*o;nI;?o-kII|8(hxTXcKpp2&alx#br(J+-F%aH@`7za!_fUNufNyt9$Dz>eevYqw`k{ZOB?2o-njlPLrIbI zl{HQ0j#gZ;em*+z=iY;Tdf&vMQx^t)_38Dm^D*1SyI)$=yknj8rgLp|onyak?GOG7 D;Yw#) literal 0 HcmV?d00001