From f587328536c5e76e1b6376d8af352a1e2ab4803a Mon Sep 17 00:00:00 2001 From: mckaygerhard Date: Sun, 11 Jun 2023 12:08:21 -0400 Subject: [PATCH] mods - add reduced homedecor flavor for minimal home decoration --- README.md | 9 +- mods/xdecor/.gitignore | 22 + mods/xdecor/.luacheckrc | 14 + mods/xdecor/LICENSE | 41 + mods/xdecor/README.md | 247 +++ mods/xdecor/depends.txt | 10 + mods/xdecor/description.txt | 1 + mods/xdecor/handlers/animations.lua | 60 + mods/xdecor/handlers/helpers.lua | 60 + mods/xdecor/handlers/nodeboxes.lua | 67 + mods/xdecor/handlers/registration.lua | 137 ++ mods/xdecor/init.lua | 62 + mods/xdecor/locale/template.txt | 155 ++ mods/xdecor/locale/xdecor.de.tr | 153 ++ mods/xdecor/locale/xdecor.fr.tr | 155 ++ mods/xdecor/locale/xdecor.it.tr | 155 ++ mods/xdecor/mod.conf | 5 + mods/xdecor/screenshot.png | Bin 0 -> 104919 bytes mods/xdecor/settingtypes.txt | 11 + mods/xdecor/sounds/xdecor_boiling_water.ogg | Bin 0 -> 14833 bytes mods/xdecor/sounds/xdecor_bouncy.ogg | Bin 0 -> 5131 bytes mods/xdecor/sounds/xdecor_enchanting.ogg | Bin 0 -> 14918 bytes mods/xdecor/src/chess.lua | 1484 +++++++++++++++++ mods/xdecor/src/cooking.lua | 267 +++ mods/xdecor/src/enchanting.lua | 333 ++++ mods/xdecor/src/hive.lua | 108 ++ mods/xdecor/src/itemframe.lua | 186 +++ mods/xdecor/src/mailbox.lua | 192 +++ mods/xdecor/src/mechanisms.lua | 153 ++ mods/xdecor/src/nodes.lua | 644 +++++++ mods/xdecor/src/recipes.lua | 299 ++++ mods/xdecor/src/rope.lua | 75 + mods/xdecor/src/workbench.lua | 362 ++++ mods/xdecor/textures/bg_btn.png | Bin 0 -> 82 bytes mods/xdecor/textures/bishop_black.png | Bin 0 -> 171 bytes mods/xdecor/textures/bishop_white.png | Bin 0 -> 176 bytes mods/xdecor/textures/chess_bg.png | Bin 0 -> 29706 bytes mods/xdecor/textures/chessboard_sides.png | Bin 0 -> 115 bytes mods/xdecor/textures/chessboard_top.png | Bin 0 -> 208 bytes mods/xdecor/textures/ench_ui.png | Bin 0 -> 2044 bytes mods/xdecor/textures/gui_arrow.png | Bin 0 -> 469 bytes mods/xdecor/textures/hammer_layout.png | Bin 0 -> 116 bytes mods/xdecor/textures/hive_bee.png | Bin 0 -> 625 bytes mods/xdecor/textures/hive_layout.png | Bin 0 -> 237 bytes mods/xdecor/textures/king_black.png | Bin 0 -> 190 bytes mods/xdecor/textures/king_white.png | Bin 0 -> 196 bytes mods/xdecor/textures/knight_black.png | Bin 0 -> 178 bytes mods/xdecor/textures/knight_white.png | Bin 0 -> 182 bytes mods/xdecor/textures/mailbox_blank16.png | Bin 0 -> 82 bytes mods/xdecor/textures/mese_layout.png | Bin 0 -> 139 bytes mods/xdecor/textures/pawn_black.png | Bin 0 -> 167 bytes mods/xdecor/textures/pawn_white.png | Bin 0 -> 167 bytes mods/xdecor/textures/queen_black.png | Bin 0 -> 184 bytes mods/xdecor/textures/queen_white.png | Bin 0 -> 189 bytes mods/xdecor/textures/rook_black.png | Bin 0 -> 173 bytes mods/xdecor/textures/rook_white.png | Bin 0 -> 179 bytes mods/xdecor/textures/worktable_anvil.png | Bin 0 -> 158 bytes mods/xdecor/textures/worktable_saw.png | Bin 0 -> 194 bytes mods/xdecor/textures/xdecor_bamboo_frame.png | Bin 0 -> 283 bytes mods/xdecor/textures/xdecor_baricade.png | Bin 0 -> 258 bytes mods/xdecor/textures/xdecor_barrel_sides.png | Bin 0 -> 262 bytes mods/xdecor/textures/xdecor_barrel_top.png | Bin 0 -> 296 bytes mods/xdecor/textures/xdecor_book_open.png | Bin 0 -> 279 bytes mods/xdecor/textures/xdecor_bowl.png | Bin 0 -> 193 bytes mods/xdecor/textures/xdecor_bowl_soup.png | Bin 0 -> 215 bytes mods/xdecor/textures/xdecor_cabinet_front.png | Bin 0 -> 247 bytes mods/xdecor/textures/xdecor_cabinet_sides.png | Bin 0 -> 245 bytes mods/xdecor/textures/xdecor_cactusbrick.png | Bin 0 -> 465 bytes mods/xdecor/textures/xdecor_candle_floor.png | Bin 0 -> 202 bytes .../xdecor/textures/xdecor_candle_hanging.png | Bin 0 -> 15657 bytes mods/xdecor/textures/xdecor_candle_inv.png | Bin 0 -> 177 bytes mods/xdecor/textures/xdecor_candle_wall.png | Bin 0 -> 206 bytes mods/xdecor/textures/xdecor_candle_wield.png | Bin 0 -> 174 bytes .../xdecor/textures/xdecor_cauldron_sides.png | Bin 0 -> 197 bytes ...xdecor_cauldron_top_anim_boiling_water.png | Bin 0 -> 657 bytes .../xdecor_cauldron_top_anim_soup.png | Bin 0 -> 445 bytes .../textures/xdecor_cauldron_top_empty.png | Bin 0 -> 191 bytes .../textures/xdecor_cauldron_top_idle.png | Bin 0 -> 311 bytes mods/xdecor/textures/xdecor_chainlink.png | Bin 0 -> 221 bytes .../xdecor/textures/xdecor_coalstone_tile.png | Bin 0 -> 463 bytes mods/xdecor/textures/xdecor_cobweb.png | Bin 0 -> 209 bytes .../textures/xdecor_curtain_open_overlay.png | Bin 0 -> 118 bytes mods/xdecor/textures/xdecor_cushion.png | Bin 0 -> 374 bytes .../textures/xdecor_dandelion_white_pot.png | Bin 0 -> 349 bytes .../textures/xdecor_dandelion_yellow_pot.png | Bin 0 -> 339 bytes .../textures/xdecor_desertstone_tile.png | Bin 0 -> 260 bytes mods/xdecor/textures/xdecor_empty_shelf.png | Bin 0 -> 363 bytes .../textures/xdecor_enchantment_bottom.png | Bin 0 -> 582 bytes .../textures/xdecor_enchantment_side.png | Bin 0 -> 512 bytes .../textures/xdecor_enchantment_top.png | Bin 0 -> 195 bytes .../textures/xdecor_enderchest_front.png | Bin 0 -> 435 bytes .../textures/xdecor_enderchest_side.png | Bin 0 -> 414 bytes .../xdecor/textures/xdecor_enderchest_top.png | Bin 0 -> 403 bytes mods/xdecor/textures/xdecor_geranium_pot.png | Bin 0 -> 382 bytes mods/xdecor/textures/xdecor_glyph1.png | Bin 0 -> 108 bytes mods/xdecor/textures/xdecor_glyph10.png | Bin 0 -> 104 bytes mods/xdecor/textures/xdecor_glyph11.png | Bin 0 -> 105 bytes mods/xdecor/textures/xdecor_glyph12.png | Bin 0 -> 103 bytes mods/xdecor/textures/xdecor_glyph13.png | Bin 0 -> 106 bytes mods/xdecor/textures/xdecor_glyph14.png | Bin 0 -> 106 bytes mods/xdecor/textures/xdecor_glyph15.png | Bin 0 -> 110 bytes mods/xdecor/textures/xdecor_glyph16.png | Bin 0 -> 105 bytes mods/xdecor/textures/xdecor_glyph17.png | Bin 0 -> 100 bytes mods/xdecor/textures/xdecor_glyph18.png | Bin 0 -> 110 bytes mods/xdecor/textures/xdecor_glyph2.png | Bin 0 -> 106 bytes mods/xdecor/textures/xdecor_glyph3.png | Bin 0 -> 106 bytes mods/xdecor/textures/xdecor_glyph4.png | Bin 0 -> 106 bytes mods/xdecor/textures/xdecor_glyph5.png | Bin 0 -> 104 bytes mods/xdecor/textures/xdecor_glyph6.png | Bin 0 -> 106 bytes mods/xdecor/textures/xdecor_glyph7.png | Bin 0 -> 104 bytes mods/xdecor/textures/xdecor_glyph8.png | Bin 0 -> 105 bytes mods/xdecor/textures/xdecor_glyph9.png | Bin 0 -> 102 bytes .../textures/xdecor_half_cabinet_front.png | Bin 0 -> 225 bytes .../textures/xdecor_half_cabinet_sides.png | Bin 0 -> 207 bytes mods/xdecor/textures/xdecor_hammer.png | Bin 0 -> 199 bytes mods/xdecor/textures/xdecor_hard_clay.png | Bin 0 -> 215 bytes mods/xdecor/textures/xdecor_hive_front.png | Bin 0 -> 726 bytes mods/xdecor/textures/xdecor_hive_side.png | Bin 0 -> 720 bytes mods/xdecor/textures/xdecor_hive_top.png | Bin 0 -> 617 bytes mods/xdecor/textures/xdecor_honey.png | Bin 0 -> 159 bytes mods/xdecor/textures/xdecor_iron_lightbox.png | Bin 0 -> 301 bytes mods/xdecor/textures/xdecor_itemframe.png | Bin 0 -> 263 bytes mods/xdecor/textures/xdecor_ivy.png | Bin 0 -> 234 bytes mods/xdecor/textures/xdecor_japanese_door.png | Bin 0 -> 799 bytes .../textures/xdecor_japanese_door_inv.png | Bin 0 -> 199 bytes mods/xdecor/textures/xdecor_lantern.png | Bin 0 -> 231 bytes mods/xdecor/textures/xdecor_lantern_inv.png | Bin 0 -> 191 bytes mods/xdecor/textures/xdecor_lever_off.png | Bin 0 -> 300 bytes mods/xdecor/textures/xdecor_lever_on.png | Bin 0 -> 294 bytes mods/xdecor/textures/xdecor_mailbox.png | Bin 0 -> 196 bytes .../xdecor/textures/xdecor_mailbox_bottom.png | Bin 0 -> 116 bytes mods/xdecor/textures/xdecor_mailbox_side.png | Bin 0 -> 176 bytes mods/xdecor/textures/xdecor_mailbox_top.png | Bin 0 -> 116 bytes mods/xdecor/textures/xdecor_moonbrick.png | Bin 0 -> 371 bytes mods/xdecor/textures/xdecor_multishelf.png | Bin 0 -> 503 bytes mods/xdecor/textures/xdecor_packed_ice.png | Bin 0 -> 305 bytes mods/xdecor/textures/xdecor_painting_1.png | Bin 0 -> 255 bytes mods/xdecor/textures/xdecor_painting_2.png | Bin 0 -> 378 bytes mods/xdecor/textures/xdecor_painting_3.png | Bin 0 -> 365 bytes mods/xdecor/textures/xdecor_painting_4.png | Bin 0 -> 370 bytes .../xdecor/textures/xdecor_painting_empty.png | Bin 0 -> 289 bytes .../xdecor/textures/xdecor_pressure_stone.png | Bin 0 -> 270 bytes mods/xdecor/textures/xdecor_pressure_wood.png | Bin 0 -> 543 bytes mods/xdecor/textures/xdecor_prison_door.png | Bin 0 -> 593 bytes .../textures/xdecor_prison_door_inv.png | Bin 0 -> 243 bytes mods/xdecor/textures/xdecor_radio_back.png | Bin 0 -> 1184 bytes mods/xdecor/textures/xdecor_radio_front.png | Bin 0 -> 1208 bytes mods/xdecor/textures/xdecor_radio_side.png | Bin 0 -> 15650 bytes mods/xdecor/textures/xdecor_radio_top.png | Bin 0 -> 1214 bytes mods/xdecor/textures/xdecor_rooster.png | Bin 0 -> 1322 bytes mods/xdecor/textures/xdecor_rope.png | Bin 0 -> 185 bytes mods/xdecor/textures/xdecor_rope_inv.png | Bin 0 -> 187 bytes mods/xdecor/textures/xdecor_rope_wield.png | Bin 0 -> 197 bytes mods/xdecor/textures/xdecor_rose_pot.png | Bin 0 -> 339 bytes mods/xdecor/textures/xdecor_rusty_bar.png | Bin 0 -> 194 bytes .../textures/xdecor_rusty_prison_door.png | Bin 0 -> 749 bytes .../textures/xdecor_rusty_prison_door_inv.png | Bin 0 -> 239 bytes mods/xdecor/textures/xdecor_screen_door.png | Bin 0 -> 803 bytes .../textures/xdecor_screen_door_inv.png | Bin 0 -> 257 bytes mods/xdecor/textures/xdecor_slide_door.png | Bin 0 -> 700 bytes .../xdecor/textures/xdecor_slide_door_inv.png | Bin 0 -> 213 bytes mods/xdecor/textures/xdecor_speaker_back.png | Bin 0 -> 1172 bytes mods/xdecor/textures/xdecor_speaker_front.png | Bin 0 -> 1239 bytes mods/xdecor/textures/xdecor_speaker_side.png | Bin 0 -> 1172 bytes mods/xdecor/textures/xdecor_speaker_top.png | Bin 0 -> 1187 bytes mods/xdecor/textures/xdecor_stone_rune.png | Bin 0 -> 265 bytes mods/xdecor/textures/xdecor_stone_tile.png | Bin 0 -> 295 bytes mods/xdecor/textures/xdecor_tatami.png | Bin 0 -> 145 bytes .../textures/xdecor_television_back.png | Bin 0 -> 146 bytes .../xdecor_television_front_animated.png | Bin 0 -> 1715 bytes .../textures/xdecor_television_left.png | Bin 0 -> 92 bytes mods/xdecor/textures/xdecor_trampoline.png | Bin 0 -> 174 bytes .../textures/xdecor_trampoline_sides.png | Bin 0 -> 288 bytes mods/xdecor/textures/xdecor_tulip_pot.png | Bin 0 -> 356 bytes mods/xdecor/textures/xdecor_viola_pot.png | Bin 0 -> 333 bytes mods/xdecor/textures/xdecor_wood.png | Bin 0 -> 235 bytes mods/xdecor/textures/xdecor_wood_frame.png | Bin 0 -> 271 bytes mods/xdecor/textures/xdecor_wood_tile.png | Bin 0 -> 364 bytes .../textures/xdecor_wooden2_lightbox.png | Bin 0 -> 15686 bytes .../textures/xdecor_wooden_lightbox.png | Bin 0 -> 262 bytes .../textures/xdecor_woodframed_glass.png | Bin 0 -> 270 bytes .../xdecor_woodframed_glass_detail.png | Bin 0 -> 201 bytes .../xdecor/textures/xdecor_woodglass_door.png | Bin 0 -> 850 bytes .../textures/xdecor_woodglass_door_inv.png | Bin 0 -> 232 bytes .../textures/xdecor_workbench_front.png | Bin 0 -> 555 bytes .../textures/xdecor_workbench_sides.png | Bin 0 -> 492 bytes mods/xdecor/textures/xdecor_workbench_top.png | Bin 0 -> 591 bytes 187 files changed, 5464 insertions(+), 3 deletions(-) create mode 100644 mods/xdecor/.gitignore create mode 100644 mods/xdecor/.luacheckrc create mode 100644 mods/xdecor/LICENSE create mode 100644 mods/xdecor/README.md create mode 100644 mods/xdecor/depends.txt create mode 100644 mods/xdecor/description.txt create mode 100644 mods/xdecor/handlers/animations.lua create mode 100644 mods/xdecor/handlers/helpers.lua create mode 100644 mods/xdecor/handlers/nodeboxes.lua create mode 100644 mods/xdecor/handlers/registration.lua create mode 100644 mods/xdecor/init.lua create mode 100644 mods/xdecor/locale/template.txt create mode 100644 mods/xdecor/locale/xdecor.de.tr create mode 100644 mods/xdecor/locale/xdecor.fr.tr create mode 100644 mods/xdecor/locale/xdecor.it.tr create mode 100644 mods/xdecor/mod.conf create mode 100644 mods/xdecor/screenshot.png create mode 100644 mods/xdecor/settingtypes.txt create mode 100644 mods/xdecor/sounds/xdecor_boiling_water.ogg create mode 100644 mods/xdecor/sounds/xdecor_bouncy.ogg create mode 100644 mods/xdecor/sounds/xdecor_enchanting.ogg create mode 100644 mods/xdecor/src/chess.lua create mode 100644 mods/xdecor/src/cooking.lua create mode 100644 mods/xdecor/src/enchanting.lua create mode 100644 mods/xdecor/src/hive.lua create mode 100644 mods/xdecor/src/itemframe.lua create mode 100644 mods/xdecor/src/mailbox.lua create mode 100644 mods/xdecor/src/mechanisms.lua create mode 100644 mods/xdecor/src/nodes.lua create mode 100644 mods/xdecor/src/recipes.lua create mode 100644 mods/xdecor/src/rope.lua create mode 100644 mods/xdecor/src/workbench.lua create mode 100644 mods/xdecor/textures/bg_btn.png create mode 100644 mods/xdecor/textures/bishop_black.png create mode 100644 mods/xdecor/textures/bishop_white.png create mode 100644 mods/xdecor/textures/chess_bg.png create mode 100644 mods/xdecor/textures/chessboard_sides.png create mode 100644 mods/xdecor/textures/chessboard_top.png create mode 100644 mods/xdecor/textures/ench_ui.png create mode 100644 mods/xdecor/textures/gui_arrow.png create mode 100644 mods/xdecor/textures/hammer_layout.png create mode 100644 mods/xdecor/textures/hive_bee.png create mode 100644 mods/xdecor/textures/hive_layout.png create mode 100644 mods/xdecor/textures/king_black.png create mode 100644 mods/xdecor/textures/king_white.png create mode 100644 mods/xdecor/textures/knight_black.png create mode 100644 mods/xdecor/textures/knight_white.png create mode 100644 mods/xdecor/textures/mailbox_blank16.png create mode 100644 mods/xdecor/textures/mese_layout.png create mode 100644 mods/xdecor/textures/pawn_black.png create mode 100644 mods/xdecor/textures/pawn_white.png create mode 100644 mods/xdecor/textures/queen_black.png create mode 100644 mods/xdecor/textures/queen_white.png create mode 100644 mods/xdecor/textures/rook_black.png create mode 100644 mods/xdecor/textures/rook_white.png create mode 100644 mods/xdecor/textures/worktable_anvil.png create mode 100644 mods/xdecor/textures/worktable_saw.png create mode 100644 mods/xdecor/textures/xdecor_bamboo_frame.png create mode 100644 mods/xdecor/textures/xdecor_baricade.png create mode 100644 mods/xdecor/textures/xdecor_barrel_sides.png create mode 100644 mods/xdecor/textures/xdecor_barrel_top.png create mode 100644 mods/xdecor/textures/xdecor_book_open.png create mode 100644 mods/xdecor/textures/xdecor_bowl.png create mode 100644 mods/xdecor/textures/xdecor_bowl_soup.png create mode 100644 mods/xdecor/textures/xdecor_cabinet_front.png create mode 100644 mods/xdecor/textures/xdecor_cabinet_sides.png create mode 100644 mods/xdecor/textures/xdecor_cactusbrick.png create mode 100644 mods/xdecor/textures/xdecor_candle_floor.png create mode 100644 mods/xdecor/textures/xdecor_candle_hanging.png create mode 100644 mods/xdecor/textures/xdecor_candle_inv.png create mode 100644 mods/xdecor/textures/xdecor_candle_wall.png create mode 100644 mods/xdecor/textures/xdecor_candle_wield.png create mode 100644 mods/xdecor/textures/xdecor_cauldron_sides.png create mode 100644 mods/xdecor/textures/xdecor_cauldron_top_anim_boiling_water.png create mode 100644 mods/xdecor/textures/xdecor_cauldron_top_anim_soup.png create mode 100644 mods/xdecor/textures/xdecor_cauldron_top_empty.png create mode 100644 mods/xdecor/textures/xdecor_cauldron_top_idle.png create mode 100644 mods/xdecor/textures/xdecor_chainlink.png create mode 100644 mods/xdecor/textures/xdecor_coalstone_tile.png create mode 100644 mods/xdecor/textures/xdecor_cobweb.png create mode 100644 mods/xdecor/textures/xdecor_curtain_open_overlay.png create mode 100644 mods/xdecor/textures/xdecor_cushion.png create mode 100644 mods/xdecor/textures/xdecor_dandelion_white_pot.png create mode 100644 mods/xdecor/textures/xdecor_dandelion_yellow_pot.png create mode 100644 mods/xdecor/textures/xdecor_desertstone_tile.png create mode 100644 mods/xdecor/textures/xdecor_empty_shelf.png create mode 100644 mods/xdecor/textures/xdecor_enchantment_bottom.png create mode 100644 mods/xdecor/textures/xdecor_enchantment_side.png create mode 100644 mods/xdecor/textures/xdecor_enchantment_top.png create mode 100644 mods/xdecor/textures/xdecor_enderchest_front.png create mode 100644 mods/xdecor/textures/xdecor_enderchest_side.png create mode 100644 mods/xdecor/textures/xdecor_enderchest_top.png create mode 100644 mods/xdecor/textures/xdecor_geranium_pot.png create mode 100644 mods/xdecor/textures/xdecor_glyph1.png create mode 100644 mods/xdecor/textures/xdecor_glyph10.png create mode 100644 mods/xdecor/textures/xdecor_glyph11.png create mode 100644 mods/xdecor/textures/xdecor_glyph12.png create mode 100644 mods/xdecor/textures/xdecor_glyph13.png create mode 100644 mods/xdecor/textures/xdecor_glyph14.png create mode 100644 mods/xdecor/textures/xdecor_glyph15.png create mode 100644 mods/xdecor/textures/xdecor_glyph16.png create mode 100644 mods/xdecor/textures/xdecor_glyph17.png create mode 100644 mods/xdecor/textures/xdecor_glyph18.png create mode 100644 mods/xdecor/textures/xdecor_glyph2.png create mode 100644 mods/xdecor/textures/xdecor_glyph3.png create mode 100644 mods/xdecor/textures/xdecor_glyph4.png create mode 100644 mods/xdecor/textures/xdecor_glyph5.png create mode 100644 mods/xdecor/textures/xdecor_glyph6.png create mode 100644 mods/xdecor/textures/xdecor_glyph7.png create mode 100644 mods/xdecor/textures/xdecor_glyph8.png create mode 100644 mods/xdecor/textures/xdecor_glyph9.png create mode 100644 mods/xdecor/textures/xdecor_half_cabinet_front.png create mode 100644 mods/xdecor/textures/xdecor_half_cabinet_sides.png create mode 100644 mods/xdecor/textures/xdecor_hammer.png create mode 100644 mods/xdecor/textures/xdecor_hard_clay.png create mode 100644 mods/xdecor/textures/xdecor_hive_front.png create mode 100644 mods/xdecor/textures/xdecor_hive_side.png create mode 100644 mods/xdecor/textures/xdecor_hive_top.png create mode 100644 mods/xdecor/textures/xdecor_honey.png create mode 100644 mods/xdecor/textures/xdecor_iron_lightbox.png create mode 100644 mods/xdecor/textures/xdecor_itemframe.png create mode 100644 mods/xdecor/textures/xdecor_ivy.png create mode 100644 mods/xdecor/textures/xdecor_japanese_door.png create mode 100644 mods/xdecor/textures/xdecor_japanese_door_inv.png create mode 100644 mods/xdecor/textures/xdecor_lantern.png create mode 100644 mods/xdecor/textures/xdecor_lantern_inv.png create mode 100644 mods/xdecor/textures/xdecor_lever_off.png create mode 100644 mods/xdecor/textures/xdecor_lever_on.png create mode 100644 mods/xdecor/textures/xdecor_mailbox.png create mode 100644 mods/xdecor/textures/xdecor_mailbox_bottom.png create mode 100644 mods/xdecor/textures/xdecor_mailbox_side.png create mode 100644 mods/xdecor/textures/xdecor_mailbox_top.png create mode 100644 mods/xdecor/textures/xdecor_moonbrick.png create mode 100644 mods/xdecor/textures/xdecor_multishelf.png create mode 100644 mods/xdecor/textures/xdecor_packed_ice.png create mode 100644 mods/xdecor/textures/xdecor_painting_1.png create mode 100644 mods/xdecor/textures/xdecor_painting_2.png create mode 100644 mods/xdecor/textures/xdecor_painting_3.png create mode 100644 mods/xdecor/textures/xdecor_painting_4.png create mode 100644 mods/xdecor/textures/xdecor_painting_empty.png create mode 100644 mods/xdecor/textures/xdecor_pressure_stone.png create mode 100644 mods/xdecor/textures/xdecor_pressure_wood.png create mode 100644 mods/xdecor/textures/xdecor_prison_door.png create mode 100644 mods/xdecor/textures/xdecor_prison_door_inv.png create mode 100644 mods/xdecor/textures/xdecor_radio_back.png create mode 100644 mods/xdecor/textures/xdecor_radio_front.png create mode 100644 mods/xdecor/textures/xdecor_radio_side.png create mode 100644 mods/xdecor/textures/xdecor_radio_top.png create mode 100644 mods/xdecor/textures/xdecor_rooster.png create mode 100644 mods/xdecor/textures/xdecor_rope.png create mode 100644 mods/xdecor/textures/xdecor_rope_inv.png create mode 100644 mods/xdecor/textures/xdecor_rope_wield.png create mode 100644 mods/xdecor/textures/xdecor_rose_pot.png create mode 100644 mods/xdecor/textures/xdecor_rusty_bar.png create mode 100644 mods/xdecor/textures/xdecor_rusty_prison_door.png create mode 100644 mods/xdecor/textures/xdecor_rusty_prison_door_inv.png create mode 100644 mods/xdecor/textures/xdecor_screen_door.png create mode 100644 mods/xdecor/textures/xdecor_screen_door_inv.png create mode 100644 mods/xdecor/textures/xdecor_slide_door.png create mode 100644 mods/xdecor/textures/xdecor_slide_door_inv.png create mode 100644 mods/xdecor/textures/xdecor_speaker_back.png create mode 100644 mods/xdecor/textures/xdecor_speaker_front.png create mode 100644 mods/xdecor/textures/xdecor_speaker_side.png create mode 100644 mods/xdecor/textures/xdecor_speaker_top.png create mode 100644 mods/xdecor/textures/xdecor_stone_rune.png create mode 100644 mods/xdecor/textures/xdecor_stone_tile.png create mode 100644 mods/xdecor/textures/xdecor_tatami.png create mode 100644 mods/xdecor/textures/xdecor_television_back.png create mode 100644 mods/xdecor/textures/xdecor_television_front_animated.png create mode 100644 mods/xdecor/textures/xdecor_television_left.png create mode 100644 mods/xdecor/textures/xdecor_trampoline.png create mode 100644 mods/xdecor/textures/xdecor_trampoline_sides.png create mode 100644 mods/xdecor/textures/xdecor_tulip_pot.png create mode 100644 mods/xdecor/textures/xdecor_viola_pot.png create mode 100644 mods/xdecor/textures/xdecor_wood.png create mode 100644 mods/xdecor/textures/xdecor_wood_frame.png create mode 100644 mods/xdecor/textures/xdecor_wood_tile.png create mode 100644 mods/xdecor/textures/xdecor_wooden2_lightbox.png create mode 100644 mods/xdecor/textures/xdecor_wooden_lightbox.png create mode 100644 mods/xdecor/textures/xdecor_woodframed_glass.png create mode 100644 mods/xdecor/textures/xdecor_woodframed_glass_detail.png create mode 100644 mods/xdecor/textures/xdecor_woodglass_door.png create mode 100644 mods/xdecor/textures/xdecor_woodglass_door_inv.png create mode 100644 mods/xdecor/textures/xdecor_workbench_front.png create mode 100644 mods/xdecor/textures/xdecor_workbench_sides.png create mode 100644 mods/xdecor/textures/xdecor_workbench_top.png diff --git a/README.md b/README.md index 060c4e3..26c0662 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,8 @@ The most increible vaste enemy provided game to play and hard to defeats ![screenshot.png](screenshot.png) -For further information, check https://codeberg.org/minenux/minetest-game-nssg.git or https://gitlab.com/minenux/minetest-game-nssg +For further information, check https://codeberg.org/minenux/minetest-game-nssg.git +or https://gitlab.com/minenux/minetest-game-nssg or https://git.minetest.io/minenux/minetest-game-nssg.git ## Installation @@ -33,8 +34,9 @@ To download you can play this game with the following minetest engines: #### Mods -* minetest default +* minetest default and extras * integrated the killme/game_commands were simplified into default mod, and provide CC-BY-SA-NC license + * xdecor as `xdecor` [mods/xdecor](mods/xdecor) a super reduced version of homedecor pack, for performance * sorceredkid auth mod * minetest Auth Redux as `auth_rx` [mods/auth_rx](mods/auth_rx) from https://codeberg.org/minenux/minetest-mod-auth_rx * so then minetest Formspecs as `formspecs` [mods/formspecs](mods/formspecs) from https://codeberg.org/minenux/minetest-mod-formspecs @@ -46,7 +48,8 @@ To download you can play this game with the following minetest engines: * ethereal as `ethereal` [mods/ethereal](mods/ethereal) from https://codeberg.org/minenux/minetest-mod-ethereal * armors and stuff mods * 3d_armor and shields [mods/3d_armor](mods/3d_armor) https://codeberg.org/minenux/minetest-mod-3d_armor -* minenux bags as `backpacks` [mods/backpacks](mods/backpacks) +* player stuffs: + * minenux bags as `backpacks` [mods/backpacks](mods/backpacks) ## Licensing diff --git a/mods/xdecor/.gitignore b/mods/xdecor/.gitignore new file mode 100644 index 0000000..ef02689 --- /dev/null +++ b/mods/xdecor/.gitignore @@ -0,0 +1,22 @@ +## Files related to minetest development cycle +/*.patch +# GNU Patch reject file +*.rej + +## Editors and Development environments +*~ +*.swp +*.bak* +*.orig +# Vim +*.vim +# Kate +.*.kate-swp +.swp.* +# Eclipse (LDT) +.project +.settings/ +.buildpath +.metadata +# Idea IDE +.idea/* diff --git a/mods/xdecor/.luacheckrc b/mods/xdecor/.luacheckrc new file mode 100644 index 0000000..8cdd8c3 --- /dev/null +++ b/mods/xdecor/.luacheckrc @@ -0,0 +1,14 @@ +allow_defined_top = true + +read_globals = { + "minetest", + "vector", "ItemStack", + "default", + "stairs", "doors", "xpanes", + "xdecor", "xbg", + table = {fields = {"copy"}}, + string = {fields = {"split"}}, + "unpack", + "stairsplus", + "mesecon" +} diff --git a/mods/xdecor/LICENSE b/mods/xdecor/LICENSE new file mode 100644 index 0000000..938b40e --- /dev/null +++ b/mods/xdecor/LICENSE @@ -0,0 +1,41 @@ +┌──────────────────────────────────────────────────────────────────────┐ +│ Copyright (c) 2015-2021 kilbith │ +│ │ +│ 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/ │ +│ - 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 │ +└──────────────────────────────────────────────────────────────────────┘ + + +Copyright (c) 1998, Regents of the University of California +All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of the University of California, Berkeley nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/mods/xdecor/README.md b/mods/xdecor/README.md new file mode 100644 index 0000000..9f076ca --- /dev/null +++ b/mods/xdecor/README.md @@ -0,0 +1,247 @@ +minetest mod XDecor +=================== + +Decoration lightweight alternative to HomeDecor + +Information +----------- + +This mod add cute cubes to decoration and minimal set of "moreblock" (some elements of picture may not be available) + +![](screenshot.png) + + +Tech information +---------------- + +This mod is forked more reduced version, more focused on speed over media. + +#### Dependencies + +* default +* bucket +* doors +* farming +* stairs +* xpanes + +Optional: + +* fire +* oresplus +* moreblocks +* mesecons + +#### LBM + +| LBM name | node action | notes and observations | +| ------------------------- | ------------------------ | ---------------------- | +| xdecor:create_book_entity | xdecor:enchantment_table | recreate book entity | + +#### Nodes + +| Node name | Observacion and notes | +| ------------------------- | ---------------------- | +| realchess:chessboard | Chess Board, playable | +| xdecor:tv | Television"), | +| xdecor:radio | Radio | +| xdecor:speaker | Speaker | +| xdecor:cauldron_empty | Cauldron | +| xdecor:cauldron_idle | Cauldron (idle) | +| xdecor:cauldron_boiling | Cauldron (active) to put foods inside to make a soup | +| xdecor:cauldron_soup | Cauldron (active) to eat the soup | +| xdecor:hive | Artificial Hive | +| xdecor:itemframe | Item Frame, event huge amoutn only one | +| xdecor:mailbox | Mailbox for little exchange | +| xdecor:pressure_wood_on | Wooden Pressure Plate | +| xdecor:pressure_wood_off | Wooden Pressure Plate (off) | +| xdecor:pressure_stone_on | Stone Pressure Plate | +| xdecor:pressure_stone_off | Stone Pressure Plate (off) | +| xdecor:bamboo_frame | Bamboo Frame | +| xdecor:chainlink | Chainlink | +| xdecor:rusty_bar | Rusty Iron Bars | +| xdecor:baricade | Baricade"), | +| xdecor:barrel | Barrel"), | +| xdecor:cabinet | Wooden Cabinet | +| xdecor:cabinet_half | Half Wooden Cabinet | +| xdecor:empty_shelf | Same as moreblocks:empty_shelf | +| xdecor:multishelf | Multi Shelf | +| xdecor:candle | Candle | +| xdecor:chair | Chair | +| xdecor:cobweb | Cobweb | +| xdecor:cushion | Cushion | +| xdecor:cushion_block | Cushion Block | +| xdecor:enderchest | Ender Chest | +| xdecor:ivy | Ivy | +| xdecor:rooster | Rooster | +| xdecor:lantern | Lantern | +| xdecor:painting_1 | Painting | +| xdecor:stonepath | Garden Stone Path | +| xdecor:cactusbrick | Cactus Brick | +| xdecor:coalstone_tile | Coal Stone Tile | +| xdecor:desertstone_tile | Desert Stone Tile | +| xdecor:hard_clay | Hardened Clay | +| xdecor:moonbrick | Moon Brick | +| xdecor:stone_tile | Stone Tile | +| xdecor:stone_rune | Runestone | +| xdecor:packed_ice | Packed Ice | +| xdecor:wood_tile | Wooden Tile | +| xdecor:table | Table | +| xdecor:tatami | Tatami | +| xdecor:trampoline | Trampoline | +| xdecor:woodframed_glass | Wood Framed Glass | +| xdecor:rope | Rope | +| xdecor:hammer | Hammer, use it on workbench | +| xdecor:workbench | Work Bench, to reapir tools | + +#### Crafts + +realchess:chessboard 1 + +``` + {"dye:black", "dye:white", "dye:black" }, + {"stairs:slab_wood", "stairs:slab_wood", "stairs:slab_wood"} +``` + +xdecor:bowl 3 + +``` + {"group:wood", "", "group:wood"}, + {"", "group:wood", "" } +``` + +xdecor:cauldron_empty 1 + +``` + {"default:iron_lump", "", "default:iron_lump"}, + {"default:iron_lump", "", "default:iron_lump"}, + {"default:iron_lump", "default:iron_lump", "default:iron_lump"} +``` + +xdecor:enchantment_table 1 + +``` + {"", "default:book", "" }, + {"default:diamond", "default:obsidian", "default:diamond" }, + {"default:obsidian", "default:obsidian", "default:obsidian"} +``` + +xdecor:hive 1 + +``` + {"group:stick", "group:stick", "group:stick" }, + {"default:paper", "default:paper", "default:paper"}, + {"group:stick", "group:stick", "group:stick" } +``` + +xdecor:itemframe 1 + +``` + {"group:stick", "group:stick", "group:stick"}, + {"group:stick", "default:paper", "group:stick"}, + {"group:stick", "group:stick", "group:stick"} +``` + +xdecor:mailbox 1 + +``` + {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, + {"dye:red", "default:paper", "dye:red"}, + {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"} +``` + +xdecor:pressure_stone_off + +``` + {"group:stone", "group:stone"} +``` + +xdecor:pressure_wood_off", + +``` + {"group:wood", "group:wood"} +``` + +xdecor:lever_off + +``` + {"group:stick"}, + {"group:stone"} +``` + +xdecor:bamboo_frame + +``` + {"default:papyrus", "default:papyrus", "default:papyrus"}, + {"default:papyrus", "farming:cotton", "default:papyrus"}, + {"default:papyrus", "default:papyrus", "default:papyrus"} +``` + +xdecor:chainlink + +``` + {"default:steel_ingot", "", "default:steel_ingot"}, + {"", "default:steel_ingot", ""}, + {"default:steel_ingot", "", "default:steel_ingot"} +``` + +xdecor:rusty_bar + +``` + {"", "default:dirt", ""}, + {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, + {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"} +``` + +xdecor:rope 1 + +``` + {"farming:string"}, + {"farming:string"}, + {"farming:string"} +``` + + + + +xdecor:hammer 1 + +``` + {"default:steel_ingot", "group:stick", "default:steel_ingot"}, + {"", "group:stick", ""} +``` + + +xdecor:workbench 1 + +``` + {"group:wood", "group:wood"}, + {"group:wood", "group:wood"} +``` + +TODO: + + +xdecor:curtain_ + +``` + {"", "wool:xxxx", ""}, + {"", "wool:xxxx", ""} +``` + +xdecor:potted_ + +``` + {"default:clay_brick", "flowers:", "default:clay_brick"}, + {"", "default:clay_brick", ""} +``` + +### Credits ### + +Gambit makes the textures from the PixelBOX pack for Minetest. + +This is a fork from original using ideas from [cutting](https://forum.minetest.net/viewtopic.php?f=11&t=14085), [enchanting](https://forum.minetest.net/viewtopic.php?f=11&t=14087), etc + +[![ContentDB](https://content.minetest.net/packages/jp/xdecor/shields/downloads/)](https://content.minetest.net/packages/jp/xdecor/) + + diff --git a/mods/xdecor/depends.txt b/mods/xdecor/depends.txt new file mode 100644 index 0000000..c582a68 --- /dev/null +++ b/mods/xdecor/depends.txt @@ -0,0 +1,10 @@ +default +bucket +doors +farming +stairs +xpanes +fire? +oresplus? +moreblocks? +mesecons? diff --git a/mods/xdecor/description.txt b/mods/xdecor/description.txt new file mode 100644 index 0000000..8738846 --- /dev/null +++ b/mods/xdecor/description.txt @@ -0,0 +1 @@ +HOME decoration mod meant to be simple diff --git a/mods/xdecor/handlers/animations.lua b/mods/xdecor/handlers/animations.lua new file mode 100644 index 0000000..ee55942 --- /dev/null +++ b/mods/xdecor/handlers/animations.lua @@ -0,0 +1,60 @@ +local p_api = minetest.get_modpath("player_api") + +local function top_face(pointed_thing) + if not pointed_thing then return end + return pointed_thing.above.y > pointed_thing.under.y +end + +function xdecor.sit(pos, node, clicker, pointed_thing) + if not top_face(pointed_thing) then return end + local player_name = clicker:get_player_name() + local objs = minetest.get_objects_inside_radius(pos, 0.1) + local vel = clicker:get_player_velocity() + local ctrl = clicker:get_player_control() + local eyey = -7 + + for _, obj in pairs(objs) do + if obj:is_player() and obj:get_player_name() ~= player_name then + return + end + end + + if default.player_attached[player_name] then + pos.y = pos.y - 0.5 + clicker:set_pos(pos) + clicker:set_eye_offset(vector.new(), vector.new()) + clicker:set_physics_override({speed = 1, jump = 1, gravity = 1}) + default.player_attached[player_name] = false + default.player_set_animation(clicker, "stand", 30) + + elseif not default.player_attached[player_name] and node.param2 <= 3 and + not ctrl.sneak and vector.equals(vel, vector.new()) then + if p_api then eyey = 0 end + clicker:set_eye_offset({x = 0, y = eyey, z = 2}, vector.new()) + clicker:set_physics_override({speed = 0, jump = 0, gravity = 1}) + clicker:set_pos(pos) + default.player_attached[player_name] = true + default.player_set_animation(clicker, "sit", 30) + + if node.param2 == 0 then + clicker:set_look_yaw(3.15) + elseif node.param2 == 1 then + clicker:set_look_yaw(7.9) + elseif node.param2 == 2 then + clicker:set_look_yaw(6.28) + elseif node.param2 == 3 then + clicker:set_look_yaw(4.75) + end + end +end + +function xdecor.sit_dig(pos, digger) + for _, player in pairs(minetest.get_objects_inside_radius(pos, 0.1)) do + if player:is_player() and + default.player_attached[player:get_player_name()] then + return false + end + end + + return true +end diff --git a/mods/xdecor/handlers/helpers.lua b/mods/xdecor/handlers/helpers.lua new file mode 100644 index 0000000..dc14b24 --- /dev/null +++ b/mods/xdecor/handlers/helpers.lua @@ -0,0 +1,60 @@ +-- Returns the greatest numeric key in a table. +function xdecor.maxn(T) + local n = 0 + for k in pairs(T) do + if k > n then + n = k + end + end + + return n +end + +-- Returns the length of an hash table. +function xdecor.tablelen(T) + local n = 0 + + for _ in pairs(T) do + n = n + 1 + end + + return n +end + +-- Deep copy of a table. Borrowed from mesecons mod (https://github.com/Jeija/minetest-mod-mesecons). +function xdecor.tablecopy(T) + if type(T) ~= "table" then + return T -- No need to copy. + end + + local new = {} + + for k, v in pairs(T) do + if type(v) == "table" then + new[k] = xdecor.tablecopy(v) + else + new[k] = v + end + end + + return new +end + +function xdecor.stairs_valid_def(def) + return (def.drawtype == "normal" or def.drawtype:sub(1,5) == "glass") and + (def.groups.cracky or def.groups.choppy) and + not def.on_construct and + not def.after_place_node and + not def.on_rightclick and + not def.on_blast and + not def.allow_metadata_inventory_take and + not (def.groups.not_in_creative_inventory == 1) and + 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 + not def.mesecons and + def.description and + def.description ~= "" and + def.light_source == 0 +end diff --git a/mods/xdecor/handlers/nodeboxes.lua b/mods/xdecor/handlers/nodeboxes.lua new file mode 100644 index 0000000..4a3d8ca --- /dev/null +++ b/mods/xdecor/handlers/nodeboxes.lua @@ -0,0 +1,67 @@ +xdecor.box = { + slab_y = function(height, shift) + return { + -0.5, + -0.5 + (shift or 0), + -0.5, + 0.5, + -0.5 + height + (shift or 0), + 0.5 + } + end, + slab_z = function(depth) + return {-0.5, -0.5, -0.5 + depth, 0.5, 0.5, 0.5} + end, + bar_y = function(radius) + return {-radius, -0.5, -radius, radius, 0.5, radius} + end, + cuboid = function(radius_x, radius_y, radius_z) + return {-radius_x, -radius_y, -radius_z, radius_x, radius_y, radius_z} + end +} + +xdecor.nodebox = { + regular = {type = "regular"}, + null = { + type = "fixed", fixed = {0,0,0,0,0,0} + } +} + +xdecor.pixelbox = function(size, boxes) + local fixed = {} + for _, box in ipairs(boxes) do + -- `unpack` has been changed to `table.unpack` in newest Lua versions. + local x, y, z, w, h, l = unpack(box) + fixed[#fixed + 1] = { + (x / size) - 0.5, + (y / size) - 0.5, + (z / size) - 0.5, + ((x + w) / size) - 0.5, + ((y + h) / size) - 0.5, + ((z + l) / size) - 0.5 + } + end + + return {type = "fixed", fixed = fixed} +end + +local mt = {} + +mt.__index = function(table, key) + local ref = xdecor.box[key] + local ref_type = type(ref) + + if ref_type == "function" then + return function(...) + return {type = "fixed", fixed = ref(...)} + end + elseif ref_type == "table" then + return {type = "fixed", fixed = ref} + elseif ref_type == "nil" then + error(key .. "could not be found among nodebox presets and functions") + end + + error("unexpected datatype " .. tostring(type(ref)) .. " while looking for " .. key) +end + +setmetatable(xdecor.nodebox, mt) diff --git a/mods/xdecor/handlers/registration.lua b/mods/xdecor/handlers/registration.lua new file mode 100644 index 0000000..b16dc4b --- /dev/null +++ b/mods/xdecor/handlers/registration.lua @@ -0,0 +1,137 @@ +xbg = default.gui_bg .. default.gui_bg_img .. default.gui_slots +local default_inventory_size = 32 + +local default_inventory_formspecs = { + ["8"] = [[ size[8,6] + list[context;main;0,0;8,1;] + list[current_player;main;0,2;8,4;] + listring[current_player;main] + listring[context;main] ]] .. + default.get_hotbar_bg(0,2), + + ["16"] = [[ size[8,7] + list[context;main;0,0;8,2;] + list[current_player;main;0,3;8,4;] + listring[current_player;main] + listring[context;main] ]] .. + default.get_hotbar_bg(0,3), + + ["24"] = [[ size[8,8] + list[context;main;0,0;8,3;] + list[current_player;main;0,4;8,4;] + listring[current_player;main] + listring[context;main]" ]] .. + default.get_hotbar_bg(0,4), + + ["32"] = [[ size[8,9] + list[context;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_player;main] + listring[context;main] ]] .. + default.get_hotbar_bg(0,4.85) +} + +local function get_formspec_by_size(size) + local formspec = default_inventory_formspecs[tostring(size)] + return formspec or default_inventory_formspecs +end + +local default_can_dig = function(pos) + local inv = minetest.get_meta(pos):get_inventory() + return inv:is_empty("main") +end + +local function xdecor_stairs_alternative(nodename, def) + local mod, name = nodename:match("(.*):(.*)") + + for groupname, value in pairs(def.groups) do + if groupname ~= "cracky" and groupname ~= "choppy" and + groupname ~= "flammable" and groupname ~= "crumbly" and + groupname ~= "snappy" then + def.groups.groupname = nil + end + end + + if minetest.get_modpath("moreblocks") then + stairsplus:register_all( + mod, + name, + nodename, + { + description = def.description, + tiles = def.tiles, + groups = def.groups, + sounds = def.sounds, + } + ) + elseif minetest.get_modpath("stairs") then + stairs.register_stair_and_slab(name,nodename, + def.groups, + def.tiles, + ("%s Stair"):format(def.description), + ("%s Slab"):format(def.description), + def.sounds + ) + end + end + +function xdecor.register(name, def) + def.drawtype = def.drawtype or (def.mesh and "mesh") or (def.node_box and "nodebox") + def.sounds = def.sounds or default.node_sound_defaults() + + if not (def.drawtype == "normal" or def.drawtype == "signlike" or + def.drawtype == "plantlike" or def.drawtype == "glasslike_framed" or + def.drawtype == "glasslike_framed_optional") then + def.paramtype2 = def.paramtype2 or "facedir" + end + + if def.sunlight_propagates ~= false and + (def.drawtype == "plantlike" or def.drawtype == "torchlike" or + def.drawtype == "signlike" or def.drawtype == "fencelike") then + def.sunlight_propagates = true + end + + if not def.paramtype and + (def.light_source or def.sunlight_propagates or + def.drawtype == "nodebox" or def.drawtype == "mesh") then + def.paramtype = "light" + end + + local infotext = def.infotext + local inventory = def.inventory + def.inventory = nil + + if inventory then + def.on_construct = def.on_construct or function(pos) + local meta = minetest.get_meta(pos) + if infotext then meta:set_string("infotext", infotext) end + + local size = inventory.size or default_inventory_size + local inv = meta:get_inventory() + + inv:set_size("main", size) + meta:set_string("formspec", + (inventory.formspec or get_formspec_by_size(size)) .. xbg) + end + + def.can_dig = def.can_dig or default_can_dig + + elseif infotext and not def.on_construct then + def.on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", infotext) + end + end + + minetest.register_node("xdecor:" .. name, def) + + local workbench = minetest.settings:get_bool("enable_xdecor_workbench") + + if workbench == false and + (minetest.get_modpath("moreblocks") or minetest.get_modpath("stairs")) then + if xdecor.stairs_valid_def(def) then + xdecor_stairs_alternative("xdecor:"..name, def) + end + end +end diff --git a/mods/xdecor/init.lua b/mods/xdecor/init.lua new file mode 100644 index 0000000..b2c333d --- /dev/null +++ b/mods/xdecor/init.lua @@ -0,0 +1,62 @@ +--local t = os.clock() + +xdecor = {} +local modpath = minetest.get_modpath("xdecor") + +-- Intllib +local S +if minetest.get_translator ~= nil then + S = minetest.get_translator("xdecor") -- 5.x translation function +else + if minetest.get_modpath("intllib") then + dofile(minetest.get_modpath("intllib") .. "/init.lua") + if intllib.make_gettext_pair then + gettext, ngettext = intllib.make_gettext_pair() -- new gettext method + else + gettext = intllib.Getter() -- old text file method + end + S = gettext + else -- boilerplate function + S = function(str, ...) + local args = {...} + return str:gsub("@%d+", function(match) + return args[tonumber(match:sub(2))] + end) + end + end +end + +xdecor.S = S +xdecor.reparaible_tools = {"pick", "axe", "shovel", "sword"} + +dofile(modpath .. "/handlers/animations.lua") +dofile(modpath .. "/handlers/helpers.lua") +dofile(modpath .. "/handlers/nodeboxes.lua") +dofile(modpath .. "/handlers/registration.lua") + +if ar_api then xdecor.repairable_tools = {"pick", "axe", "shovel", "sword", "hoe", "armor", "shield"} +else xdecor.repairable_tools = {"pick", "axe", "shovel", "hoe"} end + +dofile(modpath .. "/src/nodes.lua") +dofile(modpath .. "/src/recipes.lua") + +local subpart = { + "chess", + "cooking", + "enchanting", + "hive", + "itemframe", + "mailbox", + "mechanisms", + "rope", + "workbench", +} + +for _, name in ipairs(subpart) do + local enable = minetest.settings:get_bool("enable_xdecor_" .. name) + if enable or enable == nil then + dofile(modpath .. "/src/" .. name .. ".lua") + end +end + +--print(string.format("[xdecor] loaded in %.2f ms", (os.clock()-t)*1000)) diff --git a/mods/xdecor/locale/template.txt b/mods/xdecor/locale/template.txt new file mode 100644 index 0000000..4addddd --- /dev/null +++ b/mods/xdecor/locale/template.txt @@ -0,0 +1,155 @@ +# textdomain: xdecor + + +### chess.lua ### + +Black Bishop= +Black King= +Black Knight= +Black Pawn= +Black Queen= +Black Rook= +Chess= +Chess Board= +Dumb AI= +Multiplayer= +New game= +Select a mode:= +Singleplayer= +Someone else plays black pieces!= +Someone else plays white pieces!= +White Bishop= +White King= +White Knight= +White Pawn= +White Queen= +White Rook= + +You can't dig the chessboard, a game has been started. Reset it first if you're a current player, or dig it again in @1= + +You can't reset the chessboard, a game has been started. If you aren't a current player, try again in @1= + +check= + +### cooking.lua ### + +Bowl= +Bowl of soup= +Cauldron= +Cauldron (active)= +Cauldron (active) - Drop foods inside to make a soup= +Cauldron (active) - Use a bowl to eat the soup= +Cauldron (empty)= +Cauldron (idle)= +No room in your inventory to add a bowl of soup.= +No room in your inventory to add a bucket of water.= + +### enchanting.lua ### + +Axe= +Bronze= +Diamond= +Durability= +Efficiency= +Enchanted @1 @2 @3= +Enchantment Table= +Mese= +Pickaxe= +Sharpness= +Shovel= +Steel= +Sword= +Your tool digs faster= +Your tool last longer= +Your weapon inflicts more damages= + +### hive.lua ### + +Artificial Hive= +Bees are busy making honey…= +Honey= + +### itemframe.lua ### + +@1 (owned by @2)= +Item Frame= + +### mailbox.lua ### + +@1's Mailbox= +Last donators= +Mailbox= +Send your goods to@n@1= +The mailbox is full.= + +### mechanisms.lua ### + +Lever= +Stone Pressure Plate= +Wooden Pressure Plate= + +### nodes.lua ### + +Bamboo Frame= +Baricade= +Barrel= +Cactus Brick= +Candle= +Chainlink= +Chair= +Coal Stone Tile= +Cobweb= +Cushion= +Cushion Block= +Desert Stone Tile= +Empty Shelf= +Ender Chest= +Garden Stone Path= +Half Wooden Cabinet= +Hardened Clay= +Iron Light Box= +Ivy= +Japanese Door= +Lantern= +Moon Brick= +Multi Shelf= +Packed Ice= +Painting= +Potted Geranium= +Potted Rose= +Potted Tulip= +Potted Viola= +Potted White Dandelion= +Potted Yellow Dandelion= +Prison Door= +Red Curtain= +Runestone= +Rusty Iron Bars= +Rusty Prison Door= +Screen Door= +Slide Door= +Stone Tile= +Table= +Tatami= +Television= +Trampoline= +Wood Frame= +Wood Framed Glass= +Wooden Cabinet= +Wooden Light Box= +Wooden Tile= +Woodglass Door= + +### rope.lua ### + +Rope= + +### workbench.lua ### + +Back= +Crafting= +Cut= +Hammer= +Repair= +Storage= +Work Bench= diff --git a/mods/xdecor/locale/xdecor.de.tr b/mods/xdecor/locale/xdecor.de.tr new file mode 100644 index 0000000..bdff769 --- /dev/null +++ b/mods/xdecor/locale/xdecor.de.tr @@ -0,0 +1,153 @@ +# textdomain: xdecor + + +### chess.lua ### + +Black Bishop=schwarzer Läufer +Black King=schwarter König +Black Knight=schwarzes Pferd +Black Pawn=schwarzer Bauer +Black Queen=schwarze Dame +Black Rook=schwarzer Turm +Chess=Schach +Chess Board=Schachbrett +Dumb AI=dumme KI +Multiplayer=Mehrspieler +New game=neues Spiel +Select a mode:=Wähle einen Modus: +Singleplayer=Einzelspieler +Someone else plays black pieces!=Jemand anderes spielt Schwarz! +Someone else plays white pieces!=Jemand anderes spielt Weiß! +White Bishop=weißer Läufer +White King=weißer König +White Knight=weißes Pferd +White Pawn=weißer Bauer +White Queen=weiße Dame +White Rook=weißer Turm +You can't dig the chessboard, a game has been started. Reset it first if you're a current player, or dig it again in @1=Das Schachbrett ist während eines Schachspieles nicht abbaubar. Setze das Spiel zurück, falls du ein Mitspieler bist oder versuche es in @1 erneut. +You can't reset the chessboard, a game has been started. If you aren't a current player, try again in @1=Das Schachbrett kann nicht zurückgesetzt werden, da ein Spiel im Gang ist. Versuche es in @1 erneut, falls du kein Mitspieler bist. + +check=Schach + +### cooking.lua ### + +Bowl=Schüssel +Bowl of soup=Suppenschüssel +Cauldron=Kessel +Cauldron (active)=Kessel (aktiv) +Cauldron (active) - Drop foods inside to make a soup=Kessel (aktiv) - Nahrungsmittel einwerfen, um Suppe zu machen. +Cauldron (active) - Use a bowl to eat the soup=Kessel (aktiv) - Benutze eine Schüssel, um die Suppe zu essen +Cauldron (empty)=Kessel (leer) +Cauldron (idle)=Kessel (untätig) +No room in your inventory to add a bowl of soup.=Zu wenig Platz im Inventar für eine Schüssel voll Suppe. +No room in your inventory to add a bucket of water.=Zu wenig Platz im Inventar für einen Eimer Wasser. + +### enchanting.lua ### + +Axe=axt +Bronze=Bronze +Diamond=Diamant +Durability=Haltbarkeit +Efficiency=Effizienz +Enchanted @1 @2 @3=verzauberte(s) @1@2 @3 +Enchantment Table=Zaubertisch +Mese=Mese +Pickaxe=Spitzhacke +Sharpness=Schärfe +Shovel=Schaufel +Steel=Eisen +Sword=Schwert +Your tool digs faster=Dein Werkzeug arbeitet schneller +Your tool last longer=Dein Werkzeug hält länger +Your weapon inflicts more damages=Deine Waffe erzeugt mehr Schaden + +### hive.lua ### + +Artificial Hive=künstlicher Bienenstock +Bees are busy making honey…=Bienen sind beschäftigt, Honig herzustellen. +Honey=Honig + +### itemframe.lua ### + +@1 (owned by @2)=@1 (gehört @2) +Item Frame=Objektrahmen + +### mailbox.lua ### + +@1's Mailbox=Briefkasten von @1 +Last donators=letzte Spender +Mailbox=Briefkasten +Send your goods to@n@1=Sende deine Waren an@n@1 +The mailbox is full.=Der Briefkasten ist voll. + +### mechanisms.lua ### + +Lever=Schalthebel +Stone Pressure Plate=steinerne Druckplatte +Wooden Pressure Plate=hölzerne Druckplatte + +### nodes.lua ### + +Bamboo Frame=Bambusgerüst +Baricade=Barrikade +Barrel=Fass +Cactus Brick=Kaktusstein +Candle=Kerze +Chainlink=Kettenvorhang +Chair=einfacher Stuhl +Coal Stone Tile=Kohle-Stein-Block +Cobweb=Spinnenwebe +Cushion=Sitzkissen +Cushion Block=Sitzkissenblock +Desert Stone Tile=Wüstensteinblock +Empty Shelf=leeres Regal +Ender Chest=Endertruhe +Garden Stone Path=Steingartenweg +Half Wooden Cabinet=halber Holzschrank +Hardened Clay=gehärteter Ton +Iron Light Box=eiseneingefasster Lichtblock +Ivy=Efeu +Japanese Door=japanische Tür +Lantern=Laterne +Moon Brick=Naturziegelwand +Multi Shelf=Mehrzweckregal +Packed Ice=Packeis +Painting=Gemälde +Potted Geranium=Geranien im Topf +Potted Rose=Rosen im Topf +Potted Tulip=Tulpen im Topf +Potted Viola=Veilchen im Topf +Potted White Dandelion=weißer Löwenzahn im Topf +Potted Yellow Dandelion=gelber Löwenzahn im Topf +Prison Door=Verliestür +Red Curtain=roter Vorhang +Runestone=Runensteinblock +Rusty Iron Bars=rostige Eisenstäbe +Rusty Prison Door=rostige Verliestür +Screen Door=französische Glastür +Slide Door=Schiebetür +Stone Tile=steinerner Block +Table=einfacher Tisch +Tatami=Tatamimatte +Television=Fernseher +Trampoline=Trampolin +Wood Frame=hölzerner Zierrahmen +Wood Framed Glass=holzeingefasstes Glas +Wooden Cabinet=Holzschrank +Wooden Light Box=holzeingefasster Lichtblock +Wooden Tile=hölzerner Dekorblock +Woodglass Door=Tür mit Lichtausschnitt + +### rope.lua ### + +Rope=Seil + +### workbench.lua ### + +Back=Zurück +Crafting=Fertigung +Cut=Zuschnitt +Hammer=Hämmerchen +Repair=Reparatur +Storage=Aufbewahrung +Work Bench=Werkbank diff --git a/mods/xdecor/locale/xdecor.fr.tr b/mods/xdecor/locale/xdecor.fr.tr new file mode 100644 index 0000000..52ae158 --- /dev/null +++ b/mods/xdecor/locale/xdecor.fr.tr @@ -0,0 +1,155 @@ +# textdomain: xdecor + + +### chess.lua ### + +Black Bishop=Fou noir +Black King=Roi noir +Black Knight=Cavalier noir +Black Pawn=Pion noir +Black Queen=Reine noire +Black Rook=Tour noire +Chess=Echecs +Chess Board=Echiquier +Dumb AI=IA stupide +Multiplayer=Multijoueur +New game=Nouvelle partie +Select a mode:=Sélectionnez un mode de jeu: +Singleplayer=Solo +Someone else plays black pieces!=Quelqu’un d’autre joue les pièces noires ! +Someone else plays white pieces!=Quelqu’un d’autre joue les pièces blanches ! +White Bishop=Fou blanc +White King=Roi blanc +White Knight=Cavalier blanc +White Pawn=Pion blanc +White Queen=Reine blanche +White Rook=Tour blanche + +You can't dig the chessboard, a game has been started. Reset it first if you're a current player, or dig it again in @1=Vous ne pouvez pas récupérer l’échiquier, une partie à été commencée. Remettez le à zéro si vous c’est votre tour de jouer, ou réessayez dans @1 + +You can't reset the chessboard, a game has been started. If you aren't a current player, try again in @1=Vous ne pouvez pas mettre à zéro l’échiquier, une partie a été commencée. Si ce n’est pas votre tour de jouer, réessayez dans @1 + +check=échec + +### cooking.lua ### + +Bowl=Bol +Bowl of soup=Bol de soupe +Cauldron=Chaudron +Cauldron (active)=Chaudron (actif) +Cauldron (active) - Drop foods inside to make a soup=Chaudron (actif) - Placez des ingrédients à l’intérieur pour faire une soupe +Cauldron (active) - Use a bowl to eat the soup=Chaudron (actif) - Utilisez un bol pour boire la soupe +Cauldron (empty)=Chaudron (vide) +Cauldron (idle)=Chaudron (inactif) +No room in your inventory to add a bowl of soup.=Pas de place dans votre inventaire pour ajouter un bol de soupe. +No room in your inventory to add a bucket of water.=Pas de place dans votre inventaire pour ajouter un seau d’eau. + +### enchanting.lua ### + +Axe=Hache +Bronze=Bronze +Diamond=Diamant +Durability=Durabilité +Efficiency=Efficacité +Enchanted @1 @2 @3=@2 en @1 enchantée @3 +Enchantment Table=Table d’enchantements +Mese=Mese +Pickaxe=Pioche +Sharpness=Tranchant +Shovel=Pelle +Steel=Fer +Sword=Épée +Your tool digs faster=Votre outil creuse plus vite +Your tool last longer=Votre outil dure plus longtemps +Your weapon inflicts more damages=Votre arme inflige plus de dégâts + +### hive.lua ### + +Artificial Hive=Ruche artificielle +Bees are busy making honey…=Les abeilles sont occupées à fabriquer du miel… +Honey=Miel + +### itemframe.lua ### + +@1 (owned by @2)=@1 (propriété de @2) +Item Frame=Cadre + +### mailbox.lua ### + +@1's Mailbox=Boite aux lettres de @1 +Last donators=Derniers donateurs +Mailbox=Boite aux lettres +Send your goods to@n@1=Envoyer vos biens à@n@1 +The mailbox is full.=La boite aux lettres est pleine. + +### mechanisms.lua ### + +Lever=Levier +Stone Pressure Plate=Plaque de pression en pierre +Wooden Pressure Plate=Plaque de pression en bois + +### nodes.lua ### + +Bamboo Frame=Cadre en bambou +Baricade=Barricade +Barrel=Tonneau +Cactus Brick=Brique en cactus +Candle=Bougie +Chainlink=Maillon de chaîne +Chair=Chaise +Coal Stone Tile=Carreau en charbon et pierre +Cobweb=Toile d’araignée +Cushion=Coussin +Cushion Block=Bloc de coussin +Desert Stone Tile=Carreau en pierre du désert +Empty Shelf=Étagère vide +Ender Chest=Coffre de l’End +Garden Stone Path=Chemin de pierres de jardin +Half Wooden Cabinet=Demi meuble en bois +Hardened Clay=Argile durcie +Iron Light Box=Boite lumineuse en fer +Ivy=Lierre +Japanese Door=Porte japonaise +Lantern=Lanterne +Moon Brick=Brique lunaire +Multi Shelf=Étagères multiple +Packed Ice=Glace compactée +Painting=Tableau +Potted Geranium=Géranium en pot +Potted Rose=Rose en pot +Potted Tulip=Tulipe en pot +Potted Viola=Violette en pot +Potted White Dandelion=Pissenlit blanc en pot +Potted Yellow Dandelion=Pissenlit jaune en pot +Prison Door=Porte de prison +Red Curtain=Rideaux rouge +Runestone=Pierre runique +Rusty Iron Bars=Barreaux en fer rouillé +Rusty Prison Door=Barreaux de prison rouillés +Screen Door=Porte avec moustiquaire +Slide Door=Porte coulissante +Stone Tile=Carreau en pierre +Table=Table +Tatami=Tatami +Television=Télévision +Trampoline=Trampoline +Wood Frame=Cadre en bois +Wood Framed Glass=Verre encadré par du bois +Wooden Cabinet=Meuble en bois +Wooden Light Box=Boite lumineuse en bois +Wooden Tile=Carreau en bois +Woodglass Door=Porte vitrée + +### rope.lua ### + +Rope=Corde + +### workbench.lua ### + +Back=Retour +Crafting=Fabrication +Cut=Couper +Hammer=Marteau +Repair=Réparer +Storage=Stockage +Work Bench=Atelier diff --git a/mods/xdecor/locale/xdecor.it.tr b/mods/xdecor/locale/xdecor.it.tr new file mode 100644 index 0000000..f88655b --- /dev/null +++ b/mods/xdecor/locale/xdecor.it.tr @@ -0,0 +1,155 @@ +# textdomain: xdecor +# Author: Salvo 'LtWorf' Tomaselli + +### chess.lua ### + +Black Bishop=Alfiere nero +Black King=Re nero +Black Knight=Cavallo nero +Black Pawn=Pedone nero +Black Queen=Regina nera +Black Rook=Torre nera +Chess=Scacchi +Chess Board=Scacchiera +Dumb AI=AI stupida +Multiplayer=Multigiocatore +New game=Nuova partita +Select a mode:=Selezionare una modalità +Singleplayer=Singolo giocatore +Someone else plays black pieces!=Qualcun altro gioca con il nero! +Someone else plays white pieces!=Qualcun altro gioca con il bianco! +White Bishop=Alfiere bianco +White King=Re bianco +White Knight=Cavallo bianco +White Pawn=Pedone bianco +White Queen=Regina bianca +White Rook=Torre bianca + +You can't dig the chessboard, a game has been started. Reset it first if you're a current player, or dig it again in @1=Non si può scavare la scacchiera, una partita è in corso. Resettarla se si è uno dei giocatori, o riprovare in @1 + +You can't reset the chessboard, a game has been started. If you aren't a current player, try again in @1=Non si può resettare la partita, un gioco è in corso. Se non si è uno dei giocatori, riprovare in @1 + +check=scacco + +### cooking.lua ### + +Bowl=Ciotola +Bowl of soup=Ciotola di zuppa +Cauldron=Calderone +Cauldron (active)=Calderone (attivo) +Cauldron (active) - Drop foods inside to make a soup=Calderone (attivo) - Mettere gli ingredienti all'interno per fare una zuppa. +Cauldron (active) - Use a bowl to eat the soup=Calderone (actif) - Utilizzare una ciotola per mangiare la zuppa +Cauldron (empty)=Calderone (vuoto) +Cauldron (idle)=Calderone (inattivo) +No room in your inventory to add a bowl of soup.=Non c'è spazio nell'inventario per aggiungere una ciotola di zuppa. +No room in your inventory to add a bucket of water.=Non c'è spazio nell'inventario per aggiungere un secchio di acqua. + +### enchanting.lua ### + +Axe=Ascia +Bronze=Bronzo +Diamond=Diamante +Durability=Durabilità +Efficiency=Efficacia +Enchanted @1 @2 @3=@2 su @1 incantesimo @3 +Enchantment Table=Tavolo per migliorie +Mese=Mese +Pickaxe=Piccone +Sharpness=Affilatezza +Shovel=Pala +Steel=Acciaio +Sword=Spada +Your tool digs faster=Il tuo utensile scava più rapidamente +Your tool last longer=Il tuo utensile dura di più +Your weapon inflicts more damages=La tua arma infligge più danno + +### hive.lua ### + +Artificial Hive=Favo artificiale +Bees are busy making honey…=Le api sono occupate a fare il miele… +Honey=Miele + +### itemframe.lua ### + +@1 (owned by @2)=@1 (proprietà di @2) +Item Frame=Teca + +### mailbox.lua ### + +@1's Mailbox=Cassetta delle lettere di @1 +Last donators=Ultimi donatori +Mailbox=Cassetta delle lettere +Send your goods to@n@1=Invia i tuoi item a@n@1 +The mailbox is full.=La cassetta delle lettere è piena + +### mechanisms.lua ### + +Lever=Leva +Stone Pressure Plate=Placca di pressione di pietra +Wooden Pressure Plate=Placca di pressione di legno + +### nodes.lua ### + +Bamboo Frame=Cornice di bambù +Baricade=Barricata +Barrel=Barile +Cactus Brick=Mattone di cactus +Candle=Candela +Chainlink=Cotta di maglia +Chair=Sedia +Coal Stone Tile=Mattonella di pietra di carbone +Cobweb=Ragnatela +Cushion=Cuscino +Cushion Block=Blocco di cuscini +Desert Stone Tile=Mattonella di pietra del deserto +Empty Shelf=Mensola vuota +Ender Chest=Baule ender +Garden Stone Path=Sentiero da giardino in pietra +Half Wooden Cabinet=Stipo di legno a metà +Hardened Clay=Argilla indurita +Iron Light Box=Scatola luminosa di ferro +Ivy=Edera +Japanese Door=Porta giapponese +Lantern=Lanterna +Moon Brick=Mattone lunare +Multi Shelf=Mensole +Packed Ice=Ghiaccio compatto +Painting=Dipinto +Potted Geranium=Geranio in vaso +Potted Rose=Rosa in vaso +Potted Tulip=Tulipano in vaso +Potted Viola=Violetta in vaso +Potted White Dandelion=Soffione bianco in vaso +Potted Yellow Dandelion=Soffione giallo in vaso +Prison Door=Porta di prigione +Red Curtain=Tenda rossa +Runestone=Pietra runica +Rusty Iron Bars=Sbarre di prigione arrugginite +Rusty Prison Door=Porta di prigione arrugginita +Screen Door=Porta a schermo +Slide Door=Porta scorrevole +Stone Tile=Mattonella di pietra +Table=Tavolo +Tatami=Tatami +Television=Televisione +Trampoline=Trampolino +Wood Frame=Cornice in legno +Wood Framed Glass=Cornice in legno con vetro +Wooden Cabinet=Stipo di legno +Wooden Light Box=Mattonella luminosa di legno +Wooden Tile=Mattonella di legno +Woodglass Door=Porta di vetro + +### rope.lua ### + +Rope=Corda + +### workbench.lua ### + +Back=Indietro +Crafting=Fabbricare +Cut=Tagliare +Hammer=Martello +Repair=Riparare +Storage=Conservare +Work Bench=Banco da lavoro diff --git a/mods/xdecor/mod.conf b/mods/xdecor/mod.conf new file mode 100644 index 0000000..5ae1cae --- /dev/null +++ b/mods/xdecor/mod.conf @@ -0,0 +1,5 @@ +name = xdecor +description = HOME decoration mod meant to be simple +depends = default, bucket, doors, farming, stairs, xpanes +optional_depends = fire, oresplus, moreblocks, mesecons +min_minetest_version = 0.4.16 diff --git a/mods/xdecor/screenshot.png b/mods/xdecor/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..ae0c2e11a4bc149633ad47f29a35a458de55fadf GIT binary patch literal 104919 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%0Dd8!r0G_ws%lk&6DZ3ipcrJC_}a=! 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 z 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 literal 0 HcmV?d00001 diff --git a/mods/xdecor/settingtypes.txt b/mods/xdecor/settingtypes.txt new file mode 100644 index 0000000..f75d75c --- /dev/null +++ b/mods/xdecor/settingtypes.txt @@ -0,0 +1,11 @@ +#For enabling a subpart of X-Decor. + +enable_xdecor_chess (Enable Chess) bool true +enable_xdecor_cooking (Enable Cooking) bool true +enable_xdecor_enchanting (Enable Enchanting) bool true +enable_xdecor_hive (Enable Hive) bool true +enable_xdecor_itemframe (Enable Itemframe) bool true +enable_xdecor_mailbox (Enable Mailbox) bool true +enable_xdecor_mechanisms (Enable Mechanisms) bool true +enable_xdecor_rope (Enable Rope) bool true +enable_xdecor_workbench (Enable Workbench) bool true \ No newline at end of file diff --git a/mods/xdecor/sounds/xdecor_boiling_water.ogg b/mods/xdecor/sounds/xdecor_boiling_water.ogg new file mode 100644 index 0000000000000000000000000000000000000000..cc1e7a5ead4f608c50555f5a6dd52abe237cbb5f GIT binary patch literal 14833 zcmd6NbyOWsv*29ZAxLn7ySoPq?(XjHZV8qU0zrejTW}2$65NApaF^f?JLLC$@4Y>1 zXV3n#efsuosjlg=p6cpRva(VGpn!j+FQL40&()rq`&9@D#M8;u)W+?(0}|Z&{09L4 z{%?XPJqW2*TVJE;sQJ1ZL( zD;p~pDeYQX=znCoXWS6jf9Adt6W0XMLjXK8bvnru)nBq7@ZA#FBvVY|WIq&yz7&(r zaKlzB;hRafD{rnR4aFc(Q>KGWQH@r$!8iN-T*Hu)p>oIMr^ztG(3AN-oox3}w1FrT zHC0uf?q`B(q!7;1cRUk2~Y+AjL00kNT|^8 zawvcu0AR9dqt|GoDfr^dWM2LS0lAL>0G-a*GO^hG)s%9-8097;R5SvnxHU8`Jq%`^ zGbyJz&NEgK>7tYZ0@5xNb36o89aw-AWRWCo7Y6jd*#nr;^1Y|7+wymd4zc93rtjWz zcP5|Ol5wQp+DdmD;iE}&>*3u_cZ+njWU~h0(%mpaEb0EKW&Yd}wJUw@>)|U3agoFW z;Zp0iL~XgJ!M>Mug?zTm-C&J;b4$j7c?ztJ@PQzIi&ESoH)q9X%(<6ax{hMFU`-gm z$j?pex$i&W{$USDuP7dOxJwbKbXMM5yf^P{`tsqI@_tZSqqriKNaf|ls_u~{sQ1Xw zW&A@q0sxSOVyjA%h5f5|PZo}6+DBKE{tk)0BtJKjeSooch<)(6*srP`;Xh#gi6M?s zQHLp~P(P(@R?)njZin_u*QTO=T9&Q=lrr64{sn{LLBKcvEGqeo`8`=-y6XU4aW>Rn zc7lV?h9TJRCL!hipSjmfP%1$}2F!KxgOl<~I2u!l271#LOP3BNxSmT_9>1?V)@Q;@ zbdoIoyZjI7ASJ;VVhH~bQh;YR#I~IsuPpX&GD*P)cB&9{yHHBGQufC&%EWWZ)d~(z z2r8UQs9-BhsK3#2f3sBgW-dWt#$92~T|=kdK&QcBZrZ^p$>H}^z<mQu%+%%zqX9GXRXm67|OtfeJ1IRv>@53)%t{ z;EdAy8B}^u*JFuiO1yIE_P2K*d{87R<)w*PBtB;O`KIN|Kt{}Dpiq}V9LnknV|Zq zqzBX%C?fF37z!>Q22cTjP&R40d~DMwzM^#TD7x)rw{W&CBDZM1?QC~d`t5XgMcJQt zV6!OQO_iS}(M?g7CI{3H03Q4y=Zt;Efrz97!J=`3N~fGE37ksUZ`9lkR5%T0P6emV z<<&HV#?>{{G#uvCHFS~$M>&Ni)HOyqHKxEOxOXJI(U@|W@bFl0*H}t&ShzCKd+Dj7 z;jpA`u)w1+b7?Sl8K5)mVRkC0aUnn9AvED`G3DW)=V4%QC9jsGFq3F8;o-25Xkp-G zF?Yo^;chUYVKL`!Fz0EZ)o7q|88G1y_B+wSNXtS8&(q*4Om8M})7@Z6%R-As6CBl> z30s}^Fi8Mo_@dPm&Xia;Jaz0~T;5N`odd94k z30{nl|b z;7uC$2rx->Sk<=B;R{^VPFlK3v;a|QJIvu}>bwj$y3W|V3|RN}Fu-?Q+8$~-M(I7y zzZ;mCaxhB?SkkdH@`_%?%p?GLc+x2rUG_#1g6{Wx>?Fz~T7=)LrCUzg$y z8~{ZNc@{0!fJhD*15_|C1c;&hkZZ1!ORJMa8(Fy1l55>knQv2AVv}j3n`)I>Xj584 zms-halWL=zX_=Z@lu~G&T4|SBSRPqOH&|#pP-Bx?bI?-b&{}D~kZbd|X`foi*jiJz zP1v?E#OKVN(-6NN^PGp*Dx-$uz;(2#+$9g9wwf1){)~Wwm75zdD(_IU= zs^fu5r?S%W{paSpoh06d5PzBYv92P)30aftQ0_+;+ zbkNh#(BoE^YOnxR5ZqEtI2GnVE1FiAs&mjuaxiJISOtL_E%YuuW)eM&W&+k{ES9!f zY7Pf$D(*_lZX1s7x}5hb{~!SXo-+U-u;!p(6VzY=@4;Om$|Q;n;gjkJAAF9=0N*yL z`G_b2S>g~M0$D;F*q4yNzD=4Cr-}g9bdkvt5>)MA0RWp9+_z@4>8g33wFMHa4gewR z+8{r3ZRcyuWHLdnmXtOeN+)f9$h83_r3dyDmXucR@2CFLv%d%O=WkC-3v+62NonbR zOHCyxl+sFu)|!KTuu{4|P|0}LRoYU?0J3zys|uVBieRC^X%XDr+mG+MVk`DrnD4vT zP^2Kh3L+XH0?S<%90f%V1nEA3iw(z7Q?6I zG=BqN(0~jPr^|nS=l*^1{*Q(9|7zfWI-}%&hw6Viq!s6VB5ko8GacgVAp%u#lPDBJ)rP5Y0Mya^NmYjwH&xw_ zAP~oPem=I|FkghK>c{G>RJ)`6I!(Juu5Df2GOn3)x8dfxmv)t)7w$I51{R>-hxae% z4;EPA# zcNBD-+|c;{I@|EXpvMhb%(E$lV#v~h1vnat!T((Rtvwg2vVWV1ISI-DVEh&u5D7*t zqe#d81pD&YI6)UAm?$Y*btF_YS~Lb#bU=jzRZO05JjGPemIFuaGap8VJ0`xZ=$s)t zGPrw_0;HWV7l(^>FfVv~qND1#PyZD}uI{pqKViBXK2PImlbjryv_NOf)05?aZcrx0HF_jq!GokkOSmTSfMZon1OIP)+fENL)YGLXq1Sj2Nr z)QM#q$&%?sU9vsG3lDs*0(WSxMp-hVl8!>T-wg~5rAaF2Z#(CmB=hme-+314BX{Tb z&G%q^+T^6(8d+S{9iHJ%r6>D7Nv#Tqe1{1JNbDc^9G$O-i8IBD=`xGqtMqCOus~Z1 zo^7q)&TQS)SzK70p+Xpw&?3p_fls>*JEAWU)KC2qpU!C38m+&P{D!~$B!6S`#dxj0bjO z$Y5*$(|y$1r-)ePIgX+vJH*zB+A8|8$~yEEYkISHRO2B2(z_Q+Q)D4=L7xgz-H8p?ccLl9_l>`87O(+hMNWDT0Gj2=3 zUcc$E5z_J)8gV54`|57gUmVr2jTx59xw^koc?SzGDcrWZk%^U~c3{m&Bqn&=ZzmBc z2geP~jQgTq&K);ngkb=b046aI$PlQ+5={IjEcL_#UzD)wB~V3)$N>14bPzl}CQ-T( zBrSbadz~p;*9g(v?(2t^U%Jrdo#Mg9TCk1&x!L#n!3v|Kk~?HyZtjF}C2bx;Y@he~ zk;h_Fwm=vUWd%8dCjj9-f}cjPL=V9%4cp*rrUV-q)U!QGLriGeddlZOU#AXaZZoYOYrXo&}g=vd=*kT+M}8*iFMIN z<3}5K9rhg?CJwr#3Ngf#$)1i!I!g$mb-eX^vaMGhD~!oI`(dQzpP!n@fESQL{HU(R zV3>!NE))YSakHOUX;NO--q-*RAMdoj&p9sQYXJo96tRpf>)^ zI2cnM>NuWX8Rum}v&lbyqlXE_c71U9Rg1oz`N1qO>f+cPc#^o-Ui0c`fA!Bv>M|k7-xzH?Qq}N-dY{-Cob8 zT6!$qd{>JSw7|Y}%-#yBc@T(~Y?w(2$h5gn#U&%~h`d2myHPcbEhDC$)Ip|^@T4(4 zJT?DZZ&<5{q~9&Th;}2Hu|;Kk9%-F1q+rd63x{aTzcw)f&=zIIm) zkaS^h7?>jPuzY8E9~YhJiS~o8M?mJM_OeLKB)&ubZ=U0#{XCW10KZoijaY7CZ5FLG zua~SB_Zb*8=+h+Emv7+&V>q@#!zr)ppR&ECO6oz4wmmmlyXom( zx4Pzjqn2%zcBbSrOr&g;~qTvX4&KaXV;Bb{BTw^W&vS}|LE zmrjyR68;aipF?x;t<$WJyu(&XggZ>~Pb zx?a|I^)H>>z?=z>x7|JAa?B|u^I2tKkyj%7g?X~6ba1xVcR^#JDhERm0D*gLMFQ@3 zKwx&EcP^BBRg&x%a6j7n;tAt)K;aJa*ldL^u4c3PBVqKzu9(34rm07n*x6Lv{*v=J z^k$e3jg-6`#SQjUHST3B2Ma$2M98@R1lT_)HP|?r1AKwen^DaT1x=d5{Mi7%2n6-n zWPifT2c=*enN3D&B@kM944_o!ODpFXZ@xHfA8gu|cWL#jsFbf{OR;6o79tD_mA^bd zPQ~H=lqf-9$~WoDlB1rYAE6?mkmZ3AUx`e<;oO?zJ*yNs+lsIm9~VKkjx?pU*z)dO z&WTeSlSuIdY>EgJ31MIX&FMwPC8(~EU-tDUtMwvB;;N8fXBQg03A)S?ygW_Xv* z|2*%*0IfC4_g^MlFxfv~KrPjKj8nRHhwq=kB(YKVtDbH5yU0=!#n!lf%tLGJf|9S>FBgUTFYvNNTb@6)dhdU;QY=lbqduWY z-a=qCGj$9 zvxc&ngIPMq>*45~S9uY*~oX606JR|O5+&P34}R1jer0dS518wu(B0hLM6o+!ZR0{xh6 zDH!{q{D*X=(v~z+S2-a4@zncTHE3iaip-SEGce)JaE(#f;<4^k6uso>Mbl=+7Yc=_ z`ZRfc3)-W5yg4qeoC4hLJ1-?>#*&dS=8^L+lJIex1{OqLwCon=`AFkAgGH18xIeJK zW7#AB5di-uJauhQ?q%KkX$U}Rf&(bWeU0ta+jtmhR@Ju=kf19_H|%GsrdYnKAbV2W z_vG*m@Nv2w9iA&}W?na1bk8A=3@=4WXYBw82EU+K8^IAseqRC_5xuoZA%+Z(_DVz8 z0xPJXDhfeUFp|-A(F66bD-ZAMvRDo?X?WywEmIZoWPBPArM&V^l}ReRZn+y?tB8FG z`U#a$iuYdfjlJc2I{+eZrB>$D+{&}`KF=7TOxi5F_R?5AWGx*I3ZO&Kv)tKe_8a0uzl)HjT%#WOuzS#qLDYMWL?q^L$*M5Fb$W6xq1Y({F%)A`2sJ5F zHcjSjz&U*A>tOIz&`yihIylYn5-65Q#zFFKleeGq4qOmQb@KQoDl+x)m+Do#Zvho^ zcbHCW?^K1wp^s~ay1p9XC-+ky9#0dmEa+qO&^E$UgZd-L0fl%7{RIAFuqY>Glbr>P z)t)i8HBGRzvlE0A5Z-HRqQO940lh^Jbheo$>5RD4VyHHf+M8Dks%9vqWxd;Cg^D#>W`Nl_T!kG1MW9p@+?k*cHaQ z7E%{Hbhga>a%E%7BW3 zhEOJyIy8q}Q14;nmFDOcXY*a1huN-wpq!)e>ig|i4CK3>ux=uxA4A!nqr5!YZ%l8H zPj@)Y2X}}RT9Hh6eEunTaz8WKjK^^ zzuhfPS;BH|S6^>Q4{zkTluUU0zd%)`XI;Y(#Kr(J_u6h~q=T$k?n{)_?nkse+G?V+ zrJw;FTkWuScb{n6n4-V+o(qPA1y+ROF?CO2BNtijjJVJ>`}-XDJI?bkefjk26Ah2c z4(;zx(N1onoXIC@8RfzuW4_0`49r8N7JV%hA(<33SZ7_F4J6h*rVzNVD-dvNCJ0Ov zs2LpF+ z;N$k%3UFICe&qMO(yJ)+CVy~V;cj3W?gIH+m*Upo=O3l#+F*0~g6PYJG{21Vipl^pHM1lA0KipmN7g5 z@|em+k+bX&MJt407-(P_DX>w1(~o1d_p=?SG#@GO2&>1)P-D?j~muW9SrFvUlC~A-PK-S8@qj1NOK{^|9_K!PR z&cw;@t)u3DpO9>6ds^Rz`k0q|6z*S_&HjlC1C>9lC{mJR%pM%4dI83Y?=UY`0n8m`8z_QKV?@x*11@o+n;^dd&|kknN*=XQ zO-e0(*D@Zj_nNv*DIRS*fHmSU8D893LxX(RWq`wMvsTCT#9Id^%2V(lP0x4w!dJ%D z^wsUxGd6SV{V!WqScy&=4?J>DW7A$YN=V;tR|R-SY)q^3KlDyz>nBc~23$6SE@wL5ww|pJLVe z?T>*LSK*D4^x1~~J#Kz?d)MM+m54OfSw(pt{iDq3TwMq8NzS{8ev*Es5ge59S0Yy; z{-TL2&;UR1xc9KbLmLo$3(d7&ug6_vH!}TF7E7ZOYnW#^FzadjQcdZ|)^~fz241am z95b72(4I_{OkVh-lOf~QS_;#p{I`w_qwxFfaRMy_j+25}!Nf0S_^0}iiK*RL!4@tB zv=jA6Yq+MgeC*&C*^n$ccY9=@#{>%G>opCh3&$$FZKT%(ZG932Iwz+|*t-Wd@r~Hm zG{?Qw?M9Qm7tY^8qKFjFjwOdTV91a^pw6kX@>KpgKvqjeCTBc8Q$}dKl}XxTKgCbd zz0I}u2M(iA6xgxpCM0hhQ9MG(Z;KVr3xdTvMIg|OB;f8Dz{o=60u9RY+g?k<`;ndH z)UZ4;(G;)S%<+rr2(Fs7;TuL;MH{zeMz*TMlXDnbu5shI`=W*ArXVX{%y=498waZJ zhh!X=*CQ1e4_?gf0l$=FjcqN5PMxjdGx%#9^J8cZ$dUQ|t5+ge(Ts@z5`n-A9>!{p zRWJZI7^W;Gb;L{;p#dR{NaD&OLlYRa%4F&NuFv|jhx6xQXIOZ;qkGj}u~OHyTRYDd zmz}Jv2;!eAe>!v=w3--$ue$y6Vpv_5uvy4R;l*nzFLx9o4m}lx!?*1V*F?+3RSC@EXA_2GThI#yGiUxj} zaQx5Rd)rrRe)SfZcTk#WTNcQfSv)DX{#gy~Q1i{B%Ww}Hz5~BXG@udyF{n;xL%BzS ztbd%$DJnvyyb)9xUV32hb^3x~^R1ub$vCPO)tWQX{rS;9!MDEr^*yS4ab&A}A8Hk*OUnOeto(Ke>agzE$qGaS0RTO~1oYxr z{AX`=zfmw8&m~vM3L2=VR)LUGX7w#*&6y3xbi{J&lC4#b#m`rnND+K=Dzd3t-d!~g zke$1wo-Z-rTU5e4dzF!lo5AKkGLn8Ou)}oZ&a|c<_|}D3F~WIF<19b-r3!Cw!4N;Td^>q#SD;9Wg=x-?u zlGZDa7LNTIO74;%^L*-gqE09vxp;Cbr`o?LbWm5g7DkrJDjh3?n{gocqexB_w_Opi5uF)iqjd2VJsPwH1!NUZxl4n zAKQ{5xqM*TQ}s!$nU+5BFeWJ4jhQS)>lB5+0FMNLmja9dkf5;**H0;(dXlP?<-p`` zR|9)qk7Bp>%q(%THOu{qL+p;Q`YiOlLl4uf$f8j!L9D2DxVeFOg8{_y!x0UhGD|7_ zLrH-;8BFu#H7q_8<)--4zBrxj3d{UYgwBUOZWAv>pwdmcgb+1vg@)nl?@+H1QMlHf z?gI_lTVLVSCU5)ZTH*rTaaHu%26^Kfm)EY*Pv3GX3>qJha=jP%>bpC*P?HewRs$&(_KMO*qa~Y&q%LfhP0!<*a_1}ECz?Y za7AETj|p9J%7S^v5h=x_Q~FcAIInyV4P~{~sl7Az7Ur5erFeoDYxsx?1NsFGfW2P( z&=zcR2Nie&*(Q4_^w9UiaQhtOu|PSnv2ylught*0pc;|ZPuto4(6Mkl!9eIye?`s= z%p(dH;Uc=&tq>yFMt*IdZ@P1DU%F!CumnDrgHpHeX!LsIE*J9GY5yeN7(EL>=HOrR zFz+3iXe}5T=m~wfFkeTPn#@@4TRq3+eY@tFuB}nIu@T@R)0utYN%ksT$^4A>TY|~* zS346qr0*WcC*zPIG(h$(;__Y_6OZ)?q+OZNuw;31Yj`HEz*QS|-_d7>!rM+6=;<>-Q2~7YXQf^OtYDGr`zBf8XNmrB}?BT>G!&0upXJu4+QnR*oNT5!Y zXuZxVe~j9ZG#{fyS&a~UoU@aKn!w8m({|-)VUV43*crPaIui!i_k?~4rc!nau+A!c zI~qNbdcjAM;e~6U7f1PFB_rO5V>f2idX(eQ-R-jqP(g#e8)!XIJ?t z-|vBLV(UXPIoH3cle!3$S{gXINEA~9HwPBq=*VgFt{v1B&3z<5%;#e`_<87t`d;;; zVg8TqNZjGPR#&QKZI|(LTBKyEgYJwt_+S{y!;cTgAuDFU@PtM#J*{uzf`4kpp+ z$DmWvd9Rhh$nFNIr5>WZ_yh%>A~=bCbe?4)8-C#3?wIgWSqrmnf{z6iAh_!{>mvgE zK|?@rNnL7S6&Z##2@0<3jx8+kAq$vg3#1P zJ$bpfPL2IFByIlt7g!T0y0YytTA02JD>TlN*eqXIGA!)B6)2=K4k3x$B#k;kUHUZ$ zeTrT6Z)Wx7Urx(p8RhFn-5dW_gVT2C6@o*_eoDXFJ#yDyt>t!YDt^g#7HmHi#e;8; zQ6!>><+0#Zs}-iJF>AIb@ah*4RyrOuA~6;cU=9F=$d5YA$|q2P*_PkPLlPInw{>bL z>9Kj+g6jLR#M>zS&UCzr*VQ9zratLlS%$|aRT^S0$vP+Az2(Q!uWcK^*Rp{*{Y5Yt zpHTW`XqNr0tr^LdzPnhJi&dn4te4+5D&pJ9heQHNz&Zi}Ko^0oGDHrHdUah&EN=t` z4Rna{-M%I>wNR=+{@B{ywX0NDY*yc@FL4PNa(*4k(P`}nRNYIm(Y^}W=(%?nq%4W#0N>T-Kk7 zX&C-@aOC_VPWvvqP8;deeC`#m-I?*=&ro2`5qErrouCAtX`L2u4-nn%m8kH}C3-ia zK}ZJcs{Wm;h2mUS>rq z$y9|@lTb@Wf+>xksK;LtU})y0VH!iB1IxEUEe?S+Acq|iWwRh3|lN$!}5i!IQUROt)_&=DbvbNaJWpp z!p;_lfJ#&#z!?O3sGvYy*m%Y-hxQoRyUL+l`6b0V>hhTmvv^ME39SW@f`?VyeSVog zYP|o$#<7v$g1KmG_sX%l2;_EeTBwX{HTFk(ByqajK5;$L_FkOR*=q7O3~32+Hx-y#+|;?XL; z{pJ`h(?(9S*Skvi^ZMuZaJ!(#Xir@2FWrgRc()|`bROUY9cS^oFkuJNwBfZBWJ=TW-ZqORX2Xm=&JYplrJ9ytug<&q@ob z-7Z;VG4Ff3EA#HMM5$2dg~V)>$>a{A%&Zb#hv$zI7;1n3PY8PDtt2$?H&_94=lP$( z3K%e0@rxe{kp!23gb0_Ah|s~+)y>7r-Ota@%FET!&&|`@-OI<1a+d}%fYqPS*+WdA z-XXWwItBg3`UF4r`p3=fcQy=f83rc;uycfcy{0%-W#TT^c!{<-ZcCukbg`Ov%f4VD zqD>v4*xf=1_~j3BPhzU3PSCCv9yD|ighgx*x9~W_Gy5AOP@aOs48+mRw z1d^8_@zdB}TYOWz0|Q%%x&`}60q+qhT0T>rf|$pMAmN@~{ZXk3>t9>_C0!H{yX*5n zBZF#WaTg1ds>#0Qs`8jscv!V;ECa3F@5WIEOm3fYZPvzeO3D46RAf!YA(W(VVKIdn z9@Dc(hen3H8C1Z~NAQleORkivoi@Z+@7l7X1GP1y7KO_D>`S>DT>UJt`oRXxg3+N} zaTluzxj(=6Ha=d7)8qgr^gd#8z(2EQQ`$i8?eU(!UkH9yu?zp@k&h~+j}OMucgEGk zAS81ofK&eOK?t4}oqjp47+#apS zx|c`Z?(prdTO2gbQV0xsIGZ;o`=r5>8_HhnR`@wOeH&~1acr?eK3uF19Xs0Y7SOLk zD9AC2w-edOX31qXr1Bw^nRw2UovqBVFUiZ!Uv>6#9(2K~HPdH@G= z1vCMF&ocXKO=X65ykL1( zB~G9(P68)E_mHB!aA?xv*MQTGD(1Il_qA5PM)4|{Aqsjmp&Oqst;<;ouCcG)%^98f zO0BSDU-+)Qj&H)GQ2kz@?u-C_5bCh=HlO2lUgn;FO_KMSbh0L(PVY*4mTcPTL}>5 z>&g{5#zN*_ffxz|?hv2+5x*cmNL~BTfYvj;Zq25OZK4S|?04|r3d;NTHEJ{{GvP7d zVm7eE(ar1Yo}jtX%!9FGNI#5ART~b43*3O%?G`QBXK!xjr;p+)L$|**wsjro@w`f3 zThJePzS0Pu%X>i+!`tlvIk)rY4o=vjLLdO6Xv^S-BU})3%*DR?2)l1pGeA+d$KaQ&S-N2Jy(R;yOhC$V|j=;9~v-A`jzc>$SF}$GxX4(2* zKM4KqUrJqNUZdhgcGTt_PM;P^?=_BYyV>p&yBNJ|4tDlceKjQpn~zVnb>vw_z<3EY z_wJ(JWMe91D^n2C$%_ZxB|W;oB0YCr!4FMcD~q2sYrJ5D0CHXQ*ugDozj=sFhtjgl z4#}oJ!<$|T`J!k=22MG8IRe|>p?Kc8MhH&GrCBRF^lp%v2QeX4f$tp3(=Jq^glvj|IKgkR4 zMw1{FpT@WKQePML611f|M!k9!%vu;s9=-M?;{J5s|K3H(so_(y=t1uqGFsxqriTmM z*Y4yg`MGxtXMAe-)&9HaM&49Pb_dM79TF?h16ke+NT4Alp}eP6Q~PEq$6AC}MjchU z(qopHcG$RnxX}A&Sa@?1zdnOw!4@vpyS@QnM{n|8iB`DunW#=yGp84bIQe$Xz3lhZV7A#SQ*$OqjXXb^$+r z0YQHa#zU!P>^O28ldus>J9`&)OuO}2nw@56v?m0&L)K_bJsR}Xof2YW* z6lcj;xWVOnwaQL8UKK_4Dp20JZ7o_yDJrp#M;4G(9NAzA=*ADMG~2I|ptV@W6=AV; zjxGzWFiE}&4%YzWN%ocskr_`Qk6@Iof``lA*;j|RRM}aIH?#l6ILpu4w#8B5vOSbr zY#(wweG_yjk?4o^CGKQ@HQNq5TKIBZ%;DYD6J<)YhBMMTA>Nwn1Y!y~W%`HdTh>Zm z8`ELZ#sDEB_dq3yuRPEwvzo!v&QL($Z9u*NDGAhYRyYP%_rAtpCPjC@4@|}PVr6BQ zFPB8z5_hQ;b1GU_N^QS(Q*H4D=bTz+=7tbe^LCSCqI(bsd_wen3{6%bX-A1 z!G7-AlOVT76Lh^^#AP2QOb+cCL9q2vJcXcnF;TvS&jMAR9?2aQ8dikDbpQ>~7z&ha z4}7$b=qawX9C&3{JqKe#i)5JxHJT;2kH=8TcTH5}_QZ$NlZ8ZQFXYOCWhq&Y*n0|F z?=Y;c-#D4=s8jt)U>7%Hi&+^@dchs#_!3SmrYGp*U>DX@2y3-4714}&oQk1-irWkS zU^FCb5gTR5^M^lCUf}mluO_3M_I)abee{@3po5hOEOC@w1Z*8R9Byp2M@-YKi$clE zr^mx6YfR`bvJHe2V~;4E3oE9XmMyE8jvuTmxh_655_i$Hsb{WsPrd2qn<6HcaIRuc zZF>I_VArixX{UCuGxe3$_Ql@;UI4JmNF>`VecQ;_@Lb(q$HwnptfE|KLj_M#)+mdp zxpfrPDW=@<9BWrwwG}J#8V&w_>%RC@hYjU8J&3P4<X{Ky!P2Wevfyc){bhoAIMHh+yU zh3ypc){V7Cn&AzmI<5B=uGW5DMWS6vPc6q zg@L&OG_*-Vk!8)y#y5!j%J+S@{B-*=)dF<;+-SztS!{lDtC4=&Z(|g^WTUO1AtN^~ N5X2St>`7zDe*@z8j<)~+ literal 0 HcmV?d00001 diff --git a/mods/xdecor/sounds/xdecor_bouncy.ogg b/mods/xdecor/sounds/xdecor_bouncy.ogg new file mode 100644 index 0000000000000000000000000000000000000000..779e825d62fcfa737554dcdc122e4dd907c36d89 GIT binary patch literal 5131 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 IA&m(}cR;q*iA zI&st3T%S$VM_)L_8XO4YlnAcoe%IPvAmAYFf_{`Q4AFUilY%Ez8bMZMtP*HtfwPUk z&yvKu9IzF$Ac7Ry9pruOQ#{GbP?m2XPn3O3h#o>rbX=YXwbYdO)so9Afl;~CR5F5Q zC>*upI(n5EP`>$bmY;C}iXC-m>ZB>-p-0ITZvmN~4S}2b6r^+T`SPcu{>B`_ABEWV zyb{7G4>FsBjMT(q7vf_4#-`SZp5oh2fVIrTNIe)G3?rbvjW44o%)q^H44PiFT+JFm ziks?77Yt5Iuk&^h(`RvGr<1@yqdH3dRj;}zt+ld0Y_DvqYz33sCZAEwfhTPP&#hr&ahb)b9Ty^mM4y8 z8eiO-dLvFu)6Mv~Owof3y&*cnVOPELkR1pr^GKLTu@0e=5-b`EB*6S+9d#ihSzc@uYgEfG?mpJJG0*Z9_j$#e*oq)o!|ff literal 0 HcmV?d00001 diff --git a/mods/xdecor/src/chess.lua b/mods/xdecor/src/chess.lua new file mode 100644 index 0000000..15c2dc1 --- /dev/null +++ b/mods/xdecor/src/chess.lua @@ -0,0 +1,1484 @@ +local realchess = {} +local S = xdecor.S +local FS = function(...) return minetest.formspec_escape(S(...)) end +local ALPHA_OPAQUE = minetest.features.use_texture_alpha_string_modes and "opaque" or false +screwdriver = screwdriver or {} + +local function index_to_xy(idx) + if not idx then + return nil + end + + idx = idx - 1 + + local x = idx % 8 + local y = (idx - x) / 8 + + return x, y +end + +local function xy_to_index(x, y) + return x + y * 8 + 1 +end + +local function get_square(a, b) + return (a * 8) - (8 - b) +end + +local chat_prefix = minetest.colorize("#FFFF00", "["..S("Chess").."] ") +local letters = {'A','B','C','D','E','F','G','H'} + +local function board_to_table(inv) + local t = {} + for i = 1, 64 do + t[#t + 1] = inv:get_stack("board", i):get_name() + end + + return t +end + +local piece_values = { + pawn = 10, + knight = 30, + bishop = 30, + rook = 50, + queen = 90, + king = 900 +} + +local function get_possible_moves(board, from_idx) + local piece, color = board[from_idx]:match(":(%w+)_(%w+)") + if not piece then return end + local moves = {} + local from_x, from_y = index_to_xy(from_idx) + + for i = 1, 64 do + local stack_name = board[i] + if stack_name:find((color == "black" and "white" or "black")) or + stack_name == "" then + moves[i] = 0 + end + end + + for to_idx in pairs(moves) do + local pieceTo = board[to_idx] + local to_x, to_y = index_to_xy(to_idx) + + -- PAWN + if piece == "pawn" then + if color == "white" then + local pawnWhiteMove = board[xy_to_index(from_x, from_y - 1)] + -- white pawns can go up only + if from_y - 1 == to_y then + if from_x == to_x then + if pieceTo ~= "" then + moves[to_idx] = nil + end + elseif from_x - 1 == to_x or from_x + 1 == to_x then + if not pieceTo:find("black") then + moves[to_idx] = nil + end + else + moves[to_idx] = nil + end + elseif from_y - 2 == to_y then + if pieceTo ~= "" or from_y < 6 or pawnWhiteMove ~= "" then + moves[to_idx] = nil + end + else + moves[to_idx] = nil + end + + --[[ + if x not changed + ensure that destination cell is empty + elseif x changed one unit left or right + ensure the pawn is killing opponent piece + else + move is not legal - abort + ]] + + if from_x == to_x then + if pieceTo ~= "" then + moves[to_idx] = nil + end + elseif from_x - 1 == to_x or from_x + 1 == to_x then + if not pieceTo:find("black") then + moves[to_idx] = nil + end + else + moves[to_idx] = nil + end + + elseif color == "black" then + local pawnBlackMove = board[xy_to_index(from_x, from_y + 1)] + -- black pawns can go down only + if from_y + 1 == to_y then + if from_x == to_x then + if pieceTo ~= "" then + moves[to_idx] = nil + end + elseif from_x - 1 == to_x or from_x + 1 == to_x then + if not pieceTo:find("white") then + moves[to_idx] = nil + end + else + moves[to_idx] = nil + end + elseif from_y + 2 == to_y then + if pieceTo ~= "" or from_y > 1 or pawnBlackMove ~= "" then + moves[to_idx] = nil + end + else + moves[to_idx] = nil + end + + --[[ + if x not changed + ensure that destination cell is empty + elseif x changed one unit left or right + ensure the pawn is killing opponent piece + else + move is not legal - abort + ]] + + if from_x == to_x then + if pieceTo ~= "" then + moves[to_idx] = nil + end + elseif from_x - 1 == to_x or from_x + 1 == to_x then + if not pieceTo:find("white") then + moves[to_idx] = nil + end + else + moves[to_idx] = nil + end + else + moves[to_idx] = nil + end + + -- ROOK + elseif piece == "rook" then + if from_x == to_x then + -- Moving vertically + if from_y < to_y then + -- Moving down + -- Ensure that no piece disturbs the way + for i = from_y + 1, to_y - 1 do + if board[xy_to_index(from_x, i)] ~= "" then + moves[to_idx] = nil + end + end + else + -- Mocing up + -- Ensure that no piece disturbs the way + for i = to_y + 1, from_y - 1 do + if board[xy_to_index(from_x, i)] ~= "" then + moves[to_idx] = nil + end + end + end + elseif from_y == to_y then + -- Mocing horizontally + if from_x < to_x then + -- mocing right + -- ensure that no piece disturbs the way + for i = from_x + 1, to_x - 1 do + if board[xy_to_index(i, from_y)] ~= "" then + moves[to_idx] = nil + end + end + else + -- Mocing left + -- Ensure that no piece disturbs the way + for i = to_x + 1, from_x - 1 do + if board[xy_to_index(i, from_y)] ~= "" then + moves[to_idx] = nil + end + end + end + else + -- Attempt to move arbitrarily -> abort + moves[to_idx] = nil + end + + -- KNIGHT + elseif piece == "knight" then + -- Get relative pos + local dx = from_x - to_x + local dy = from_y - to_y + + -- Get absolute values + if dx < 0 then + dx = -dx + end + + if dy < 0 then + dy = -dy + end + + -- Sort x and y + if dx > dy then + dx, dy = dy, dx + end + + -- Ensure that dx == 1 and dy == 2 + if dx ~= 1 or dy ~= 2 then + moves[to_idx] = nil + end + -- Just ensure that destination cell does not contain friend piece + -- ^ It was done already thus everything ok + + -- BISHOP + elseif piece == "bishop" then + -- Get relative pos + local dx = from_x - to_x + local dy = from_y - to_y + + -- Get absolute values + if dx < 0 then + dx = -dx + end + + if dy < 0 then + dy = -dy + end + + -- Ensure dx and dy are equal + if dx ~= dy then + moves[to_idx] = nil + end + + if from_x < to_x then + if from_y < to_y then + -- Moving right-down + -- Ensure that no piece disturbs the way + for i = 1, dx - 1 do + if board[xy_to_index(from_x + i, from_y + i)] ~= "" then + moves[to_idx] = nil + end + end + else + -- Moving right-up + -- Ensure that no piece disturbs the way + for i = 1, dx - 1 do + if board[xy_to_index(from_x + i, from_y - i)] ~= "" then + moves[to_idx] = nil + end + end + end + else + if from_y < to_y then + -- Moving left-down + -- Ensure that no piece disturbs the way + for i = 1, dx - 1 do + if board[xy_to_index(from_x - i, from_y + i)] ~= "" then + moves[to_idx] = nil + end + end + else + -- Moving left-up + -- ensure that no piece disturbs the way + for i = 1, dx - 1 do + if board[xy_to_index(from_x - i, from_y - i)] ~= "" then + moves[to_idx] = nil + end + end + end + end + + -- QUEEN + elseif piece == "queen" then + local dx = from_x - to_x + local dy = from_y - to_y + + -- Get absolute values + if dx < 0 then + dx = -dx + end + + if dy < 0 then + dy = -dy + end + + -- Ensure valid relative move + if dx ~= 0 and dy ~= 0 and dx ~= dy then + moves[to_idx] = nil + end + + if from_x == to_x then + -- Moving vertically + if from_y < to_y then + -- Moving down + -- Ensure that no piece disturbs the way + for i = from_y + 1, to_y - 1 do + if board[xy_to_index(from_x, i)] ~= "" then + moves[to_idx] = nil + end + end + else + -- Mocing up + -- Ensure that no piece disturbs the way + for i = to_y + 1, from_y - 1 do + if board[xy_to_index(from_x, i)] ~= "" then + moves[to_idx] = nil + end + end + end + elseif from_x < to_x then + if from_y == to_y then + -- Goes right + -- Ensure that no piece disturbs the way + for i = 1, dx - 1 do + if board[xy_to_index(from_x + i, from_y)] ~= "" then + moves[to_idx] = nil + end + end + elseif from_y < to_y then + -- Goes right-down + -- Ensure that no piece disturbs the way + for i = 1, dx - 1 do + if board[xy_to_index(from_x + i, from_y + i)] ~= "" then + moves[to_idx] = nil + end + end + else + -- Goes right-up + -- Ensure that no piece disturbs the way + for i = 1, dx - 1 do + if board[xy_to_index(from_x + i, from_y - i)] ~= "" then + moves[to_idx] = nil + end + end + end + else + if from_y == to_y then + -- Mocing horizontally + if from_x < to_x then + -- mocing right + -- ensure that no piece disturbs the way + for i = from_x + 1, to_x - 1 do + if board[xy_to_index(i, from_y)] ~= "" then + moves[to_idx] = nil + end + end + else + -- Mocing left + -- Ensure that no piece disturbs the way + for i = to_x + 1, from_x - 1 do + if board[xy_to_index(i, from_y)] ~= "" then + moves[to_idx] = nil + end + end + end + elseif from_y < to_y then + -- Goes left-down + -- Ensure that no piece disturbs the way + for i = 1, dx - 1 do + if board[xy_to_index(from_x - i, from_y + i)] ~= "" then + moves[to_idx] = nil + end + end + else + -- Goes left-up + -- Ensure that no piece disturbs the way + for i = 1, dx - 1 do + if board[xy_to_index(from_x - i, from_y - i)] ~= "" then + moves[to_idx] = nil + end + end + end + end + + -- KING + elseif piece == "king" then + local dx = from_x - to_x + local dy = from_y - to_y + + if dx < 0 then + dx = -dx + end + + if dy < 0 then + dy = -dy + end + + if dx > 1 or dy > 1 then + moves[to_idx] = nil + end + end + end + + if not next(moves) then return end + + for i in pairs(moves) do + local stack_name = board[tonumber(i)] + if stack_name ~= "" then + for p, value in pairs(piece_values) do + if stack_name:find(p) then + moves[i] = value + end + end + end + end + + return moves +end + +local function best_move(moves) + local value, choices = 0, {} + + for from, _ in pairs(moves) do + for to, val in pairs(_) do + if val > value then + value = val + choices = {{ + from = from, + to = to + }} + elseif val == value then + choices[#choices + 1] = { + from = from, + to = to + } + end + end + end + + local random = math.random(1, #choices) + local choice_from, choice_to = choices[random].from, choices[random].to + + return tonumber(choice_from), choice_to +end + +local rowDirs = {-1, -1, -1, 0, 0, 1, 1, 1} +local colDirs = {-1, 0, 1, -1, 1, -1, 0, 1} + +local rowDirsKnight = { 2, 1, 2, 1, -2, -1, -2, -1} +local colDirsKnight = {-1, -2, 1, 2, 1, 2, -1, -2} + +local bishopThreats = {true, false, true, false, false, true, false, true} +local rookThreats = {false, true, false, true, true, false, true, false} +local queenThreats = {true, true, true, true, true, true, true, true} +local kingThreats = {true, true, true, true, true, true, true, true} + +local function attacked(color, idx, board) + local threatDetected = false + local kill = color == "white" + local pawnThreats = {kill, false, kill, false, false, not kill, false, not kill} + + for dir = 1, 8 do + if not threatDetected then + local col, row = index_to_xy(idx) + col, row = col + 1, row + 1 + + for step = 1, 8 do + row = row + rowDirs[dir] + col = col + colDirs[dir] + + if row >= 1 and row <= 8 and col >= 1 and col <= 8 then + local square = get_square(row, col) + local square_name = board[square] + local piece, pieceColor = square_name:match(":(%w+)_(%w+)") + + if piece then + if pieceColor ~= color then + if piece == "bishop" and bishopThreats[dir] then + threatDetected = true + elseif piece == "rook" and rookThreats[dir] then + threatDetected = true + elseif piece == "queen" and queenThreats[dir] then + threatDetected = true + else + if step == 1 then + if piece == "pawn" and pawnThreats[dir] then + threatDetected = true + end + if piece == "king" and kingThreats[dir] then + threatDetected = true + end + end + end + end + break + end + end + end + + local colK, rowK = index_to_xy(idx) + colK, rowK = colK + 1, rowK + 1 + rowK = rowK + rowDirsKnight[dir] + colK = colK + colDirsKnight[dir] + + if rowK >= 1 and rowK <= 8 and colK >= 1 and colK <= 8 then + local square = get_square(rowK, colK) + local square_name = board[square] + local piece, pieceColor = square_name:match(":(%w+)_(%w+)") + + if piece and pieceColor ~= color and piece == "knight" then + threatDetected = true + end + end + end + end + + return threatDetected +end + +local function locate_kings(board) + local Bidx, Widx + for i = 1, 64 do + local piece, color = board[i]:match(":(%w+)_(%w+)") + if piece == "king" then + if color == "black" then + Bidx = i + else + Widx = i + end + end + end + + return Bidx, Widx +end + +local pieces = { + "realchess:rook_black_1", + "realchess:knight_black_1", + "realchess:bishop_black_1", + "realchess:queen_black", + "realchess:king_black", + "realchess:bishop_black_2", + "realchess:knight_black_2", + "realchess:rook_black_2", + "realchess:pawn_black_1", + "realchess:pawn_black_2", + "realchess:pawn_black_3", + "realchess:pawn_black_4", + "realchess:pawn_black_5", + "realchess:pawn_black_6", + "realchess:pawn_black_7", + "realchess:pawn_black_8", + '','','','','','','','','','','','','','','','', + '','','','','','','','','','','','','','','','', + "realchess:pawn_white_1", + "realchess:pawn_white_2", + "realchess:pawn_white_3", + "realchess:pawn_white_4", + "realchess:pawn_white_5", + "realchess:pawn_white_6", + "realchess:pawn_white_7", + "realchess:pawn_white_8", + "realchess:rook_white_1", + "realchess:knight_white_1", + "realchess:bishop_white_1", + "realchess:queen_white", + "realchess:king_white", + "realchess:bishop_white_2", + "realchess:knight_white_2", + "realchess:rook_white_2" +} + +local pieces_str, x = "", 0 +for i = 1, #pieces do + local p = pieces[i]:match(":(%w+_%w+)") + if pieces[i]:find(":(%w+)_(%w+)") and not pieces_str:find(p) then + pieces_str = pieces_str .. x .. "=" .. p .. ".png," + x = x + 1 + end +end +pieces_str = pieces_str .. "69=mailbox_blank16.png" + +local fs_init = [[ + size[4,1.2;] + no_prepend[] + ]] + .."label[0,0;"..FS("Select a mode:").."]" + .."button[0,0.5;2,1;single;"..FS("Singleplayer").."]" + .."button[2,0.5;2,1;multi;"..FS("Multiplayer").."]" + +local fs = [[ + size[14.7,10;] + no_prepend[] + bgcolor[#080808BB;true] + background[0,0;14.7,10;chess_bg.png] + list[context;board;0.3,1;8,8;] + listcolors[#00000000;#00000000;#00000000;#30434C;#FFF] + tableoptions[background=#00000000;highlight=#00000000;border=false] + ]] + .."button[10.5,8.5;2,2;new;"..FS("New game").."]" + .."tablecolumns[image," .. pieces_str .. + ";text;color;text;color;text;image," .. pieces_str .. "]" + +local function update_formspec(meta) + local black_king_attacked = meta:get_string("blackAttacked") == "true" + local white_king_attacked = meta:get_string("whiteAttacked") == "true" + + local playerWhite = meta:get_string("playerWhite") + local playerBlack = meta:get_string("playerBlack") + + local moves = meta:get_string("moves") + local eaten_img = meta:get_string("eaten_img") + local lastMove = meta:get_string("lastMove") + local turnBlack = minetest.colorize("#000001", (lastMove == "white" and playerBlack ~= "") and + playerBlack .. "..." or playerBlack) + local turnWhite = minetest.colorize("#000001", (lastMove == "black" and playerWhite ~= "") and + playerWhite .. "..." or playerWhite) + local check_s = minetest.colorize("#FF0000", "\\["..FS("check").."\\]") + + local formspec = fs .. + "label[1.9,0.3;" .. turnBlack .. (black_king_attacked and " " .. check_s or "") .. "]" .. + "label[1.9,9.15;" .. turnWhite .. (white_king_attacked and " " .. check_s or "") .. "]" .. + "table[8.9,1.05;5.07,3.75;moves;" .. moves:sub(1,-2) .. ";1]" .. + eaten_img + + meta:set_string("formspec", formspec) +end + +local function get_moves_list(meta, pieceFrom, pieceTo, pieceTo_s, from_idx, to_idx) + local from_x, from_y = index_to_xy(from_idx) + local to_x, to_y = index_to_xy(to_idx) + local moves = meta:get_string("moves") + local pieceFrom_s = pieceFrom:match(":(%w+_%w+)") + local pieceFrom_si_id = pieces_str:match("(%d+)=" .. pieceFrom_s) + local pieceTo_si_id = pieceTo_s ~= "" and pieces_str:match("(%d+)=" .. pieceTo_s) or "" + + local coordFrom = letters[from_x + 1] .. math.abs(from_y - 8) + local coordTo = letters[to_x + 1] .. math.abs(to_y - 8) + + local new_moves = pieceFrom_si_id .. "," .. + coordFrom .. "," .. + (pieceTo ~= "" and "#33FF33" or "#FFFFFF") .. ", > ,#FFFFFF," .. + coordTo .. "," .. + (pieceTo ~= "" and pieceTo_si_id or "69") .. "," .. + moves + + meta:set_string("moves", new_moves) +end + +local function get_eaten_list(meta, pieceTo, pieceTo_s) + local eaten = meta:get_string("eaten") + if pieceTo ~= "" then + eaten = eaten .. pieceTo_s .. "," + end + + meta:set_string("eaten", eaten) + + local eaten_t = string.split(eaten, ",") + local eaten_img = "" + + local a, b = 0, 0 + for i = 1, #eaten_t do + local is_white = eaten_t[i]:sub(-5,-1) == "white" + local X = (is_white and a or b) % 4 + local Y = ((is_white and a or b) % 16 - X) / 4 + + if is_white then + a = a + 1 + else + b = b + 1 + end + + eaten_img = eaten_img .. + "image[" .. ((X + (is_white and 11.67 or 8.8)) - (X * 0.45)) .. "," .. + ((Y + 5.56) - (Y * 0.2)) .. ";1,1;" .. eaten_t[i] .. ".png]" + end + + meta:set_string("eaten_img", eaten_img) +end + +function realchess.init(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + + meta:set_string("formspec", fs_init) + meta:set_string("infotext", S("Chess Board")) + meta:set_string("playerBlack", "") + meta:set_string("playerWhite", "") + meta:set_string("lastMove", "") + meta:set_string("blackAttacked", "") + meta:set_string("whiteAttacked", "") + + meta:set_int("lastMoveTime", 0) + meta:set_int("castlingBlackL", 1) + meta:set_int("castlingBlackR", 1) + meta:set_int("castlingWhiteL", 1) + meta:set_int("castlingWhiteR", 1) + + meta:set_string("moves", "") + meta:set_string("eaten", "") + meta:set_string("mode", "") + + inv:set_list("board", pieces) + inv:set_size("board", 64) +end + +function realchess.move(pos, from_list, from_index, to_list, to_index, _, player) + if from_list ~= "board" and to_list ~= "board" then + return 0 + end + + local meta = minetest.get_meta(pos) + local playerName = player:get_player_name() + local inv = meta:get_inventory() + local pieceFrom = inv:get_stack(from_list, from_index):get_name() + local pieceTo = inv:get_stack(to_list, to_index):get_name() + local lastMove = meta:get_string("lastMove") + local playerWhite = meta:get_string("playerWhite") + local playerBlack = meta:get_string("playerBlack") + local thisMove -- Will replace lastMove when move is legal + + if pieceFrom:find("white") then + if playerWhite ~= "" and playerWhite ~= playerName then + minetest.chat_send_player(playerName, chat_prefix .. S("Someone else plays white pieces!")) + return 0 + end + + if lastMove ~= "" and lastMove ~= "black" then + return 0 + end + + if pieceTo:find("white") then + -- Don't replace pieces of same color + return 0 + end + + playerWhite = playerName + thisMove = "white" + + elseif pieceFrom:find("black") then + if playerBlack ~= "" and playerBlack ~= playerName then + minetest.chat_send_player(playerName, chat_prefix .. S("Someone else plays black pieces!")) + return 0 + end + + if lastMove ~= "" and lastMove ~= "white" then + return 0 + end + + if pieceTo:find("black") then + -- Don't replace pieces of same color + return 0 + end + + playerBlack = playerName + thisMove = "black" + end + + -- MOVE LOGIC + + local from_x, from_y = index_to_xy(from_index) + local to_x, to_y = index_to_xy(to_index) + + -- PAWN + if pieceFrom:sub(11,14) == "pawn" then + if thisMove == "white" then + local pawnWhiteMove = inv:get_stack(from_list, xy_to_index(from_x, from_y - 1)):get_name() + -- white pawns can go up only + if from_y - 1 == to_y then + if from_x == to_x then + if pieceTo ~= "" then + return 0 + elseif to_index >= 1 and to_index <= 8 then + inv:set_stack(from_list, from_index, "realchess:queen_white") + end + elseif from_x - 1 == to_x or from_x + 1 == to_x then + if not pieceTo:find("black") then + return 0 + elseif to_index >= 1 and to_index <= 8 then + inv:set_stack(from_list, from_index, "realchess:queen_white") + end + else + return 0 + end + elseif from_y - 2 == to_y then + if pieceTo ~= "" or from_y < 6 or pawnWhiteMove ~= "" then + return 0 + end + else + return 0 + end + + --[[ + if x not changed + ensure that destination cell is empty + elseif x changed one unit left or right + ensure the pawn is killing opponent piece + else + move is not legal - abort + ]] + + if from_x == to_x then + if pieceTo ~= "" then + return 0 + end + elseif from_x - 1 == to_x or from_x + 1 == to_x then + if not pieceTo:find("black") then + return 0 + end + else + return 0 + end + + elseif thisMove == "black" then + local pawnBlackMove = inv:get_stack(from_list, xy_to_index(from_x, from_y + 1)):get_name() + -- black pawns can go down only + if from_y + 1 == to_y then + if from_x == to_x then + if pieceTo ~= "" then + return 0 + elseif to_index >= 57 and to_index <= 64 then + inv:set_stack(from_list, from_index, "realchess:queen_black") + end + elseif from_x - 1 == to_x or from_x + 1 == to_x then + if not pieceTo:find("white") then + return 0 + elseif to_index >= 57 and to_index <= 64 then + inv:set_stack(from_list, from_index, "realchess:queen_black") + end + else + return 0 + end + elseif from_y + 2 == to_y then + if pieceTo ~= "" or from_y > 1 or pawnBlackMove ~= "" then + return 0 + end + else + return 0 + end + + --[[ + if x not changed + ensure that destination cell is empty + elseif x changed one unit left or right + ensure the pawn is killing opponent piece + else + move is not legal - abort + ]] + + if from_x == to_x then + if pieceTo ~= "" then + return 0 + end + elseif from_x - 1 == to_x or from_x + 1 == to_x then + if not pieceTo:find("white") then + return 0 + end + else + return 0 + end + else + return 0 + end + + -- ROOK + elseif pieceFrom:sub(11,14) == "rook" then + if from_x == to_x then + -- Moving vertically + if from_y < to_y then + -- Moving down + -- Ensure that no piece disturbs the way + for i = from_y + 1, to_y - 1 do + if inv:get_stack(from_list, xy_to_index(from_x, i)):get_name() ~= "" then + return 0 + end + end + else + -- Mocing up + -- Ensure that no piece disturbs the way + for i = to_y + 1, from_y - 1 do + if inv:get_stack(from_list, xy_to_index(from_x, i)):get_name() ~= "" then + return 0 + end + end + end + elseif from_y == to_y then + -- Mocing horizontally + if from_x < to_x then + -- mocing right + -- ensure that no piece disturbs the way + for i = from_x + 1, to_x - 1 do + if inv:get_stack(from_list, xy_to_index(i, from_y)):get_name() ~= "" then + return 0 + end + end + else + -- Mocing left + -- Ensure that no piece disturbs the way + for i = to_x + 1, from_x - 1 do + if inv:get_stack(from_list, xy_to_index(i, from_y)):get_name() ~= "" then + return 0 + end + end + end + else + -- Attempt to move arbitrarily -> abort + return 0 + end + + if thisMove == "white" or thisMove == "black" then + if pieceFrom:sub(-1) == "1" then + meta:set_int("castlingWhiteL", 0) + elseif pieceFrom:sub(-1) == "2" then + meta:set_int("castlingWhiteR", 0) + end + end + + -- KNIGHT + elseif pieceFrom:sub(11,16) == "knight" then + -- Get relative pos + local dx = from_x - to_x + local dy = from_y - to_y + + -- Get absolute values + if dx < 0 then dx = -dx end + if dy < 0 then dy = -dy end + + -- Sort x and y + if dx > dy then dx, dy = dy, dx end + + -- Ensure that dx == 1 and dy == 2 + if dx ~= 1 or dy ~= 2 then + return 0 + end + -- Just ensure that destination cell does not contain friend piece + -- ^ It was done already thus everything ok + + -- BISHOP + elseif pieceFrom:sub(11,16) == "bishop" then + -- Get relative pos + local dx = from_x - to_x + local dy = from_y - to_y + + -- Get absolute values + if dx < 0 then dx = -dx end + if dy < 0 then dy = -dy end + + -- Ensure dx and dy are equal + if dx ~= dy then return 0 end + + if from_x < to_x then + if from_y < to_y then + -- Moving right-down + -- Ensure that no piece disturbs the way + for i = 1, dx - 1 do + if inv:get_stack( + from_list, xy_to_index(from_x + i, from_y + i)):get_name() ~= "" then + return 0 + end + end + else + -- Moving right-up + -- Ensure that no piece disturbs the way + for i = 1, dx - 1 do + if inv:get_stack( + from_list, xy_to_index(from_x + i, from_y - i)):get_name() ~= "" then + return 0 + end + end + end + else + if from_y < to_y then + -- Moving left-down + -- Ensure that no piece disturbs the way + for i = 1, dx - 1 do + if inv:get_stack( + from_list, xy_to_index(from_x - i, from_y + i)):get_name() ~= "" then + return 0 + end + end + else + -- Moving left-up + -- ensure that no piece disturbs the way + for i = 1, dx - 1 do + if inv:get_stack( + from_list, xy_to_index(from_x - i, from_y - i)):get_name() ~= "" then + return 0 + end + end + end + end + + -- QUEEN + elseif pieceFrom:sub(11,15) == "queen" then + local dx = from_x - to_x + local dy = from_y - to_y + + -- Get absolute values + if dx < 0 then dx = -dx end + if dy < 0 then dy = -dy end + + -- Ensure valid relative move + if dx ~= 0 and dy ~= 0 and dx ~= dy then + return 0 + end + + if from_x == to_x then + if from_y < to_y then + -- Goes down + -- Ensure that no piece disturbs the way + for i = from_y + 1, to_y - 1 do + if inv:get_stack(from_list, xy_to_index(from_x, i)):get_name() ~= "" then + return 0 + end + end + else + -- Goes up + -- Ensure that no piece disturbs the way + for i = to_y + 1, from_y - 1 do + if inv:get_stack(from_list, xy_to_index(from_x, i)):get_name() ~= "" then + return 0 + end + end + end + elseif from_x < to_x then + if from_y == to_y then + -- Goes right + -- Ensure that no piece disturbs the way + for i = from_x + 1, to_x - 1 do + if inv:get_stack(from_list, xy_to_index(i, from_y)):get_name() ~= "" then + return 0 + end + end + elseif from_y < to_y then + -- Goes right-down + -- Ensure that no piece disturbs the way + for i = 1, dx - 1 do + if inv:get_stack( + from_list, xy_to_index(from_x + i, from_y + i)):get_name() ~= "" then + return 0 + end + end + else + -- Goes right-up + -- Ensure that no piece disturbs the way + for i = 1, dx - 1 do + if inv:get_stack( + from_list, xy_to_index(from_x + i, from_y - i)):get_name() ~= "" then + return 0 + end + end + end + else + if from_y == to_y then + -- Goes left + -- Ensure that no piece disturbs the way and destination cell does + for i = to_x + 1, from_x - 1 do + if inv:get_stack(from_list, xy_to_index(i, from_y)):get_name() ~= "" then + return 0 + end + end + elseif from_y < to_y then + -- Goes left-down + -- Ensure that no piece disturbs the way + for i = 1, dx - 1 do + if inv:get_stack( + from_list, xy_to_index(from_x - i, from_y + i)):get_name() ~= "" then + return 0 + end + end + else + -- Goes left-up + -- Ensure that no piece disturbs the way + for i = 1, dx - 1 do + if inv:get_stack( + from_list, xy_to_index(from_x - i, from_y - i)):get_name() ~= "" then + return 0 + end + end + end + end + + -- KING + elseif pieceFrom:sub(11,14) == "king" then + local dx = from_x - to_x + local dy = from_y - to_y + local check = true + + if thisMove == "white" then + if from_y == 7 and to_y == 7 then + if to_x == 2 then + local castlingWhiteL = meta:get_int("castlingWhiteL") + local idx57 = inv:get_stack(from_list, 57):get_name() + + if castlingWhiteL == 1 and idx57 == "realchess:rook_white_1" then + for i = 58, from_index - 1 do + if inv:get_stack(from_list, i):get_name() ~= "" then + return 0 + end + end + + inv:set_stack(from_list, 57, "") + inv:set_stack(from_list, 60, "realchess:rook_white_1") + check = false + end + elseif to_x == 6 then + local castlingWhiteR = meta:get_int("castlingWhiteR") + local idx64 = inv:get_stack(from_list, 64):get_name() + + if castlingWhiteR == 1 and idx64 == "realchess:rook_white_2" then + for i = from_index + 1, 63 do + if inv:get_stack(from_list, i):get_name() ~= "" then + return 0 + end + end + + inv:set_stack(from_list, 62, "realchess:rook_white_2") + inv:set_stack(from_list, 64, "") + check = false + end + end + end + elseif thisMove == "black" then + if from_y == 0 and to_y == 0 then + if to_x == 2 then + local castlingBlackL = meta:get_int("castlingBlackL") + local idx1 = inv:get_stack(from_list, 1):get_name() + + if castlingBlackL == 1 and idx1 == "realchess:rook_black_1" then + for i = 2, from_index - 1 do + if inv:get_stack(from_list, i):get_name() ~= "" then + return 0 + end + end + + inv:set_stack(from_list, 1, "") + inv:set_stack(from_list, 4, "realchess:rook_black_1") + check = false + end + elseif to_x == 6 then + local castlingBlackR = meta:get_int("castlingBlackR") + local idx8 = inv:get_stack(from_list, 8):get_name() + + if castlingBlackR == 1 and idx8 == "realchess:rook_black_2" then + for i = from_index + 1, 7 do + if inv:get_stack(from_list, i):get_name() ~= "" then + return 0 + end + end + + inv:set_stack(from_list, 6, "realchess:rook_black_2") + inv:set_stack(from_list, 8, "") + check = false + end + end + end + end + + if check then + if dx < 0 then + dx = -dx + end + + if dy < 0 then + dy = -dy + end + + if dx > 1 or dy > 1 then + return 0 + end + end + + if thisMove == "white" then + meta:set_int("castlingWhiteL", 0) + meta:set_int("castlingWhiteR", 0) + + elseif thisMove == "black" then + meta:set_int("castlingBlackL", 0) + meta:set_int("castlingBlackR", 0) + end + end + + local board = board_to_table(inv) + board[to_index] = board[from_index] + board[from_index] = "" + + local black_king_idx, white_king_idx = locate_kings(board) + if not black_king_idx or not white_king_idx then + return 0 + end + local blackAttacked = attacked("black", black_king_idx, board) + local whiteAttacked = attacked("white", white_king_idx, board) + + if blackAttacked then + if thisMove == "black" then + --[(*)[ and meta:get_string("blackAttacked") == "true" ]] then + return 0 + else + meta:set_string("blackAttacked", "true") + end + else + meta:set_string("blackAttacked", "") + end + + if whiteAttacked then + if thisMove == "white" then + --[(*)[ and meta:get_string("whiteAttacked") == "true" ]] then + return 0 + else + meta:set_string("whiteAttacked", "true") + end + else + meta:set_string("whiteAttacked", "") + end + + --(*) Allow a piece to move and put its king in check. Maybe not in the chess rules though? + + lastMove = thisMove + meta:set_string("lastMove", lastMove) + meta:set_int("lastMoveTime", minetest.get_gametime()) + + if meta:get_string("playerWhite") == "" then + meta:set_string("playerWhite", playerWhite) + elseif meta:get_string("playerBlack") == "" then + meta:set_string("playerBlack", playerBlack) + end + + local pieceTo_s = pieceTo ~= "" and pieceTo:match(":(%w+_%w+)") or "" + get_moves_list(meta, pieceFrom, pieceTo, pieceTo_s, from_index, to_index) + get_eaten_list(meta, pieceTo, pieceTo_s) + + return 1 +end + +local function ai_move(inv, meta) + local board_t = board_to_table(inv) + local lastMove = meta:get_string("lastMove") + + if lastMove == "white" then + update_formspec(meta) + local moves = {} + + for i = 1, 64 do + local possibleMoves = get_possible_moves(board_t, i) + local stack_name = inv:get_stack("board", i):get_name() + + if stack_name:find("black") then + moves[tostring(i)] = possibleMoves + end + end + + local choice_from, choice_to = best_move(moves) + + local pieceFrom = inv:get_stack("board", choice_from):get_name() + local pieceTo = inv:get_stack("board", choice_to):get_name() + local pieceTo_s = pieceTo ~= "" and pieceTo:match(":(%w+_%w+)") or "" + + local board = board_to_table(inv) + local black_king_idx = locate_kings(board) + local blackAttacked = attacked("black", black_king_idx, board) + local kingSafe = true + local bestMoveSaveFrom, bestMoveSaveTo + + if blackAttacked then + kingSafe = false + meta:set_string("blackAttacked", "true") + local save_moves = {} + + for from_idx, _ in pairs(moves) do + for to_idx, value in pairs(_) do + from_idx = tonumber(from_idx) + local from_idx_bak, to_idx_bak = board[from_idx], board[to_idx] + board[to_idx] = board[from_idx] + board[from_idx] = "" + black_king_idx = locate_kings(board) + + if black_king_idx then + blackAttacked = attacked("black", black_king_idx, board) + if not blackAttacked then + save_moves[from_idx] = save_moves[from_idx] or {} + save_moves[from_idx][to_idx] = value + end + end + + board[from_idx], board[to_idx] = from_idx_bak, to_idx_bak + end + end + + if next(save_moves) then + bestMoveSaveFrom, bestMoveSaveTo = best_move(save_moves) + end + end + + minetest.after(1.0, function() + local lastMoveTime = meta:get_int("lastMoveTime") + if lastMoveTime > 0 then + if not kingSafe then + if bestMoveSaveTo then + inv:set_stack("board", bestMoveSaveTo, board[bestMoveSaveFrom]) + inv:set_stack("board", bestMoveSaveFrom, "") + meta:set_string("blackAttacked", "") + else + return + end + else + if pieceFrom:find("pawn") and choice_to >= 57 and choice_to <= 64 then + inv:set_stack("board", choice_to, "realchess:queen_black") + else + inv:set_stack("board", choice_to, pieceFrom) + end + + inv:set_stack("board", choice_from, "") + end + + board = board_to_table(inv) + local _, white_king_idx = locate_kings(board) + local whiteAttacked = attacked("white", white_king_idx, board) + + if whiteAttacked then + meta:set_string("whiteAttacked", "true") + end + + if meta:get_string("playerBlack") == "" then + meta:set_string("playerBlack", S("Dumb AI")) + end + + meta:set_string("lastMove", "black") + meta:set_int("lastMoveTime", minetest.get_gametime()) + + get_moves_list(meta, pieceFrom, pieceTo, pieceTo_s, choice_from, choice_to) + get_eaten_list(meta, pieceTo, pieceTo_s) + + update_formspec(meta) + end + end) + else + update_formspec(meta) + end +end + +function realchess.on_move(pos, from_list, from_index) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_stack(from_list, from_index, "") + + if meta:get_string("mode") == "single" then + ai_move(inv, meta) + end + + return false +end + +local function timeout_format(timeout_limit) + local time_remaining = timeout_limit - minetest.get_gametime() + local minutes = math.floor(time_remaining / 60) + local seconds = time_remaining % 60 + + if minutes == 0 then + return seconds .. " sec." + end + + return minutes .. " min. " .. seconds .. " sec." +end + +function realchess.fields(pos, _, fields, sender) + local playerName = sender:get_player_name() + local meta = minetest.get_meta(pos) + local timeout_limit = meta:get_int("lastMoveTime") + 300 + local playerWhite = meta:get_string("playerWhite") + local playerBlack = meta:get_string("playerBlack") + local lastMoveTime = meta:get_int("lastMoveTime") + if fields.quit then return end + + if fields.single or fields.multi then + meta:set_string("mode", (fields.single and "single" or "multi")) + update_formspec(meta) + return + end + + -- Timeout is 5 min. by default for resetting the game (non-players only) + if fields.new then + if (playerWhite == playerName or playerBlack == playerName) then + realchess.init(pos) + + elseif lastMoveTime > 0 then + if minetest.get_gametime() >= timeout_limit and + (playerWhite ~= playerName or playerBlack ~= playerName) then + realchess.init(pos) + else + minetest.chat_send_player(playerName, chat_prefix .. + S("You can't reset the chessboard, a game has been started. " .. + "If you aren't a current player, try again in @1", + timeout_format(timeout_limit))) + end + end + end +end + +function realchess.dig(pos, player) + if not player then + return false + end + + local meta = minetest.get_meta(pos) + local playerName = player:get_player_name() + local timeout_limit = meta:get_int("lastMoveTime") + 300 + local lastMoveTime = meta:get_int("lastMoveTime") + + -- Timeout is 5 min. by default for digging the chessboard (non-players only) + return (lastMoveTime == 0 and minetest.get_gametime() > timeout_limit) or + minetest.chat_send_player(playerName, chat_prefix .. + S("You can't dig the chessboard, a game has been started. " .. + "Reset it first if you're a current player, or dig it again in @1", + timeout_format(timeout_limit))) +end + +minetest.register_node(":realchess:chessboard", { + description = S("Chess Board"), + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + inventory_image = "chessboard_top.png", + wield_image = "chessboard_top.png", + tiles = {"chessboard_top.png", "chessboard_top.png", "chessboard_sides.png"}, + use_texture_alpha = ALPHA_OPAQUE, + groups = {choppy=3, oddly_breakable_by_hand=2, flammable=3}, + sounds = default.node_sound_wood_defaults(), + node_box = {type = "fixed", fixed = {-.375, -.5, -.375, .375, -.4375, .375}}, + sunlight_propagates = true, + on_rotate = screwdriver.rotate_simple, + can_dig = realchess.dig, + on_construct = realchess.init, + on_receive_fields = realchess.fields, + allow_metadata_inventory_move = realchess.move, + on_metadata_inventory_move = realchess.on_move, + allow_metadata_inventory_take = function() return 0 end +}) + +local function register_piece(name, white_desc, black_desc, count) + for _, color in pairs({"black", "white"}) do + if not count then + minetest.register_craftitem(":realchess:" .. name .. "_" .. color, { + description = (color == "black") and black_desc or white_desc, + inventory_image = name .. "_" .. color .. ".png", + stack_max = 1, + groups = {not_in_creative_inventory=1} + }) + else + for i = 1, count do + minetest.register_craftitem(":realchess:" .. name .. "_" .. color .. "_" .. i, { + description = (color == "black") and black_desc or white_desc, + inventory_image = name .. "_" .. color .. ".png", + stack_max = 1, + groups = {not_in_creative_inventory=1} + }) + end + end + end +end + +register_piece("pawn", S("White Pawn"), S("Black Pawn"), 8) +register_piece("rook", S("White Rook"), S("Black Rook"), 2) +register_piece("knight", S("White Knight"), S("Black Knight"), 2) +register_piece("bishop", S("White Bishop"), S("Black Bishop"), 2) +register_piece("queen", S("White Queen"), S("Black Queen")) +register_piece("king", S("White King"), S("Black King")) + +-- Recipes + +minetest.register_craft({ + output = "realchess:chessboard", + recipe = { + {"dye:black", "dye:white", "dye:black"}, + {"stairs:slab_wood", "stairs:slab_wood", "stairs:slab_wood"} + } +}) diff --git a/mods/xdecor/src/cooking.lua b/mods/xdecor/src/cooking.lua new file mode 100644 index 0000000..3dae2f4 --- /dev/null +++ b/mods/xdecor/src/cooking.lua @@ -0,0 +1,267 @@ +local cauldron, sounds = {}, {} +local S = xdecor.S + +-- Add more ingredients here that make a soup. +local ingredients_list = { + "apple", "mushroom", "honey", "pumpkin", "egg", "bread", "meat", + "chicken", "carrot", "potato", "melon", "rhubarb", "cucumber", + "corn", "beans", "berries", "grapes", "tomato", "wheat" +} + +cauldron.cbox = { + {0, 0, 0, 16, 16, 0}, + {0, 0, 16, 16, 16, 0}, + {0, 0, 0, 0, 16, 16}, + {16, 0, 0, 0, 16, 16}, + {0, 0, 0, 16, 8, 16} +} + +function cauldron.stop_sound(pos) + local spos = minetest.hash_node_position(pos) + if sounds[spos] then + minetest.sound_stop(sounds[spos]) + end +end + +function cauldron.idle_construct(pos) + local timer = minetest.get_node_timer(pos) + timer:start(10.0) + cauldron.stop_sound(pos) +end + +function cauldron.boiling_construct(pos) + local spos = minetest.hash_node_position(pos) + sounds[spos] = minetest.sound_play("xdecor_boiling_water", { + pos = pos, + max_hear_distance = 5, + gain = 0.8, + loop = true + }) + + local meta = minetest.get_meta(pos) + meta:set_string("infotext", S("Cauldron (active) - Drop foods inside to make a soup")) + + local timer = minetest.get_node_timer(pos) + timer:start(5.0) +end + +function cauldron.filling(pos, node, clicker, itemstack) + local inv = clicker:get_inventory() + local wield_item = clicker:get_wielded_item():get_name() + + if wield_item:sub(1,7) == "bucket:" then + if wield_item:sub(-6) == "_empty" and not (node.name:sub(-6) == "_empty") then + if itemstack:get_count() > 1 then + if inv:room_for_item("main", "bucket:bucket_water 1") then + itemstack:take_item() + inv:add_item("main", "bucket:bucket_water 1") + else + minetest.chat_send_player(clicker:get_player_name(), + S("No room in your inventory to add a bucket of water.")) + return itemstack + end + else + itemstack:replace("bucket:bucket_water") + end + minetest.set_node(pos, {name = "xdecor:cauldron_empty", param2 = node.param2}) + + elseif wield_item:sub(-6) == "_water" and node.name:sub(-6) == "_empty" then + minetest.set_node(pos, {name = "xdecor:cauldron_idle", param2 = node.param2}) + itemstack:replace("bucket:bucket_empty") + end + + return itemstack + end +end + +function cauldron.idle_timer(pos) + local below_node = {x = pos.x, y = pos.y - 1, z = pos.z} + if not minetest.get_node(below_node).name:find("fire") then + return true + end + + local node = minetest.get_node(pos) + minetest.set_node(pos, {name = "xdecor:cauldron_boiling", param2 = node.param2}) + return true +end + +-- Ugly hack to determine if an item has the function `minetest.item_eat` in its definition. +local function eatable(itemstring) + local item = itemstring:match("[%w_:]+") + local on_use_def = minetest.registered_items[item].on_use + if not on_use_def then return end + + return string.format("%q", string.dump(on_use_def)):find("item_eat") +end + +function cauldron.boiling_timer(pos) + local node = minetest.get_node(pos) + local objs = minetest.get_objects_inside_radius(pos, 0.5) + + if not next(objs) then + return true + end + + local ingredients = {} + for _, obj in pairs(objs) do + if obj and not obj:is_player() and obj:get_luaentity().itemstring then + local itemstring = obj:get_luaentity().itemstring + local food = itemstring:match(":([%w_]+)") + + for _, ingredient in ipairs(ingredients_list) do + if food and (eatable(itemstring) or food:find(ingredient)) then + ingredients[#ingredients + 1] = food + break + end + end + end + end + + if #ingredients >= 2 then + for _, obj in pairs(objs) do + obj:remove() + end + + minetest.set_node(pos, {name = "xdecor:cauldron_soup", param2 = node.param2}) + end + + local node_under = {x = pos.x, y = pos.y - 1, z = pos.z} + + if not minetest.get_node(node_under).name:find("fire") then + minetest.set_node(pos, {name = "xdecor:cauldron_idle", param2 = node.param2}) + end + + return true +end + +function cauldron.take_soup(pos, node, clicker, itemstack) + local inv = clicker:get_inventory() + local wield_item = clicker:get_wielded_item() + local item_name = wield_item:get_name() + + if item_name == "xdecor:bowl" or item_name == "farming:bowl" then + if wield_item:get_count() > 1 then + if inv:room_for_item("main", "xdecor:bowl_soup 1") then + itemstack:take_item() + inv:add_item("main", "xdecor:bowl_soup 1") + else + minetest.chat_send_player(clicker:get_player_name(), + S("No room in your inventory to add a bowl of soup.")) + return itemstack + end + else + itemstack:replace("xdecor:bowl_soup 1") + end + + minetest.set_node(pos, {name = "xdecor:cauldron_empty", param2 = node.param2}) + end + + return itemstack +end + +xdecor.register("cauldron_empty", { + description = S("Cauldron"), + groups = {cracky=2, oddly_breakable_by_hand=1}, + on_rotate = screwdriver.rotate_simple, + tiles = {"xdecor_cauldron_top_empty.png", "xdecor_cauldron_sides.png"}, + infotext = S("Cauldron (empty)"), + collision_box = xdecor.pixelbox(16, cauldron.cbox), + on_rightclick = cauldron.filling, + on_construct = function(pos) + cauldron.stop_sound(pos) + end, +}) + +xdecor.register("cauldron_idle", { + description = S("Cauldron (idle)"), + groups = {cracky=2, oddly_breakable_by_hand=1, not_in_creative_inventory=1}, + on_rotate = screwdriver.rotate_simple, + tiles = {"xdecor_cauldron_top_idle.png", "xdecor_cauldron_sides.png"}, + drop = "xdecor:cauldron_empty", + infotext = S("Cauldron (idle)"), + collision_box = xdecor.pixelbox(16, cauldron.cbox), + on_rightclick = cauldron.filling, + on_construct = cauldron.idle_construct, + on_timer = cauldron.idle_timer, +}) + +xdecor.register("cauldron_boiling", { + description = S("Cauldron (active)"), + groups = {cracky=2, oddly_breakable_by_hand=1, not_in_creative_inventory=1}, + on_rotate = screwdriver.rotate_simple, + drop = "xdecor:cauldron_empty", + infotext = S("Cauldron (active) - Drop foods inside to make a soup"), + damage_per_second = 2, + tiles = { + { + name = "xdecor_cauldron_top_anim_boiling_water.png", + animation = {type = "vertical_frames", length = 3.0} + }, + "xdecor_cauldron_sides.png" + }, + collision_box = xdecor.pixelbox(16, cauldron.cbox), + on_rightclick = cauldron.filling, + on_construct = cauldron.boiling_construct, + on_timer = cauldron.boiling_timer, + on_destruct = function(pos) + cauldron.stop_sound(pos) + end, +}) + +xdecor.register("cauldron_soup", { + description = S("Cauldron (active)"), + groups = {cracky = 2, oddly_breakable_by_hand = 1, not_in_creative_inventory = 1}, + on_rotate = screwdriver.rotate_simple, + drop = "xdecor:cauldron_empty", + infotext = S("Cauldron (active) - Use a bowl to eat the soup"), + damage_per_second = 2, + tiles = { + { + name = "xdecor_cauldron_top_anim_soup.png", + animation = {type = "vertical_frames", length = 3.0} + }, + "xdecor_cauldron_sides.png" + }, + collision_box = xdecor.pixelbox(16, cauldron.cbox), + on_rightclick = cauldron.take_soup, + on_destruct = function(pos) + cauldron.stop_sound(pos) + end, +}) + +-- Craft items + +minetest.register_craftitem("xdecor:bowl", { + description = S("Bowl"), + inventory_image = "xdecor_bowl.png", + wield_image = "xdecor_bowl.png", + groups = {food_bowl = 1, flammable = 2}, +}) + +minetest.register_craftitem("xdecor:bowl_soup", { + description = S("Bowl of soup"), + inventory_image = "xdecor_bowl_soup.png", + wield_image = "xdecor_bowl_soup.png", + groups = {not_in_creative_inventory=1}, + stack_max = 1, + on_use = minetest.item_eat(30, "xdecor:bowl") +}) + +-- Recipes + +minetest.register_craft({ + output = "xdecor:bowl 3", + recipe = { + {"group:wood", "", "group:wood"}, + {"", "group:wood", ""} + } +}) + +minetest.register_craft({ + output = "xdecor:cauldron_empty", + recipe = { + {"default:iron_lump", "", "default:iron_lump"}, + {"default:iron_lump", "", "default:iron_lump"}, + {"default:iron_lump", "default:iron_lump", "default:iron_lump"} + } +}) diff --git a/mods/xdecor/src/enchanting.lua b/mods/xdecor/src/enchanting.lua new file mode 100644 index 0000000..5a76ce8 --- /dev/null +++ b/mods/xdecor/src/enchanting.lua @@ -0,0 +1,333 @@ +screwdriver = screwdriver or {} +local S = xdecor.S +local FS = function(...) return minetest.formspec_escape(S(...)) end +local ceil, abs, random = math.ceil, math.abs, math.random +local reg_tools = minetest.registered_tools + +-- Cost in Mese crystal(s) for enchanting. +local mese_cost = 1 + +-- Force of the enchantments. +local enchanting = { + uses = 1.2, -- Durability + times = 0.1, -- Efficiency + damages = 1, -- Sharpness +} + +local function cap(str) return + str:gsub("^%l", string.upper) +end + +local function to_percent(orig_value, final_value) + return abs(ceil(((final_value - orig_value) / orig_value) * 100)) +end + +function enchanting:get_tooltip(enchant, orig_caps, fleshy) + local bonus = {durable = 0, efficiency = 0, damages = 0} + + if orig_caps then + bonus.durable = to_percent(orig_caps.uses, orig_caps.uses * enchanting.uses) + local sum_caps_times = 0 + for i=1, #orig_caps.times do + sum_caps_times = sum_caps_times + orig_caps.times[i] + end + local average_caps_time = sum_caps_times / #orig_caps.times + bonus.efficiency = to_percent(average_caps_time, average_caps_time - + enchanting.times) + end + + if fleshy then + bonus.damages = to_percent(fleshy, fleshy + enchanting.damages) + end + + local specs = { -- not finished, to complete + durable = {"#00baff", " (+" .. bonus.durable .. "%)"}, + fast = {"#74ff49", " (+" .. bonus.efficiency .. "%)"}, + sharp = {"#ffff00", " (+" .. bonus.damages .. "%)"}, + } + + local enchant_loc = { + fast = S("Efficiency"), + durable = S("Durability"), + sharp = S("Sharpness"), + } + + return minetest.colorize and minetest.colorize(specs[enchant][1], + "\n" .. enchant_loc[enchant] .. specs[enchant][2]) or + "\n" .. enchant_loc[enchant] .. specs[enchant][2] +end + +local enchant_buttons = { + "image_button[3.9,0.85;4,0.92;bg_btn.png;fast;"..FS("Efficiency").."]" .. + "image_button[3.9,1.77;4,1.12;bg_btn.png;durable;"..FS("Durability").."]", + "image_button[3.9,2.9;4,0.92;bg_btn.png;sharp;"..FS("Sharpness").."]", +} + +function enchanting.formspec(pos, num) + local meta = minetest.get_meta(pos) + local formspec = [[ + size[9,8.6;] + no_prepend[] + bgcolor[#080808BB;true] + listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF] + background9[0,0;9,9;ench_ui.png;6] + list[context;tool;0.9,2.9;1,1;] + list[context;mese;2,2.9;1,1;] + list[current_player;main;0.55,4.5;8,4;] + listring[current_player;main] + listring[context;tool] + listring[current_player;main] + listring[context;mese] + image[2,2.9;1,1;mese_layout.png] + ]] + .."tooltip[sharp;"..FS("Your weapon inflicts more damages").."]" + .."tooltip[durable;"..FS("Your tool last longer").."]" + .."tooltip[fast;"..FS("Your tool digs faster").."]" + ..default.gui_slots .. default.get_hotbar_bg(0.55, 4.5) + + formspec = formspec .. (enchant_buttons[num] or "") + meta:set_string("formspec", formspec) +end + +function enchanting.on_put(pos, listname, _, stack) + if listname == "tool" then + local stackname = stack:get_name() + local tool_groups = xdecor.reparaible_tools + + for idx, tools in ipairs(tool_groups) do + if tools:find(stackname:match(":(%w+)")) then + enchanting.formspec(pos, idx) + end + end + end +end + +function enchanting.fields(pos, _, fields, sender) + if not next(fields) or fields.quit then return end + local inv = minetest.get_meta(pos):get_inventory() + local tool = inv:get_stack("tool", 1) + local mese = inv:get_stack("mese", 1) + local orig_wear = tool:get_wear() + local mod, name = tool:get_name():match("(.*):(.*)") + local enchanted_tool = (mod or "") .. ":enchanted_" .. (name or "") .. "_" .. next(fields) + + if mese:get_count() >= mese_cost and reg_tools[enchanted_tool] then + minetest.sound_play("xdecor_enchanting", { + to_player = sender:get_player_name(), + gain = 0.8 + }) + + tool:replace(enchanted_tool) + tool:add_wear(orig_wear) + mese:take_item(mese_cost) + inv:set_stack("mese", 1, mese) + inv:set_stack("tool", 1, tool) + end +end + +function enchanting.dig(pos) + local inv = minetest.get_meta(pos):get_inventory() + return inv:is_empty("tool") and inv:is_empty("mese") +end + +local function allowed(tool) + if not tool then return end + + for item in pairs(reg_tools) do + if item:find("enchanted_" .. tool) then + return true + end + end +end + +function enchanting.put(_, listname, _, stack) + local stackname = stack:get_name() + if listname == "mese" and (stackname == "default:mese_crystal" or + stackname == "imese:industrial_mese_crystal") then + return stack:get_count() + elseif listname == "tool" and allowed(stackname:match("[^:]+$")) then + return 1 + end + + return 0 +end + +function enchanting.on_take(pos, listname) + if listname == "tool" then + enchanting.formspec(pos) + end +end + +function enchanting.construct(pos) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", S("Enchantment Table")) + enchanting.formspec(pos) + + local inv = meta:get_inventory() + inv:set_size("tool", 1) + inv:set_size("mese", 1) + + minetest.add_entity({x = pos.x, y = pos.y + 0.85, z = pos.z}, "xdecor:book_open") + local timer = minetest.get_node_timer(pos) + timer:start(0.5) +end + +function enchanting.destruct(pos) + for _, obj in pairs(minetest.get_objects_inside_radius(pos, 0.9)) do + if obj and obj:get_luaentity() and + obj:get_luaentity().name == "xdecor:book_open" then + obj:remove() + break + end + end +end + +function enchanting.timer(pos) + local minp = {x = pos.x - 2, y = pos.y, z = pos.z - 2} + local maxp = {x = pos.x + 2, y = pos.y + 1, z = pos.z + 2} + + local bookshelves = minetest.find_nodes_in_area(minp, maxp, "default:bookshelf") + if #bookshelves == 0 then + return true + end + + local bookshelf_pos = bookshelves[random(1, #bookshelves)] + local x = pos.x - bookshelf_pos.x + local y = bookshelf_pos.y - pos.y + local z = pos.z - bookshelf_pos.z + + if tostring(x .. z):find(2) then + minetest.add_particle({ + pos = bookshelf_pos, + velocity = {x = x, y = 2 - y, z = z}, + acceleration = {x = 0, y = -2.2, z = 0}, + expirationtime = 1, + size = 1.5, + glow = 5, + texture = "xdecor_glyph" .. random(1,18) .. ".png" + }) + end + + return true +end + +xdecor.register("enchantment_table", { + description = S("Enchantment Table"), + tiles = { + "xdecor_enchantment_top.png", "xdecor_enchantment_bottom.png", + "xdecor_enchantment_side.png", "xdecor_enchantment_side.png", + "xdecor_enchantment_side.png", "xdecor_enchantment_side.png" + }, + groups = {cracky = 1, level = 1}, + light_source = 6, + sounds = default.node_sound_stone_defaults(), + on_rotate = screwdriver.rotate_simple, + can_dig = enchanting.dig, + on_timer = enchanting.timer, + on_construct = enchanting.construct, + on_destruct = enchanting.destruct, + on_receive_fields = enchanting.fields, + on_metadata_inventory_put = enchanting.on_put, + on_metadata_inventory_take = enchanting.on_take, + allow_metadata_inventory_put = enchanting.put, + allow_metadata_inventory_move = function() + return 0 + end, +}) + +minetest.register_entity("xdecor:book_open", { + visual = "sprite", + visual_size = {x=0.75, y=0.75}, + collisionbox = {0}, + physical = false, + textures = {"xdecor_book_open.png"}, + static_save = false, +}) + +minetest.register_lbm({ + label = "recreate book entity", + name = "xdecor:create_book_entity", + nodenames = {"xdecor:enchantment_table"}, + run_at_every_load = true, + action = function(pos, node) + local objs = minetest.get_objects_inside_radius(pos, 0.9) + + for _, obj in ipairs(objs) do + local e = obj:get_luaentity() + if e and e.name == "xdecor:book_open" then + return + end + end + + minetest.add_entity({x = pos.x, y = pos.y + 0.85, z = pos.z}, "xdecor:book_open") + end, +}) + +function enchanting:register_tools(mod, def) + for tool in pairs(def.tools) do + for material in def.materials:gmatch("[%w_]+") do + for enchant in def.tools[tool].enchants:gmatch("[%w_]+") do + local original_tool = reg_tools[mod .. ":" .. tool .. "_" .. material] + if not original_tool then break end + local original_toolcaps = original_tool.tool_capabilities + + if original_toolcaps then + local original_damage_groups = original_toolcaps.damage_groups + local original_groupcaps = original_toolcaps.groupcaps + local groupcaps = table.copy(original_groupcaps) + local fleshy = original_damage_groups.fleshy + local full_punch_interval = original_toolcaps.full_punch_interval + local max_drop_level = original_toolcaps.max_drop_level + local group = next(original_groupcaps) + + if enchant == "durable" then + groupcaps[group].uses = ceil(original_groupcaps[group].uses * + enchanting.uses) + elseif enchant == "fast" then + for i, time in pairs(original_groupcaps[group].times) do + groupcaps[group].times[i] = time - enchanting.times + end + elseif enchant == "sharp" then + fleshy = fleshy + enchanting.damages + end + + minetest.register_tool(":" .. mod .. ":enchanted_" .. tool .. "_" .. material .. "_" .. enchant, { + description = S("Enchanted @1 @2 @3", + def.material_desc[material] or cap(material), def.tools[tool].desc or cap(tool), + self:get_tooltip(enchant, original_groupcaps[group], fleshy)), + inventory_image = original_tool.inventory_image .. "^[colorize:violet:50", + wield_image = original_tool.wield_image, + groups = {not_in_creative_inventory = 1}, + tool_capabilities = { + groupcaps = groupcaps, damage_groups = {fleshy = fleshy}, + full_punch_interval = full_punch_interval, + max_drop_level = max_drop_level + } + }) + end + end + end + end +end + +enchanting:register_tools("default", { + materials = "steel, bronze, mese, diamond", + material_desc = {steel = S("Steel"), bronze = S("Bronze"), mese = S("Mese"), diamond = S("Diamond")}, + tools = { + axe = {enchants = "durable, fast", desc = S("Axe")}, + pick = {enchants = "durable, fast", desc = S("Pickaxe")}, + shovel = {enchants = "durable, fast", desc = S("Shovel")}, + sword = {enchants = "sharp", desc = S("Sword")} + }, +}) + +-- Recipes + +minetest.register_craft({ + output = "xdecor:enchantment_table", + recipe = { + {"", "default:book", ""}, + {"default:diamond", "default:obsidian", "default:diamond"}, + {"default:obsidian", "default:obsidian", "default:obsidian"} + } +}) diff --git a/mods/xdecor/src/hive.lua b/mods/xdecor/src/hive.lua new file mode 100644 index 0000000..9aae303 --- /dev/null +++ b/mods/xdecor/src/hive.lua @@ -0,0 +1,108 @@ +local hive = {} +local S = xdecor.S +local FS = function(...) return minetest.formspec_escape(S(...)) end +local honey_max = 16 + +function hive.construct(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + + local formspec = "size[8,6;]" + .."label[0.5,0;"..FS("Bees are busy making honey…").."]" + ..[[ image[6,1;1,1;hive_bee.png] + image[5,1;1,1;hive_layout.png] + list[context;honey;5,1;1,1;] + list[current_player;main;0,2.35;8,4;] + listring[current_player;main] + listring[context;honey] ]] .. + xbg .. default.get_hotbar_bg(0,2.35) + + meta:set_string("formspec", formspec) + meta:set_string("infotext", S("Artificial Hive")) + inv:set_size("honey", 1) + + local timer = minetest.get_node_timer(pos) + timer:start(math.random(64, 128)) +end + +function hive.timer(pos) + local time = (minetest.get_timeofday() or 0) * 24000 + if time < 5500 or time > 18500 then + return true + end + + local inv = minetest.get_meta(pos):get_inventory() + local honeystack = inv:get_stack("honey", 1) + local honey = honeystack:get_count() + + local radius = 4 + local minp = vector.add(pos, -radius) + local maxp = vector.add(pos, radius) + local flowers = minetest.find_nodes_in_area_under_air(minp, maxp, "group:flower") + + if #flowers > 2 and honey < honey_max then + inv:add_item("honey", "xdecor:honey") + elseif honey == honey_max then + local timer = minetest.get_node_timer(pos) + timer:stop() + return true + end + + return true +end + +xdecor.register("hive", { + description = S("Artificial Hive"), + tiles = {"xdecor_hive_top.png", "xdecor_hive_top.png", + "xdecor_hive_side.png", "xdecor_hive_side.png", + "xdecor_hive_side.png", "xdecor_hive_front.png"}, + groups = {choppy=3, oddly_breakable_by_hand=2, flammable=1}, + on_construct = hive.construct, + on_timer = hive.timer, + + can_dig = function(pos) + local inv = minetest.get_meta(pos):get_inventory() + return inv:is_empty("honey") + end, + + on_punch = function(_, _, puncher) + puncher:set_hp(puncher:get_hp() - 2) + end, + + allow_metadata_inventory_put = function() + return 0 + end, + + on_metadata_inventory_take = function(pos, _, _, stack) + if stack:get_count() == honey_max then + local timer = minetest.get_node_timer(pos) + timer:start(math.random(64, 128)) + end + end +}) + +-- Craft items + +minetest.register_craftitem("xdecor:honey", { + description = S("Honey"), + inventory_image = "xdecor_honey.png", + wield_image = "xdecor_honey.png", + on_use = minetest.item_eat(2), + groups = { + food_honey = 1, + food_sugar = 1, + flammable = 2, + not_in_creative_inventory = 1, + }, +}) + +-- Recipes + +minetest.register_craft({ + output = "xdecor:hive", + recipe = { + {"group:stick", "group:stick", "group:stick"}, + {"default:paper", "default:paper", "default:paper"}, + {"group:stick", "group:stick", "group:stick"} + } +}) diff --git a/mods/xdecor/src/itemframe.lua b/mods/xdecor/src/itemframe.lua new file mode 100644 index 0000000..9465501 --- /dev/null +++ b/mods/xdecor/src/itemframe.lua @@ -0,0 +1,186 @@ +local itemframe, tmp = {}, {} +local S = xdecor.S +screwdriver = screwdriver or {} + +local function remove_item(pos, node) + local objs = minetest.get_objects_inside_radius(pos, 0.5) + if not objs then return end + + for _, obj in pairs(objs) do + local ent = obj:get_luaentity() + if obj and ent and ent.name == "xdecor:f_item" then + obj:remove() break + end + end +end + +local facedir = { + [0] = {x = 0, y = 0, z = 1}, + {x = 1, y = 0, z = 0}, + {x = 0, y = 0, z = -1}, + {x = -1, y = 0, z = 0} +} + +local function update_item(pos, node) + remove_item(pos, node) + local meta = minetest.get_meta(pos) + local itemstring = meta:get_string("item") + local posad = facedir[node.param2] + if not posad or itemstring == "" then return end + + pos = vector.add(pos, vector.multiply(posad, 6.5/16)) + tmp.nodename = node.name + tmp.texture = ItemStack(itemstring):get_name() + + local entity = minetest.add_entity(pos, "xdecor:f_item") + local yaw = (math.pi * 2) - node.param2 * (math.pi / 2) + entity:set_yaw(yaw) + + local timer = minetest.get_node_timer(pos) + timer:start(15.0) +end + +local function drop_item(pos, node) + local meta = minetest.get_meta(pos) + local item = meta:get_string("item") + if item == "" then return end + + minetest.add_item(pos, item) + meta:set_string("item", "") + remove_item(pos, node) + + local timer = minetest.get_node_timer(pos) + timer:stop() +end + +function itemframe.after_place(pos, placer, itemstack) + local meta = minetest.get_meta(pos) + local name = placer:get_player_name() + meta:set_string("owner", name) + meta:set_string("infotext", S("@1 (owned by @2)", S("Item Frame"), name)) +end + +function itemframe.timer(pos) + local node = minetest.get_node(pos) + local meta = minetest.get_meta(pos) + local num = #minetest.get_objects_inside_radius(pos, 0.5) + + if num == 0 and meta:get_string("item") ~= "" then + update_item(pos, node) + end + + return true +end + +function itemframe.rightclick(pos, node, clicker, itemstack) + local meta = minetest.get_meta(pos) + local player_name = clicker:get_player_name() + local owner = meta:get_string("owner") + local admin = minetest.check_player_privs(player_name, "protection_bypass") + + if not admin and (player_name ~= owner or not itemstack) then + return itemstack + end + + drop_item(pos, node) + local itemstring = itemstack:take_item():to_string() + meta:set_string("item", itemstring) + update_item(pos, node) + if itemstring == "" then + meta:set_string("infotext", S("@1 (owned by @2)", S("Item Frame"), owner)) + else + meta:set_string("infotext", S("@1 (owned by @2)", itemstring, owner)) + end + return itemstack +end + +function itemframe.punch(pos, node, puncher) + local meta = minetest.get_meta(pos) + local player_name = puncher:get_player_name() + local owner = meta:get_string("owner") + local admin = minetest.check_player_privs(player_name, "protection_bypass") + + if admin and player_name == owner then + drop_item(pos, node) + end +end + +function itemframe.dig(pos, player) + if not player then return end + local meta = minetest.get_meta(pos) + local player_name = player and player:get_player_name() + local owner = meta:get_string("owner") + local admin = minetest.check_player_privs(player_name, "protection_bypass") + + return admin or player_name == owner +end + +xdecor.register("itemframe", { + description = S("Item Frame"), + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + on_rotate = screwdriver.disallow, + sunlight_propagates = true, + inventory_image = "xdecor_itemframe.png", + node_box = xdecor.nodebox.slab_z(0.9375), + tiles = { + "xdecor_wood.png", "xdecor_wood.png", "xdecor_wood.png", + "xdecor_wood.png", "xdecor_wood.png", "xdecor_itemframe.png" + }, + after_place_node = itemframe.after_place, + on_timer = itemframe.timer, + on_rightclick = itemframe.rightclick, + on_punch = itemframe.punch, + can_dig = itemframe.dig, + after_destruct = remove_item +}) + +minetest.register_entity("xdecor:f_item", { + visual = "wielditem", + visual_size = {x = 0.33, y = 0.33}, + collisionbox = {0}, + physical = false, + textures = {"air"}, + on_activate = function(self, staticdata) + local pos = self.object:get_pos() + if minetest.get_node(pos).name ~= "xdecor:itemframe" then + self.object:remove() + end + + if tmp.nodename and tmp.texture then + self.nodename = tmp.nodename + tmp.nodename = nil + self.texture = tmp.texture + tmp.texture = nil + elseif staticdata and staticdata ~= "" then + local data = staticdata:split(";") + if data and data[1] and data[2] then + self.nodename = data[1] + self.texture = data[2] + end + end + if self.texture then + self.object:set_properties({ + textures = {self.texture} + }) + end + end, + get_staticdata = function(self) + if self.nodename and self.texture then + return self.nodename .. ";" .. self.texture + end + + return "" + end +}) + +-- Recipes + +minetest.register_craft({ + output = "xdecor:itemframe", + recipe = { + {"group:stick", "group:stick", "group:stick"}, + {"group:stick", "default:paper", "group:stick"}, + {"group:stick", "group:stick", "group:stick"} + } +}) diff --git a/mods/xdecor/src/mailbox.lua b/mods/xdecor/src/mailbox.lua new file mode 100644 index 0000000..8d7439c --- /dev/null +++ b/mods/xdecor/src/mailbox.lua @@ -0,0 +1,192 @@ +local mailbox = {} +screwdriver = screwdriver or {} +local S = xdecor.S +local FS = function(...) return minetest.formspec_escape(S(...)) end + +local function get_img(img) + if not img then return end + local img_name = img:match("(.*)%.png") + + if img_name then + return img_name .. ".png" + end +end + +local function img_col(stack) + local def = minetest.registered_items[stack] + if not def then + return "" + end + + if def.inventory_image ~= "" then + local img = get_img(def.inventory_image) + if img then + return img + end + end + + if def.tiles then + local tile, img = def.tiles[1] + if type(tile) == "table" then + img = get_img(tile.name) + elseif type(tile) == "string" then + img = get_img(tile) + end + + if img then + return img + end + end + + return "" +end + +function mailbox:formspec(pos, owner, is_owner) + local spos = pos.x .. "," .. pos.y .. "," .. pos.z + local meta = minetest.get_meta(pos) + local giver, img = "", "" + + if is_owner then + for i = 1, 7 do + local giving = meta:get_string("giver" .. i) + if giving ~= "" then + local stack = meta:get_string("stack" .. i) + local giver_name = giving:sub(1,12) + local stack_name = stack:match("[%w_:]+") + local stack_count = stack:match("%s(%d+)") or 1 + + giver = giver .. "#FFFF00," .. giver_name .. "," .. i .. + ",#FFFFFF,x " .. stack_count .. "," + + img = img .. i .. "=" .. + img_col(stack_name) .. "^\\[resize:16x16," + end + end + + return "size[9.5,9]" + .."label[0,0;"..FS("Mailbox").."]" + .."label[6,0;"..FS("Last donators").."]" + ..[[ box[6,0.72;3.3,3.5;#555555] + listring[current_player;main] + list[current_player;main;0.75,5.25;8,4;] + tableoptions[background=#00000000;highlight=#00000000;border=false] ]] .. + "tablecolumns[color;text;image," .. img .. "0;color;text]" .. + "table[6,0.75;3.3,4;givers;" .. giver .. "]" .. + "list[nodemeta:" .. spos .. ";mailbox;0,0.75;6,4;]" .. + "listring[nodemeta:" .. spos .. ";mailbox]" .. + xbg .. default.get_hotbar_bg(0.75, 5.25) + end + + return "size[8,5]" .. + "list[current_player;main;0,1.25;8,4;]" .. + "label[0,0;"..FS("Send your goods to\n@1", + (minetest.colorize and + minetest.colorize("#FFFF00", owner) or owner)) .. "]" .. + "list[nodemeta:" .. spos .. ";drop;3.5,0;1,1;]" .. + xbg .. default.get_hotbar_bg(0, 1.25) +end + +function mailbox.dig(pos, player) + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + local player_name = player and player:get_player_name() + local inv = meta:get_inventory() + + return inv:is_empty("mailbox") and player_name == owner +end + +function mailbox.after_place_node(pos, placer) + local meta = minetest.get_meta(pos) + local player_name = placer:get_player_name() + + meta:set_string("owner", player_name) + meta:set_string("infotext", S("@1's Mailbox", player_name)) + + local inv = meta:get_inventory() + inv:set_size("mailbox", 6 * 4) + inv:set_size("drop", 1) +end + +function mailbox.rightclick(pos, node, clicker, itemstack, pointed_thing) + local meta = minetest.get_meta(pos) + local player = clicker:get_player_name() + local owner = meta:get_string("owner") + + minetest.show_formspec(player, "xdecor:mailbox", + mailbox:formspec(pos, owner, (player == owner))) + + return itemstack +end + +function mailbox.put(pos, listname, _, stack, player) + if listname == "drop" then + local inv = minetest.get_meta(pos):get_inventory() + if inv:room_for_item("mailbox", stack) then + return -1 + else + minetest.chat_send_player(player:get_player_name(), + S("The mailbox is full.")) + end + end + + return 0 +end + +function mailbox.on_put(pos, listname, _, stack, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + + if listname == "drop" and inv:room_for_item("mailbox", stack) then + inv:set_list("drop", {}) + inv:add_item("mailbox", stack) + + for i = 7, 2, -1 do + meta:set_string("giver" .. i, meta:get_string("giver" .. (i - 1))) + meta:set_string("stack" .. i, meta:get_string("stack" .. (i - 1))) + end + + meta:set_string("giver1", player:get_player_name()) + meta:set_string("stack1", stack:to_string()) + end +end + +function mailbox.allow_take(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + + if player:get_player_name() ~= meta:get_string("owner") then + return 0 + end + + return stack:get_count() +end + +function mailbox.allow_move(pos) + return 0 +end + +xdecor.register("mailbox", { + description = S("Mailbox"), + tiles = {"xdecor_mailbox_top.png", "xdecor_mailbox_bottom.png", + "xdecor_mailbox_side.png", "xdecor_mailbox_side.png", + "xdecor_mailbox.png", "xdecor_mailbox.png"}, + groups = {cracky = 3, oddly_breakable_by_hand = 1}, + on_rotate = screwdriver.rotate_simple, + can_dig = mailbox.dig, + on_rightclick = mailbox.rightclick, + allow_metadata_inventory_take = mailbox.allow_take, + allow_metadata_inventory_move = mailbox.allow_move, + on_metadata_inventory_put = mailbox.on_put, + allow_metadata_inventory_put = mailbox.put, + after_place_node = mailbox.after_place_node +}) + +-- Recipes + +minetest.register_craft({ + output = "xdecor:mailbox", + recipe = { + {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, + {"dye:red", "default:paper", "dye:red"}, + {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"} + } +}) diff --git a/mods/xdecor/src/mechanisms.lua b/mods/xdecor/src/mechanisms.lua new file mode 100644 index 0000000..d9d723e --- /dev/null +++ b/mods/xdecor/src/mechanisms.lua @@ -0,0 +1,153 @@ +-- Thanks to sofar for helping with that code. + +local plate = {} +screwdriver = screwdriver or {} + +local S = xdecor.S +local ALPHA_OPAQUE = minetest.features.use_texture_alpha_string_modes and "opaque" or false + +local function door_toggle(pos_actuator, pos_door, player) + local player_name = player:get_player_name() + local actuator = minetest.get_node(pos_actuator) + local door = doors.get(pos_door) + if not door then return end + + if actuator.name:sub(-4) == "_off" then + minetest.set_node(pos_actuator, + {name = actuator.name:gsub("_off", "_on"), param2 = actuator.param2}) + end + door:open(player) + + minetest.after(2, function() + if minetest.get_node(pos_actuator).name:sub(-3) == "_on" then + minetest.set_node(pos_actuator, + {name = actuator.name, param2 = actuator.param2}) + end + -- Re-get player object (or nil) because 'player' could + -- be an invalid object at this time (player left) + door:close(minetest.get_player_by_name(player_name)) + end) +end + +function plate.construct(pos) + local timer = minetest.get_node_timer(pos) + timer:start(0.1) +end + +function plate.timer(pos) + local objs = minetest.get_objects_inside_radius(pos, 0.8) + if not next(objs) or not doors.get then return true end + + local minp = {x = pos.x - 2, y = pos.y, z = pos.z - 2} + local maxp = {x = pos.x + 2, y = pos.y, z = pos.z + 2} + local doors = minetest.find_nodes_in_area(minp, maxp, "group:door") + + for _, player in pairs(objs) do + if player:is_player() then + for i = 1, #doors do + door_toggle(pos, doors[i], player) + end + break + end + end + + return true +end + +function plate.register(material, desc, def) + xdecor.register("pressure_" .. material .. "_off", { + description = def.description or (desc .. " Pressure Plate"), + tiles = {"xdecor_pressure_" .. material .. ".png"}, + use_texture_alpha = ALPHA_OPAQUE, + drawtype = "nodebox", + node_box = xdecor.pixelbox(16, {{1, 0, 1, 14, 1, 14}}), + groups = def.groups, + sounds = def.sounds, + sunlight_propagates = true, + on_rotate = screwdriver.rotate_simple, + on_construct = plate.construct, + on_timer = plate.timer + }) + xdecor.register("pressure_" .. material .. "_on", { + tiles = {"xdecor_pressure_" .. material .. ".png"}, + use_texture_alpha = ALPHA_OPAQUE, + drawtype = "nodebox", + node_box = xdecor.pixelbox(16, {{1, 0, 1, 14, 0.4, 14}}), + groups = def.groups, + sounds = def.sounds, + drop = "xdecor:pressure_" .. material .. "_off", + sunlight_propagates = true, + on_rotate = screwdriver.rotate_simple + }) +end + +plate.register("wood", "Wooden", { + sounds = default.node_sound_wood_defaults(), + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 2}, + description = S("Wooden Pressure Plate"), +}) + +plate.register("stone", "Stone", { + sounds = default.node_sound_stone_defaults(), + groups = {cracky = 3, oddly_breakable_by_hand = 2}, + description = S("Stone Pressure Plate"), +}) + +xdecor.register("lever_off", { + description = S("Lever"), + tiles = {"xdecor_lever_off.png"}, + use_texture_alpha = ALPHA_OPAQUE, + drawtype = "nodebox", + node_box = xdecor.pixelbox(16, {{2, 1, 15, 12, 14, 1}}), + groups = {cracky = 3, oddly_breakable_by_hand = 2}, + sounds = default.node_sound_stone_defaults(), + sunlight_propagates = true, + on_rotate = screwdriver.rotate_simple, + + on_rightclick = function(pos, node, clicker, itemstack) + if not doors.get then return itemstack end + local minp = {x = pos.x - 2, y = pos.y - 1, z = pos.z - 2} + local maxp = {x = pos.x + 2, y = pos.y + 1, z = pos.z + 2} + local doors = minetest.find_nodes_in_area(minp, maxp, "group:door") + + for i = 1, #doors do + door_toggle(pos, doors[i], clicker) + end + + return itemstack + end +}) + +xdecor.register("lever_on", { + tiles = {"xdecor_lever_on.png"}, + use_texture_alpha = ALPHA_OPAQUE, + drawtype = "nodebox", + node_box = xdecor.pixelbox(16, {{2, 1, 15, 12, 14, 1}}), + groups = {cracky = 3, oddly_breakable_by_hand = 2, not_in_creative_inventory = 1}, + sounds = default.node_sound_stone_defaults(), + sunlight_propagates = true, + on_rotate = screwdriver.rotate_simple, + drop = "xdecor:lever_off" +}) + +-- Recipes + +minetest.register_craft({ + output = "xdecor:pressure_stone_off", + type = "shapeless", + recipe = {"group:stone", "group:stone"} +}) + +minetest.register_craft({ + output = "xdecor:pressure_wood_off", + type = "shapeless", + recipe = {"group:wood", "group:wood"} +}) + +minetest.register_craft({ + output = "xdecor:lever_off", + recipe = { + {"group:stick"}, + {"group:stone"} + } +}) diff --git a/mods/xdecor/src/nodes.lua b/mods/xdecor/src/nodes.lua new file mode 100644 index 0000000..cecb04e --- /dev/null +++ b/mods/xdecor/src/nodes.lua @@ -0,0 +1,644 @@ +screwdriver = screwdriver or {} +local S = xdecor.S +local ALPHA_CLIP = minetest.features.use_texture_alpha_string_modes and "clip" or true +local ALPHA_OPAQUE = minetest.features.use_texture_alpha_string_modes and "opaque" or false + +local function register_pane(name, desc, def) + xpanes.register_pane(name, { + description = desc, + tiles = {"xdecor_" .. name .. ".png"}, + drawtype = "airlike", + paramtype = "light", + textures = {"xdecor_" .. name .. ".png", "" ,"xdecor_" .. name .. ".png"}, + inventory_image = "xdecor_" .. name .. ".png", + wield_image = "xdecor_" .. name .. ".png", + groups = def.groups, + sounds = def.sounds or default.node_sound_defaults(), + recipe = def.recipe + }) +end + +register_pane("bamboo_frame", S("Bamboo Frame"), { + groups = {choppy = 3, oddly_breakable_by_hand = 2, pane = 1, flammable = 2}, + recipe = { + {"default:papyrus", "default:papyrus", "default:papyrus"}, + {"default:papyrus", "farming:cotton", "default:papyrus"}, + {"default:papyrus", "default:papyrus", "default:papyrus"} + } +}) + +register_pane("chainlink", S("Chainlink"), { + groups = {cracky = 3, oddly_breakable_by_hand = 2, pane = 1}, + recipe = { + {"default:steel_ingot", "", "default:steel_ingot"}, + {"", "default:steel_ingot", ""}, + {"default:steel_ingot", "", "default:steel_ingot"} + } +}) + +register_pane("rusty_bar", S("Rusty Iron Bars"), { + sounds = default.node_sound_stone_defaults(), + groups = {cracky = 2, pane = 1}, + recipe = { + {"", "default:dirt", ""}, + {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, + {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"} + } +}) + +register_pane("wood_frame", S("Wood Frame"), { + sounds = default.node_sound_wood_defaults(), + groups = {choppy = 2, pane = 1, flammable = 2}, + recipe = { + {"group:wood", "group:stick", "group:wood"}, + {"group:stick", "group:stick", "group:stick"}, + {"group:wood", "group:stick", "group:wood"} + } +}) + +xdecor.register("baricade", { + description = S("Baricade"), + drawtype = "plantlike", + paramtype2 = "facedir", + inventory_image = "xdecor_baricade.png", + tiles = {"xdecor_baricade.png"}, + groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + damage_per_second = 4, + selection_box = xdecor.nodebox.slab_y(0.3), + collision_box = xdecor.pixelbox(2, {{0, 0, 1, 2, 2, 0}}) +}) + +xdecor.register("barrel", { + description = S("Barrel"), + tiles = {"xdecor_barrel_top.png", "xdecor_barrel_top.png", "xdecor_barrel_sides.png"}, + on_place = minetest.rotate_node, + groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults() +}) + +local function register_storage(name, desc, def) + xdecor.register(name, { + description = desc, + inventory = {size = def.inv_size or 24}, + infotext = desc, + tiles = def.tiles, + use_texture_alpha = ALPHA_OPAQUE, + node_box = def.node_box, + on_rotate = def.on_rotate, + on_place = def.on_place, + groups = def.groups or {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults() + }) +end + +register_storage("cabinet", S("Wooden Cabinet"), { + on_rotate = screwdriver.rotate_simple, + tiles = { + "xdecor_cabinet_sides.png", "xdecor_cabinet_sides.png", + "xdecor_cabinet_sides.png", "xdecor_cabinet_sides.png", + "xdecor_cabinet_sides.png", "xdecor_cabinet_front.png" + } +}) + +register_storage("cabinet_half", S("Half Wooden Cabinet"), { + inv_size = 8, + node_box = xdecor.nodebox.slab_y(0.5, 0.5), + on_rotate = screwdriver.rotate_simple, + tiles = { + "xdecor_cabinet_sides.png", "xdecor_cabinet_sides.png", + "xdecor_half_cabinet_sides.png", "xdecor_half_cabinet_sides.png", + "xdecor_half_cabinet_sides.png", "xdecor_half_cabinet_front.png" + } +}) + +if minetest.get_modpath("moreblocks") then + minetest.register_alias("xdecor:empty_shelf", "moreblocks:empty_shelf") +else + register_storage("empty_shelf", S("Empty Shelf"), { + on_rotate = screwdriver.rotate_simple, + tiles = { + "default_wood.png", "default_wood.png", "default_wood.png", + "default_wood.png", "default_wood.png^xdecor_empty_shelf.png" + } + }) +end + +register_storage("multishelf", S("Multi Shelf"), { + on_rotate = screwdriver.rotate_simple, + tiles = { + "default_wood.png", "default_wood.png", "default_wood.png", + "default_wood.png", "default_wood.png^xdecor_multishelf.png" + }, +}) + +xdecor.register("candle", { + description = S("Candle"), + light_source = 12, + drawtype = "torchlike", + inventory_image = "xdecor_candle_inv.png", + wield_image = "xdecor_candle_wield.png", + paramtype2 = "wallmounted", + walkable = false, + groups = {dig_immediate = 3, attached_node = 1}, + tiles = { + { + name = "xdecor_candle_floor.png", + animation = {type="vertical_frames", length = 1.5} + }, + { + name = "xdecor_candle_hanging.png", + animation = {type="vertical_frames", length = 1.5} + }, + { + name = "xdecor_candle_wall.png", + animation = {type="vertical_frames", length = 1.5} + } + }, + selection_box = { + type = "wallmounted", + wall_top = {-0.25, -0.3, -0.25, 0.25, 0.5, 0.25}, + wall_bottom = {-0.25, -0.5, -0.25, 0.25, 0.1, 0.25}, + wall_side = {-0.5, -0.35, -0.15, -0.15, 0.4, 0.15} + } +}) + +xdecor.register("chair", { + description = S("Chair"), + tiles = {"xdecor_wood.png"}, + sounds = default.node_sound_wood_defaults(), + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 2}, + on_rotate = screwdriver.rotate_simple, + node_box = xdecor.pixelbox(16, { + {3, 0, 11, 2, 16, 2}, + {11, 0, 11, 2, 16, 2}, + {5, 9, 11.5, 6, 6, 1}, + {3, 0, 3, 2, 6, 2}, + {11, 0, 3, 2, 6, 2}, + {3, 6, 3, 10, 2, 8} + }), + can_dig = xdecor.sit_dig, + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + pos.y = pos.y + 0 -- Sitting position + xdecor.sit(pos, node, clicker, pointed_thing) + return itemstack + end +}) + +xdecor.register("cobweb", { + description = S("Cobweb"), + drawtype = "plantlike", + tiles = {"xdecor_cobweb.png"}, + inventory_image = "xdecor_cobweb.png", + liquid_viscosity = 8, + liquidtype = "source", + liquid_alternative_flowing = "xdecor:cobweb", + liquid_alternative_source = "xdecor:cobweb", + liquid_renewable = false, + liquid_range = 0, + walkable = false, + selection_box = {type = "regular"}, + groups = {snappy = 3, liquid = 3, flammable = 3}, + sounds = default.node_sound_leaves_defaults() +}) + +local curtain_colors = { + red = S("Red Curtain"), +} + +for c, desc in pairs(curtain_colors) do + xdecor.register("curtain_" .. c, { + description = desc, + walkable = false, + tiles = {"wool_white.png"}, + color = c, + inventory_image = "wool_white.png^[colorize:" .. c .. + ":170^xdecor_curtain_open_overlay.png^[makealpha:255,126,126", + wield_image = "wool_white.png^[colorize:" .. c .. ":170", + drawtype = "signlike", + paramtype2 = "colorwallmounted", + groups = {dig_immediate = 3, flammable = 3}, + selection_box = {type = "wallmounted"}, + on_rightclick = function(pos, node, _, itemstack) + minetest.set_node(pos, {name = "xdecor:curtain_open_" .. c, param2 = node.param2}) + return itemstack + end + }) + + xdecor.register("curtain_open_" .. c, { + tiles = {"wool_white.png^xdecor_curtain_open_overlay.png^[makealpha:255,126,126"}, + color = c, + drawtype = "signlike", + paramtype2 = "colorwallmounted", + walkable = false, + groups = {dig_immediate = 3, flammable = 3, not_in_creative_inventory = 1}, + selection_box = {type="wallmounted"}, + drop = "xdecor:curtain_" .. c, + on_rightclick = function(pos, node, _, itemstack) + minetest.set_node(pos, {name="xdecor:curtain_" .. c, param2 = node.param2}) + return itemstack + end + }) + + minetest.register_craft({ + output = "xdecor:curtain_" .. c .. " 4", + recipe = { + {"", "wool:" .. c, ""}, + {"", "wool:" .. c, ""} + } + }) +end + +xdecor.register("cushion", { + description = S("Cushion"), + tiles = {"xdecor_cushion.png"}, + groups = {snappy = 3, flammable = 3, fall_damage_add_percent = -50}, + on_place = minetest.rotate_node, + node_box = xdecor.nodebox.slab_y(0.5), + can_dig = xdecor.sit_dig, + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + pos.y = pos.y + 0 -- Sitting position + xdecor.sit(pos, node, clicker, pointed_thing) + return itemstack + end +}) + +xdecor.register("cushion_block", { + description = S("Cushion Block"), + tiles = {"xdecor_cushion.png"}, + groups = {snappy = 3, flammable = 3, fall_damage_add_percent = -75, not_in_creative_inventory = 1} +}) + +local function door_access(name) + return name:find("prison") +end + +local xdecor_doors = { + japanese = { + recipe = { + {"group:wood", "default:paper"}, + {"default:paper", "group:wood"}, + {"group:wood", "default:paper"} + }, + desc = S("Japanese Door"), + }, + prison = { + recipe = { + {"xpanes:bar_flat", "xpanes:bar_flat",}, + {"xpanes:bar_flat", "xpanes:bar_flat",}, + {"xpanes:bar_flat", "xpanes:bar_flat"} + }, + desc = S("Prison Door"), + }, + rusty_prison = { + recipe = { + {"xpanes:rusty_bar_flat", "xpanes:rusty_bar_flat",}, + {"xpanes:rusty_bar_flat", "xpanes:rusty_bar_flat",}, + {"xpanes:rusty_bar_flat", "xpanes:rusty_bar_flat"} + }, + desc = S("Rusty Prison Door"), + }, + screen = { + recipe = { + {"group:wood", "group:wood"}, + {"xpanes:chainlink_flat", "xpanes:chainlink_flat"}, + {"group:wood", "group:wood"} + }, + desc = S("Screen Door"), + }, + slide = { + recipe = { + {"default:paper", "default:paper"}, + {"default:paper", "default:paper"}, + {"group:wood", "group:wood"} + }, + desc = S("Slide Door"), + }, + woodglass = { + recipe = { + {"default:glass", "default:glass"}, + {"group:wood", "group:wood"}, + {"group:wood", "group:wood"} + }, + desc = S("Woodglass Door"), + }, +} + +local mesecons_register + +if minetest.global_exists("mesecon") then + mesecons_register = { effector = { + action_on = function(pos, node) + local door = doors.get(pos) + if door then + door:open() + end + end, + action_off = function(pos, node) + local door = doors.get(pos) + if door then + door:close() + end + end, + rules = mesecon.rules.pplate + }} +end + +for name, def in pairs(xdecor_doors) do + if not doors.register then break end + doors.register(name .. "_door", { + tiles = { + {name = "xdecor_" .. name .. "_door.png", backface_culling = true} + }, + description = def.desc, + inventory_image = "xdecor_" .. name .. "_door_inv.png", + protected = door_access(name), + groups = {choppy = 2, cracky = 2, oddly_breakable_by_hand = 1, door = 1}, + recipe = def.recipe, + mesecons = mesecons_register, + }) +end + +xdecor.register("enderchest", { + description = S("Ender Chest"), + tiles = { + "xdecor_enderchest_top.png", "xdecor_enderchest_top.png", + "xdecor_enderchest_side.png", "xdecor_enderchest_side.png", + "xdecor_enderchest_side.png", "xdecor_enderchest_front.png" + }, + groups = {cracky = 1, choppy = 1}, + sounds = default.node_sound_stone_defaults(), + on_rotate = screwdriver.rotate_simple, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", [[ size[8,9] + list[current_player;enderchest;0,0;8,4;] + list[current_player;main;0,5;8,4;] + listring[current_player;enderchest] + listring[current_player;main] ]] + .. xbg .. default.get_hotbar_bg(0,5)) + + meta:set_string("infotext", S("Ender Chest")) + end +}) + +minetest.register_on_joinplayer(function(player) + local inv = player:get_inventory() + inv:set_size("enderchest", 8*4) +end) + +xdecor.register("ivy", { + description = S("Ivy"), + drawtype = "signlike", + walkable = false, + climbable = true, + groups = {snappy = 3, flora = 1, attached_node = 1, plant = 1, flammable = 3}, + paramtype2 = "wallmounted", + selection_box = {type="wallmounted"}, + tiles = {"xdecor_ivy.png"}, + inventory_image = "xdecor_ivy.png", + wield_image = "xdecor_ivy.png", + 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, + drawtype = "plantlike", + inventory_image = "xdecor_lantern_inv.png", + wield_image = "xdecor_lantern_inv.png", + paramtype2 = "wallmounted", + walkable = false, + groups = {snappy = 3, attached_node = 1}, + tiles = { + { + name = "xdecor_lantern.png", + animation = {type="vertical_frames", length = 1.5} + } + }, + selection_box = xdecor.pixelbox(16, {{4, 0, 4, 8, 16, 8}}) +}) + +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 + xdecor.register(l .. "_lightbox", { + description = desc, + tiles = {"xdecor_" .. l .. "_lightbox.png"}, + groups = {cracky = 3, choppy = 3, oddly_breakable_by_hand = 2}, + light_source = 13, + sounds = default.node_sound_glass_defaults() + }) +end + +local xdecor_potted = { + dandelion_white = S("Potted White Dandelion"), + dandelion_yellow = S("Potted Yellow Dandelion"), + geranium = S("Potted Geranium"), + rose = S("Potted Rose"), + tulip = S("Potted Tulip"), + viola = S("Potted Viola"), +} + +for f, desc in pairs(xdecor_potted) do + xdecor.register("potted_" .. f, { + description = desc, + walkable = false, + groups = {snappy = 3, flammable = 3, plant = 1, flower = 1}, + tiles = {"xdecor_" .. f .. "_pot.png"}, + inventory_image = "xdecor_" .. f .. "_pot.png", + drawtype = "plantlike", + sounds = default.node_sound_leaves_defaults(), + selection_box = xdecor.nodebox.slab_y(0.3) + }) + + minetest.register_craft({ + output = "xdecor:potted_" .. f, + recipe = { + {"default:clay_brick", "flowers:" .. f, "default:clay_brick"}, + {"", "default:clay_brick", ""} + } + }) +end + +local painting_box = { + type = "wallmounted", + wall_top = {-0.4375, 0.4375, -0.3125, 0.4375, 0.5, 0.3125}, + wall_bottom = {-0.4375, -0.5, -0.3125, 0.4375, -0.4375, 0.3125}, + wall_side = {-0.5, -0.3125, -0.4375, -0.4375, 0.3125, 0.4375} +} + +xdecor.register("painting_1", { + description = S("Painting"), + tiles = {"xdecor_painting_1.png"}, + use_texture_alpha = ALPHA_OPAQUE, + inventory_image = "xdecor_painting_empty.png", + wield_image = "xdecor_painting_empty.png", + paramtype2 = "wallmounted", + sunlight_propagates = true, + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 2, attached_node = 1}, + sounds = default.node_sound_wood_defaults(), + node_box = painting_box, + node_placement_prediction = "", + on_place = function(itemstack, placer, pointed_thing) + local num = math.random(4) + local leftover = minetest.item_place_node( + ItemStack("xdecor:painting_" .. num), placer, pointed_thing) + + if leftover:get_count() == 0 and + not minetest.setting_getbool("creative_mode") then + itemstack:take_item() + end + + return itemstack + end +}) + +for i = 2, 4 do + xdecor.register("painting_" .. i, { + tiles = {"xdecor_painting_" .. i .. ".png"}, + use_texture_alpha = ALPHA_OPAQUE, + paramtype2 = "wallmounted", + drop = "xdecor:painting_1", + sunlight_propagates = true, + groups = { + choppy = 3, + oddly_breakable_by_hand = 2, + flammable = 2, + attached_node = 1, + not_in_creative_inventory = 1 + }, + sounds = default.node_sound_wood_defaults(), + node_box = painting_box + }) +end + +xdecor.register("stonepath", { + description = S("Garden Stone Path"), + tiles = {"default_stone.png"}, + groups = {snappy = 3}, + on_rotate = screwdriver.rotate_simple, + sounds = default.node_sound_stone_defaults(), + sunlight_propagates = true, + node_box = xdecor.pixelbox(16, { + {8, 0, 8, 6, .5, 6}, {1, 0, 1, 6, .5, 6}, + {1, 0, 10, 5, .5, 5}, {10, 0, 2, 4, .5, 4} + }), + selection_box = xdecor.nodebox.slab_y(0.05) +}) + +local function register_hard_node(name, desc, def) + if def == nil then def = { groups = {cracky=1}, sounds = default.node_sound_stone_defaults() } end + xdecor.register(name, { + description = desc, + tiles = {"xdecor_" .. name .. ".png"}, + groups = def.groups or {cracky = 1}, + sounds = def.sounds or default.node_sound_stone_defaults() + }) +end + +register_hard_node("cactusbrick", S("Cactus Brick"), { groups = {cracky = 1}, sounds = default.node_sound_stone_defaults() }) +register_hard_node("coalstone_tile", S("Coal Stone Tile"), { groups = {cracky = 1}, sounds = default.node_sound_stone_defaults() }) +register_hard_node("desertstone_tile", S("Desert Stone Tile"), { groups = {cracky = 1}, sounds = default.node_sound_stone_defaults() }) +register_hard_node("hard_clay", S("Hardened Clay"), { groups = {cracky = 1}, sounds = default.node_sound_stone_defaults() }) +register_hard_node("moonbrick", S("Moon Brick"), { groups = {cracky = 1}, sounds = default.node_sound_stone_defaults() }) +register_hard_node("stone_tile", S("Stone Tile"), { groups = {cracky = 1}, sounds = default.node_sound_stone_defaults() }) +register_hard_node("stone_rune", S("Runestone"), { groups = {cracky = 1}, sounds = default.node_sound_stone_defaults() }) + +register_hard_node("packed_ice", S("Packed Ice"), { + groups = {cracky = 1, puts_out_fire = 1, slippery = 3}, + sounds = default.node_sound_glass_defaults() +}) + +register_hard_node("wood_tile", S("Wooden Tile"), { + groups = {choppy = 1, wood = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults() +}) + +xdecor.register("table", { + description = S("Table"), + tiles = {"xdecor_wood.png"}, + groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + node_box = xdecor.pixelbox(16, { + {0, 14, 0, 16, 2, 16}, {5.5, 0, 5.5, 5, 14, 6} + }) +}) + +xdecor.register("tatami", { + description = S("Tatami"), + tiles = {"xdecor_tatami.png"}, + wield_image = "xdecor_tatami.png", + groups = {snappy = 3, flammable = 3}, + sunlight_propagates = true, + node_box = xdecor.nodebox.slab_y(0.0625) +}) + +xdecor.register("trampoline", { + description = S("Trampoline"), + tiles = {"xdecor_trampoline.png", "mailbox_blank16.png", "xdecor_trampoline_sides.png"}, + use_texture_alpha = ALPHA_CLIP, + groups = {cracky = 3, oddly_breakable_by_hand = 1, fall_damage_add_percent = -80, bouncy = 90}, + node_box = xdecor.nodebox.slab_y(0.5), + sounds = { + footstep = { + name = "xdecor_bouncy", + gain = 0.8 + } + } +}) + +xdecor.register("tv", { + description = S("Television"), + light_source = 11, + groups = {cracky = 3, oddly_breakable_by_hand = 2}, + on_rotate = screwdriver.rotate_simple, + tiles = { + "xdecor_television_left.png^[transformR270", + "xdecor_television_left.png^[transformR90", + "xdecor_television_left.png^[transformFX", + "xdecor_television_left.png", "xdecor_television_back.png", + { + name = "xdecor_television_front_animated.png", + animation = {type = "vertical_frames", length = 80.0} + } + } +}) + +xdecor.register("woodframed_glass", { + description = S("Wood Framed Glass"), + drawtype = "glasslike_framed", + sunlight_propagates = true, + tiles = {"xdecor_woodframed_glass.png", "xdecor_woodframed_glass_detail.png"}, + use_texture_alpha = ALPHA_CLIP, + 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/mods/xdecor/src/recipes.lua b/mods/xdecor/src/recipes.lua new file mode 100644 index 0000000..10fd33a --- /dev/null +++ b/mods/xdecor/src/recipes.lua @@ -0,0 +1,299 @@ +minetest.register_craft({ + output = "xdecor:baricade", + recipe = { + {"group:stick", "", "group:stick"}, + {"", "default:steel_ingot", ""}, + {"group:stick", "", "group:stick"} + } +}) + +minetest.register_craft({ + output = "xdecor:barrel", + recipe = { + {"group:wood", "group:wood", "group:wood"}, + {"default:iron_lump", "", "default:iron_lump"}, + {"group:wood", "group:wood", "group:wood"} + } +}) + +minetest.register_craft({ + output = "xdecor:candle", + recipe = { + {"default:torch"} + } +}) + +minetest.register_craft({ + output = "xdecor:cabinet", + recipe = { + {"group:wood", "group:wood", "group:wood"}, + {"doors:trapdoor", "", "doors:trapdoor"}, + {"group:wood", "group:wood", "group:wood"} + } +}) + +minetest.register_craft({ + output = "xdecor:cabinet_half 2", + recipe = { + {"xdecor:cabinet"} + } +}) + +minetest.register_craft({ + output = "xdecor:cactusbrick", + recipe = { + {"default:brick", "default:cactus"} + } +}) + +minetest.register_craft({ + output = "xdecor:chair", + recipe = { + {"group:stick", "", ""}, + {"group:stick", "group:stick", "group:stick"}, + {"group:stick", "", "group:stick"} + } +}) + +minetest.register_craft({ + output = "xdecor:coalstone_tile 4", + recipe = { + {"default:coalblock", "default:stone"}, + {"default:stone", "default:coalblock"} + } +}) + +minetest.register_craft({ + output = "xdecor:cobweb", + recipe = { + {"farming:string", "", "farming:string"}, + {"", "farming:string", ""}, + {"farming:string", "", "farming:string"} + } +}) + +minetest.register_craft({ + output = "xdecor:cushion 3", + recipe = { + {"wool:red", "wool:red", "wool:red"} + } +}) + +minetest.register_craft({ + output = "xdecor:cushion_block", + recipe = { + {"xdecor:cushion"}, + {"xdecor:cushion"} + } +}) + +minetest.register_craft({ + output = "xdecor:desertstone_tile", + recipe = { + {"default:desert_cobble", "default:desert_cobble"}, + {"default:desert_cobble", "default:desert_cobble"} + } +}) + +if not minetest.get_modpath("moreblocks") then + minetest.register_craft({ + output = "xdecor:empty_shelf", + recipe = { + {"group:wood", "group:wood", "group:wood"}, + {"", "", ""}, + {"group:wood", "group:wood", "group:wood"} + } + }) +end + +minetest.register_craft({ + output = "xdecor:enderchest", + recipe = { + {"", "default:obsidian", ""}, + {"default:obsidian", "default:chest", "default:obsidian"}, + {"", "default:obsidian", ""} + } +}) + +minetest.register_craft({ + output = "xdecor:hard_clay", + recipe = { + {"default:clay", "default:clay"}, + {"default:clay", "default:clay"} + } +}) + +minetest.register_craft({ + output = "xdecor:iron_lightbox", + recipe = { + {"xpanes:bar_flat", "default:torch", "xpanes:bar_flat"}, + {"xpanes:bar_flat", "default:glass", "xpanes:bar_flat"}, + {"xpanes:bar_flat", "default:torch", "xpanes:bar_flat"} + } +}) + +minetest.register_craft({ + output = "xdecor:ivy 4", + recipe = { + {"group:leaves"}, + {"group:leaves"} + } +}) + +minetest.register_craft({ + output = "xdecor:lantern", + recipe = { + {"default:iron_lump"}, + {"default:torch"}, + {"default:iron_lump"} + } +}) + +minetest.register_craft({ + output = "xdecor:moonbrick", + recipe = { + {"default:brick", "default:stone"} + } +}) + +minetest.register_craft({ + output = "xdecor:multishelf", + recipe = { + {"group:wood", "group:wood", "group:wood"}, + {"group:vessel", "group:book", "group:vessel"}, + {"group:wood", "group:wood", "group:wood"} + } +}) + +minetest.register_craft({ + output = "xdecor:packed_ice", + recipe = { + {"default:ice", "default:ice"}, + {"default:ice", "default:ice"} + } +}) + +minetest.register_craft({ + output = "xdecor:painting_1", + recipe = { + {"default:sign_wall_wood", "group:dye"} + } +}) + +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 = { + {"default:cobble", "default:cobble"}, + {"default:cobble", "default:cobble"} + } +}) + +minetest.register_craft({ + output = "xdecor:stone_rune 4", + recipe = { + {"default:stone", "default:stone", "default:stone"}, + {"default:stone", "", "default:stone"}, + {"default:stone", "default:stone", "default:stone"} + } +}) + +minetest.register_craft({ + output = "xdecor:stonepath 16", + recipe = { + {"stairs:slab_cobble", "", "stairs:slab_cobble"}, + {"", "stairs:slab_cobble", ""}, + {"stairs:slab_cobble", "", "stairs:slab_cobble"} + } +}) + +minetest.register_craft({ + output = "xdecor:table", + recipe = { + {"stairs:slab_wood", "stairs:slab_wood", "stairs:slab_wood"}, + {"", "group:stick", ""}, + {"", "group:stick", ""} + } +}) + +minetest.register_craft({ + output = "xdecor:tatami", + recipe = { + {"farming:wheat", "farming:wheat", "farming:wheat"} + } +}) + +minetest.register_craft({ + output = "xdecor:trampoline", + recipe = { + {"farming:string", "farming:string", "farming:string"}, + {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, + {"default:steel_ingot", "", "default:steel_ingot"} + } +}) + +minetest.register_craft({ + output = "xdecor:tv", + recipe = { + {"default:steel_ingot", "default:copper_ingot", "default:steel_ingot"}, + {"default:steel_ingot", "default:glass", "default:steel_ingot"}, + {"default:steel_ingot", "default:copper_ingot", "default:steel_ingot"} + } +}) + +minetest.register_craft({ + output = "xdecor:woodframed_glass", + recipe = { + {"group:stick", "group:stick", "group:stick"}, + {"group:stick", "default:glass", "group:stick"}, + {"group:stick", "group:stick", "group:stick"} + } +}) + +minetest.register_craft({ + output = "xdecor:wood_tile 2", + recipe = { + {"", "group:wood", ""}, + {"group:wood", "", "group:wood"}, + {"", "group:wood", ""} + } +}) + +minetest.register_craft({ + output = "xdecor:wooden_lightbox", + recipe = { + {"group:stick", "default:torch", "group:stick"}, + {"group:stick", "default:glass", "group:stick"}, + {"group:stick", "default:torch", "group:stick"} + } +}) + +minetest.register_craft({ + output = "xdecor:wooden2_lightbox", + type = "shapeless", + recipe = {"xdecor:wooden_lightbox"}, +}) + diff --git a/mods/xdecor/src/rope.lua b/mods/xdecor/src/rope.lua new file mode 100644 index 0000000..2a28bdd --- /dev/null +++ b/mods/xdecor/src/rope.lua @@ -0,0 +1,75 @@ +local rope = {} +local S = xdecor.S + +-- Code by Mirko K. (modified by Temperest, Wulfsdad and kilbith) (License: GPL). +function rope.place(itemstack, placer, pointed_thing) + if pointed_thing.type == "node" then + local pos = pointed_thing.above + local oldnode = minetest.get_node(pos) + local stackname = itemstack:get_name() + + if minetest.is_protected(pos, placer:get_player_name()) then + return itemstack + end + + while oldnode.name == "air" and not itemstack:is_empty() do + local newnode = {name = stackname, param1 = 0} + minetest.set_node(pos, newnode) + itemstack:take_item() + pos.y = pos.y - 1 + oldnode = minetest.get_node(pos) + end + end + + return itemstack +end + +function rope.remove(pos, oldnode, digger, rope_name) + local num = 0 + local below = {x = pos.x, y = pos.y, z = pos.z} + local digger_inv = digger:get_inventory() + + while minetest.get_node(below).name == rope_name do + minetest.remove_node(below) + below.y = below.y - 1 + num = num + 1 + end + + if num == 0 then return end + digger_inv:add_item("main", rope_name.." "..num) + + return true +end + +xdecor.register("rope", { + description = S("Rope"), + drawtype = "plantlike", + walkable = false, + climbable = true, + groups = {snappy = 3, flammable = 3}, + tiles = {"xdecor_rope.png"}, + inventory_image = "xdecor_rope_inv.png", + wield_image = "xdecor_rope_inv.png", + selection_box = xdecor.pixelbox(8, {{3, 0, 3, 2, 8, 2}}), + on_place = rope.place, + + on_punch = function(pos, node, puncher, pointed_thing) + local player_name = puncher:get_player_name() + + if not minetest.is_protected(pos, player_name) or + minetest.get_player_privs(player_name).protection_bypass then + rope.remove(pos, node, puncher, "xdecor:rope") + end + end +}) + +-- Recipes + +minetest.register_craft({ + output = "xdecor:rope", + recipe = { + {"farming:string"}, + {"farming:string"}, + {"farming:string"} + } +}) diff --git a/mods/xdecor/src/workbench.lua b/mods/xdecor/src/workbench.lua new file mode 100644 index 0000000..bc12333 --- /dev/null +++ b/mods/xdecor/src/workbench.lua @@ -0,0 +1,362 @@ +local workbench = {} +local nodes = {} + +screwdriver = screwdriver or {} +local min, ceil = math.min, math.ceil +local S = xdecor.S +local FS = function(...) return minetest.formspec_escape(S(...)) end +local ar_api = minetest.get_modpath("3d_armor") or false + +-- Nodes allowed to be cut +-- Only the regular, solid blocks without metas or explosivity can be cut +for node, def in pairs(minetest.registered_nodes) do + if xdecor.stairs_valid_def(def) then + nodes[#nodes + 1] = node + end +end + +-- Nodeboxes definitions +workbench.defs = { + -- Name YieldX YZ WH L + {"nanoslab", 16, { 0, 0, 0, 8, 1, 8 }}, + {"micropanel", 16, { 0, 0, 0, 16, 1, 8 }}, + {"microslab", 8, { 0, 0, 0, 16, 1, 16 }}, + {"thinstair", 8, { 0, 7, 0, 16, 1, 8 }, + { 0, 15, 8, 16, 1, 8 }}, + {"cube", 4, { 0, 0, 0, 8, 8, 8 }}, + {"panel", 4, { 0, 0, 0, 16, 8, 8 }}, + {"slab", 2, nil }, + {"doublepanel", 2, { 0, 0, 0, 16, 8, 8 }, + { 0, 8, 8, 16, 8, 8 }}, + {"halfstair", 2, { 0, 0, 0, 8, 8, 16 }, + { 0, 8, 8, 8, 8, 8 }}, + {"stair_outer", 1, nil }, + {"stair", 1, nil }, + {"stair_inner", 1, nil } +} + +local repairable_tools = xdecor.reparaible_tools + +local custom_repairable = {} +function xdecor:register_repairable(item) + custom_repairable[item] = true +end + +-- Tools allowed to be repaired +function workbench:repairable(stack) + if custom_repairable[stack] then return true end + + for _, t in ipairs(repairable_tools) do + if stack:find(t) then + return true + end + end +end + +-- method to allow other mods to check if an item is repairable +function xdecor:is_repairable(stack) + return workbench:repairable(stack) +end + +function workbench:get_output(inv, input, name) + local output = {} + for i = 1, #self.defs do + local nbox = self.defs[i] + local count = min(nbox[2] * input:get_count(), input:get_stack_max()) + local item = name .. "_" .. nbox[1] + + item = nbox[3] and item or "stairs:" .. nbox[1] .. "_" .. name:match(":(.*)") + output[i] = item .. " " .. count + end + + inv:set_list("forms", output) +end + +local main_fs = "label[0.9,1.23;"..FS("Cut").."]" + .."label[0.9,2.23;"..FS("Repair").."]" + ..[[ box[-0.05,1;2.05,0.9;#555555] + box[-0.05,2;2.05,0.9;#555555] ]] + .."button[0,0;2,1;craft;"..FS("Crafting").."]" + .."button[2,0;2,1;storage;"..FS("Storage").."]" + ..[[ image[3,1;1,1;gui_arrow.png] + image[0,1;1,1;worktable_saw.png] + image[0,2;1,1;worktable_anvil.png] + image[3,2;1,1;hammer_layout.png] + list[context;input;2,1;1,1;] + list[context;tool;2,2;1,1;] + list[context;hammer;3,2;1,1;] + list[context;forms;4,0;4,3;] + listring[current_player;main] + listring[context;tool] + listring[current_player;main] + listring[context;hammer] + listring[current_player;main] + listring[context;forms] + listring[current_player;main] + listring[context;input] +]] + +local crafting_fs = "image[5,1;1,1;gui_furnace_arrow_bg.png^[transformR270]" + .."button[0,0;1.5,1;back;< "..FS("Back").."]" + ..[[ list[current_player;craft;2,0;3,3;] + list[current_player;craftpreview;6,1;1,1;] + listring[current_player;main] + listring[current_player;craft] +]] + +local storage_fs = "list[context;storage;0,1;8,2;]" + .."button[0,0;1.5,1;back;< "..FS("Back").."]" + ..[[listring[context;storage] + listring[current_player;main] +]] + +local formspecs = { + -- Main formspec + main_fs, + + -- Crafting formspec + crafting_fs, + + -- Storage formspec + storage_fs, +} + +function workbench:set_formspec(meta, id) + meta:set_string("formspec", + "size[8,7;]list[current_player;main;0,3.25;8,4;]" .. + formspecs[id] .. xbg .. default.get_hotbar_bg(0,3.25)) +end + +function workbench.construct(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + + inv:set_size("tool", 1) + inv:set_size("input", 1) + inv:set_size("hammer", 1) + inv:set_size("forms", 4*3) + inv:set_size("storage", 8*2) + + meta:set_string("infotext", S("Work Bench")) + workbench:set_formspec(meta, 1) +end + +function workbench.fields(pos, _, fields) + if fields.quit then return end + + local meta = minetest.get_meta(pos) + local id = fields.back and 1 or fields.craft and 2 or fields.storage and 3 + if not id then return end + + workbench:set_formspec(meta, id) +end + +function workbench.dig(pos) + local inv = minetest.get_meta(pos):get_inventory() + return inv:is_empty("input") and inv:is_empty("hammer") and + inv:is_empty("tool") and inv:is_empty("storage") +end + +function workbench.timer(pos) + local timer = minetest.get_node_timer(pos) + local inv = minetest.get_meta(pos):get_inventory() + local tool = inv:get_stack("tool", 1) + local hammer = inv:get_stack("hammer", 1) + + if tool:is_empty() or hammer:is_empty() or tool:get_wear() == 0 then + timer:stop() + return + end + + -- Tool's wearing range: 0-65535; 0 = new condition + tool:add_wear(-500) + hammer:add_wear(700) + + inv:set_stack("tool", 1, tool) + inv:set_stack("hammer", 1, hammer) + + return true +end + +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 minetest.registered_nodes[stackname .. "_cube"]) or + (listname == "hammer" and stackname == "xdecor:hammer") or + listname == "storage" then + return stack:get_count() + end + + return 0 +end + +function workbench.on_put(pos, listname, index, stack, player) + local inv = minetest.get_meta(pos):get_inventory() + if listname == "input" then + local input = inv:get_stack("input", 1) + workbench:get_output(inv, input, stack:get_name()) + elseif listname == "tool" or listname == "hammer" then + local timer = minetest.get_node_timer(pos) + timer:start(3.0) + end +end + +function workbench.allow_move(pos, from_list, from_index, to_list, to_index, count, player) + return (to_list == "storage" and from_list ~= "forms") and count or 0 +end + +function workbench.on_move(pos, from_list, from_index, to_list, to_index, count, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local from_stack = inv:get_stack(from_list, from_index) + local to_stack = inv:get_stack(to_list, to_index) + + workbench.on_take(pos, from_list, from_index, from_stack, player) + workbench.on_put(pos, to_list, to_index, to_stack, player) +end + +function workbench.allow_take(pos, listname, index, stack, player) + return stack:get_count() +end + +function workbench.on_take(pos, listname, index, stack, player) + local inv = minetest.get_meta(pos):get_inventory() + local input = inv:get_stack("input", 1) + local inputname = input:get_name() + local stackname = stack:get_name() + + if listname == "input" then + if stackname == inputname and minetest.registered_nodes[inputname .. "_cube"] then + workbench:get_output(inv, input, stackname) + else + inv:set_list("forms", {}) + end + elseif listname == "forms" then + local fromstack = inv:get_stack(listname, index) + if not fromstack:is_empty() and fromstack:get_name() ~= stackname then + local player_inv = player:get_inventory() + if player_inv:room_for_item("main", fromstack) then + player_inv:add_item("main", fromstack) + end + end + + input:take_item(ceil(stack:get_count() / workbench.defs[index][2])) + inv:set_stack("input", 1, input) + workbench:get_output(inv, input, inputname) + end +end + +xdecor.register("workbench", { + description = S("Work Bench"), + groups = {cracky = 2, choppy = 2, oddly_breakable_by_hand = 1}, + sounds = default.node_sound_wood_defaults(), + tiles = { + "xdecor_workbench_top.png","xdecor_workbench_top.png", + "xdecor_workbench_sides.png", "xdecor_workbench_sides.png", + "xdecor_workbench_front.png", "xdecor_workbench_front.png" + }, + on_rotate = screwdriver.rotate_simple, + can_dig = workbench.dig, + on_timer = workbench.timer, + on_construct = workbench.construct, + on_receive_fields = workbench.fields, + on_metadata_inventory_put = workbench.on_put, + on_metadata_inventory_take = workbench.on_take, + on_metadata_inventory_move = workbench.on_move, + allow_metadata_inventory_put = workbench.allow_put, + allow_metadata_inventory_take = workbench.allow_take, + allow_metadata_inventory_move = workbench.allow_move +}) + +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 + + for k, v in pairs(def.groups) do + if k ~= "wood" and k ~= "stone" and k ~= "level" then + groups[k] = v + end + 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, + use_texture_alpha = def.use_texture_alpha, + 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 + +-- Craft items + +minetest.register_tool("xdecor:hammer", { + description = S("Hammer"), + inventory_image = "xdecor_hammer.png", + wield_image = "xdecor_hammer.png", + on_use = function() do + return end + end +}) + +-- Recipes + +minetest.register_craft({ + output = "xdecor:hammer", + recipe = { + {"default:steel_ingot", "group:stick", "default:steel_ingot"}, + {"", "group:stick", ""} + } +}) + +minetest.register_craft({ + output = "xdecor:workbench", + recipe = { + {"group:wood", "group:wood"}, + {"group:wood", "group:wood"} + } +}) diff --git a/mods/xdecor/textures/bg_btn.png b/mods/xdecor/textures/bg_btn.png new file mode 100644 index 0000000000000000000000000000000000000000..5815572042d0dd1c9b83bb05d05c796129705210 GIT binary patch literal 82 zcmeAS@N?(olHy`uVBq!ia0vp^j3CU&3?x-=hn)ga%mF?juB|=>Ruiv?0J&VAE{-7_ bvdIZRHWLHm`4gs3fh-13S3j3^P6Eme|Gdiq3;L$D}Z#Dv9I$E#V9C(U_9V+I4mr+oH; U>rY=#0~*KR>FVdQ&MBb@00T2R?*IS* literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/chess_bg.png b/mods/xdecor/textures/chess_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..41ee603d2ea813dd31f85053a16f0db1e0235c4c GIT binary patch literal 29706 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 Hn}+-!8HUbP0 Hl+XkK>k}CY literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/chessboard_top.png b/mods/xdecor/textures/chessboard_top.png new file mode 100644 index 0000000000000000000000000000000000000000..d6db0513ccad3c0da6144118dbe01b8019445376 GIT binary patch literal 208 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHF3h)VW1=1E;3cB)A#wxO1z6Mjm zt^VDb|MTpW24}SohdVx>=r6OB`FDPjrj*34pR-N?RWp_Z`2{mLJiCzw?yZEZWpwg-kF+Bs5M+PD@8ib#Y-s;-5bN0004WQchCZo`(;v|vOp}( zGl;-VQ@E4p>y+npUA_3~aU91pv>m>8JM4rugiN+~h?v|FPE8{qxZ+T=K&o^G1g1FAvVYnG7Slosn z>J$jCl&dtY>$eBs zu&f#$@X{1Mx{`GeU<-nf+8ybmE1{;EqJn@n1Yd`$164yqk3?=)Vu^Q9%~zR-R!_WJ zT1{8oai|qRX(1e_$UsIye#H}02Uf9CRM!k%@Poc9JBJ;_qlxF?`X5)m2Wu%L0L4qW z5H*(t3Zp=7%f?56A|hmAS-hgez7qkVGCm`u)+rQ2QG`kxlCb0^Ti+dh`FF|kL(N8E zy@24OE9;{ibxFngh98viSwSG8?JhhvRiV0PAuKm;D35S8mZ+vs??d~Bk~-w5`!<9N zoJJ*9TQ7?y5p`p>c>DRA|DA@@Fr?Gzw5v+&y9b4`ez9lmxOF5!%x4hrHsAJ~;7J$o z!<>bTosiexfUIsgSsQRF1rmh$byu-SR&~vm@CR1+$8qa@7>GN8#JB7IZ4k88*#wwU z46*;2-9K)9I))-*x)y<;ng2~l5Za0W(td$ur<7>Z>2Kr^yt=!*kaj;pYOJnUO%SLQ z6c{|_A%VDNz67OFxcXcSxHTPe5E*2Lu-Omv`LhB+5=1-M1!$+T zB`_-~4y0%YC~K-QJW_;piOfbTI7(td+XSrSZ4*lR_HarRl7&VadSQdT`8I)}bq^n= zP7G*xiKMoD3+<)sbHljx;0|E^bY|cvHbk=|feCktVpbp_6~KYXgdlFE})#OoT)@mtz;ZY;{b_F{pS+5S{6a-D*~y$67bNvqK65BXCRZ1 zb0VlcLn@j?50FyzHUnOaxQuJ4-c&UYe~(9ET9&hLP%>QK+`1Ic3xijT&C@0_unqx` zJ6syk9ry&=CdAE&I6g7AJHc>o1t|_U3W5dsu(AiQK|uCv_e+8RTO(g$@U&-X9}i8# zQ7ou7iK@0)8rnAGmAFx7g@r;}XK0%!eD zfpk53SJn=S5d;!4WzZQ1y0gH1PDdMcm|$>vMwdKOIuUL-JLEjmyv!Ks#?z(WsY17e z3kr>+`mD~odg3XjKG9^Fpi-R?kE07$9g0f;wVXymQFGuJ4G59{zy`QI_DO}c;y!8WT(%M>CKCc5S(KoLN4Rh$LSleRBy9|*xeWDDkNwc^rsa>790`O zv>(wGN$_S}NznAlU*h^Du3zH%C9c1SYX~KmW(+jtlF8VV6Wmgr@9fssQrhnlF+kdF z58RHpr%(c2=HZ+#xW`QG94nt8H#QE`FfDBbxaEV7hmCfYU9VaVdnhq9pq@w-ap|2u z9-9gwPxBmVF2QzFA*g}YZhfzjwjLI?GAp7`RGaA@8&B28{M_0Y1UUoE4StYiC=Wgj zz@ZCpgr#kHudDN{83r}v&uX# zT>1WeJ=c%FKYRc7w$}B!uKRVZ>$UFtUe~(U{aW|ye*HHW+%hgME=n$r3=9m6l&l^Q aU;qFiJi@z-X7|tl0000+Rjsxy=p?Y!B@P zQ)k#YDSmOb*K2WFFd;@PlV7onFVgKzPfO0v4NUb4a);CmjS*mXxxB63mrXkTum1YY z+J4?I{D|SnDJiQ8S$3{-XPlX-v9~E9u!_xb(HFiZXF--WB@P}}0f{aJ0};mrjiv(u zER72}n249KzvmUjCUN>ed5+ho(76AbZBNd6GBc(2`L?SMpM2hUktcp9TR-piDao$& zokn{$o{V%B`L4L37HVDd{fns@)uuaJ1B92<9^ZL#R*G;-V`0@I4Gs=x0f}Sz?vckC z%Iz*?macv0e|_^ghizFKtj$6VBzl(Ix96L2`s7WYLk03ohXq*L6ghZ+I@%NrcpMWX znhqGSG$wM8CQ-$HFj3|2zl7!cLd#TbQ=c=@kj+`MMFuE8# MUHx3vIVCg!0F!X3YybcN literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/hammer_layout.png b/mods/xdecor/textures/hammer_layout.png new file mode 100644 index 0000000000000000000000000000000000000000..355ceabfbafb32c498a14c6e017f200dcd9db399 GIT binary patch literal 116 zcmeAS@N?(olHy`uVBq!ia0vp^0wBx;Bp3=bcE|uJrjj7PU~7OAhZTO0QIO6=OKSo}a}u>&|Y+43Kf2 Lu6{1-oD!ME3Nf}wXhs!y9G%%&PK%BH6qC%L3)LJa2?%@V* z?!C#B`Czad4bhTl=t83W5&1*OXcZ#Dva+B)^K$Pw=fXW)E>|fOa47NV@c<}1ZcQWM z#G^VLLy%dJ&;*>Q7G7(vC9PJg9T^!>C=_b7TBFgZR4Svn zT<&(eiPz`zk&VZZnhL8GGMU8fzA2I1Xlp}S8rIg()zumdc1We|4u>Qo1Cx^wi9`$r zLoNrEiq%!*oJq89) zP=JXEa5!MIVKjolKxZeUQcx)9?nYi7`ub2_j^1AI`AA8DPzV|g4Go~vk)DpKDzXI? z6(}h|TpS7u5gUuP`gRq$huPOCXhP(FM5ED2oV12?(BAGA%??0*{?YN`!(nA2|qFPef;72 z&r@8*3v*@B-uv(dtKyk5e7p0^p{?-MXN`!t!Scw)KhiI|4-N+#2iI35Z%b${-lcZ` rrxx)(x9-b*+1<)}0rt}i@A&Mc)(=G;o1PyNJvOdPEJcp%gM

r|WeZ=vYMOWHyMW|N8`-AQX?{k|=6Cn-F{c=Y8ftt{o^7<*>3&Yt z?Qe&wICg)zk7#Y7h9SXJ+>DtL75-|X>ojehy%mzV>c#Ng@b=d#Wzp$P!zgWr*WMX1+ zb#>L%)s>c({_4AS8c+>mNswPKgTu2MX+Tbhr;B3|f1Q-n5PcaBw61?$% zZN~!b`hcVIrL5n?&9-nSuq;qd;4jF{PD{LVOi=i5seQPU?P3S}Fs4w4>U!Zn+aeQI jbA9+RM|evlXM_FacU+I|-amH%Xg-6dtDnm{r-UW|45d3n literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/king_white.png b/mods/xdecor/textures/king_white.png new file mode 100644 index 0000000000000000000000000000000000000000..60621c41d2d848bf34649dedc0686987330860e3 GIT binary patch literal 196 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa4)6(a1=3|@Wv#8Py}i9NXU<%@ zbm@i-8;&18e*5GmW z3``Od5fNZ9GI3Gik`;B-^12n=a$pt9Q5janSzN6PZm}pb@#u&i6cAMZ?$9w|_o4-g mGZF)(coGeyxtvNH85u(BIC(A3@kau!VDNPHb6Mw<&;$VS>^a;3 literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/knight_black.png b/mods/xdecor/textures/knight_black.png new file mode 100644 index 0000000000000000000000000000000000000000..44de5f1c4d52500aafe761b503b53c25ef7dda22 GIT binary patch literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa2=EDUO)Ov#5D;KuV$#*sb#--B zR8&k#N|KhAUS1vf2&jg!B*-tA!Qt7BG$6;r)5S4_BRV<3fvLxbE1=D2ieeI1BFC~7 zY>q5Fy^2bw7A_JHR6ClmB1tq^u_Mpixx-^(#{?ml>63(9HqP3t8PYpJC`4R~fq~PC V-Ryj&XdKW?22WQ%mvv4FO#p@Bc!2uE~sf&){J4_82&(G2-(=B=+bg=E0dCvTF?@fi&K|eVM*JvE8Ias#@8z# cb_D~2=5po8F!E>%H%t>lKPmXb1>iRdKKLvDE6!Z$WQ+ l_O4lJHSbLI$@9erId5&}`#ELqqS+u@JYD@<);T3K0RUzsFhu|W literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/pawn_black.png b/mods/xdecor/textures/pawn_black.png new file mode 100644 index 0000000000000000000000000000000000000000..7cb5fc85b861c3ec10022f2230413c558feae585 GIT binary patch literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa2=EDU1=37ROacM|Qc_Ziii*0r zx~{ISNl8g(tz1oja*QQGe!&b5&u*jvIkuiIjv*Y^lM@bb&tP4^v)N&VLluWhhb8Z+ z1cB0)RfZxh7kpki3TQf;x^_&MwLrmTVntSml1uNR1q^1~jJ0B{4~kYgfed2sboFyt I=akR{08I)kx&QzG literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/pawn_white.png b/mods/xdecor/textures/pawn_white.png new file mode 100644 index 0000000000000000000000000000000000000000..f7a8dec0edfee969a07386c17f25ba9f5b9f299a GIT binary patch literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa2=EDU1=3|@Wv#8Py}i9NXU<%@ zbm{Tq$8X=hEwl2#E}$G^NswPKgTu2MX+Vyxr;B3jp z)zwv0RFsyMzI*q$4NwhZNswPKgTu2MX+Vyjr;B3`+#CUi^+5}L8_jTGC(a~exn cuC{V96jX7TCu!e&3N)F))78&qol`;+03Wk7FaQ7m literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/queen_white.png b/mods/xdecor/textures/queen_white.png new file mode 100644 index 0000000000000000000000000000000000000000..d923f058b6ccfe488d082e7483de5596ff50eee8 GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa4)6(a1=3|@Wv#8Py}i9NXU<%@ zbm@i-8;&18e*5 literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/rook_black.png b/mods/xdecor/textures/rook_black.png new file mode 100644 index 0000000000000000000000000000000000000000..fa87141c63940b7c71c2f644bbb8e1d3e61a8e58 GIT binary patch literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa2=EDU1=37ROacM|($dn3ii*0r zx~{ISNl8g25zF*}a*QQGe!&b5&u*jvInJIgjv*W~lM@cGNw6xIO!iP{S-MW;1xMP7 zm8?z@i(V>r32a@c7jU(yDIoTxqky2ZscXlCSqdS$E3`tyCofvSU^biawg=nA74fDq QK;sxZUHx3vIVCg!0AaQ-pa1{> literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/rook_white.png b/mods/xdecor/textures/rook_white.png new file mode 100644 index 0000000000000000000000000000000000000000..6703452693ecaabd257cead130f881e38f759bb3 GIT binary patch literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa4)6(a1=3|@Wv#8Py}i9NXU<%@ zbm@i-8;&18e*5RD72)lkx literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/worktable_anvil.png b/mods/xdecor/textures/worktable_anvil.png new file mode 100644 index 0000000000000000000000000000000000000000..afca15ecf032761ce9868087923fdb11c744dcbf GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^0wBx*Bp9q_EZ7UAm`Z~Df*BafCZDwc^1?k`977~7 zFYR;WJ>bB>(q3RyP{6e6iApGURY3#)Bs;w=wcCFy+)OEB`qRJQeH2f`=IjTm3)&|( zJQQKlSR={zHRo&2)dc0nJck=XLZ7pm_V|1M?)KlwU~yK+Y|Yhwq9BVsUHx3vIVCg! E01Wpv@c;k- literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/worktable_saw.png b/mods/xdecor/textures/worktable_saw.png new file mode 100644 index 0000000000000000000000000000000000000000..73246ca82d1ffc8b8e5c445f90f64eb91b2ace36 GIT binary patch literal 194 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHF3h)VW1=2w9|5V+rZqJ@bz285- z{CIo)_qVrSAMX14?8MVc>#iPN^!~x&c@ry|;@(OEl`@tD`2{mLJiCzwS}4p7D*q!vimy;M1%9X)OK_GK>GGbyvj z!8cngxX`e2hV!1|^Uq$|bYXE_@f0U*7eVt-NuZjLGCikw#eyIU^I-AjG+*}&<@sBd z`vQ$(DGBle8OgADa@s5))$Zxy7$PC5dXSN+MS+9mKrCNCaPaE?`@c>~`w-;(p`~BS zNsq(5wCx%{!^$tkE3Soj+iz8?$SeLi?Yik*h7H@J>y)-@Z!C-vQGDr@bLHfNsW(=r z9h$Cw(9M)Hj#c_9zv9yqtqf=GoG(v>QXrdu?r ZGSpWVvYehM{=E+5G*4GQmvv4FO#ly}Xq^B6 literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_baricade.png b/mods/xdecor/textures/xdecor_baricade.png new file mode 100644 index 0000000000000000000000000000000000000000..87109bb5c1523b54869a2b991c0f0b2fa3cdd5f4 GIT binary patch literal 258 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!aez;V>;M1%b3;tk)YPWO=>bU~ zJHb#G$o5g?Ta;(FqdURD!6Cy@p}#v$UK&kAU}{X44WsX%>q(Y zo-U3d65+A^7x`Kg1emv9VigJa|36!|y?STN{Dd^2rknp?DBKhDyIu5=A+Bf>@76VK z8lp^JwofcS$F%w4lSbB0dO_c08shqoEw)su&i{7cZC_dz^Dm vfAy*A67dD~f96R2J^JMF;;cz0m%qPavpJka-X&l@$Zrguu6{1-oD!M93=sBP1lGqN1{<%;)r-&8vYD9iA?Z zArg|T2OWzJ88EOMoH@0pv)lRK|A19Y)6DKJ%FPk;dEeKZCK42@`f}UiPg~D4`DY(w zx^|8uBzksN&s@KX*l3zJyLnp@kiK%53@yFG-QLy4zYoHB+|P@84|@%2~Pn u#MfT|q2{w$?|Z4L`W(NM4LxkQ)BXXL3`LkB^1uTC0000;M1%?>@M7`TF?|B_(fR z;bK|Y^;=h*xp4f%nL|Kvpy0~&i-59uy}Nz0re;b>9Xh@@tbE1w+gGX*qv9kafLdx( zV)q@{>ClauXGBWxv`YmD?So!Jz+mG4$)=lg@ Td;9jD0XfFg)z4*}Q$iB}M2BrR literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_bowl.png b/mods/xdecor/textures/xdecor_bowl.png new file mode 100644 index 0000000000000000000000000000000000000000..9197da9726753b80d8a24340f35c988567202be6 GIT binary patch literal 193 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa3-AeX{r~@ekiAiqo5l3vNI0V@ z&b2c$usYJ|q3PGtK$R>dL4LtNnql+gv{^vP&(p;*gd;jRL4nnPYuAolJ2$4J3gK@mm9NUv}GkE4r`y**7jzRnBj9r`?U95)`nZIF|jgJ dSw7rgU|73cXvfsgejp1NJYD@<);T3K0RRm>JeL3f literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_bowl_soup.png b/mods/xdecor/textures/xdecor_bowl_soup.png new file mode 100644 index 0000000000000000000000000000000000000000..54d87ae07df66a2c8696a4720a2e8770c5cef279 GIT binary patch literal 215 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHF4e$wZ{r~@ekiAiqo5l3vNC@M_ z!-*-^kdScqVez%2 zTW>cu8ZP?nT3+7Gz&yFrz1)5EW`=;>9jm(+PhyahW(ctnEnV2Y>kP;uPgg&ebxsLQ E01CKLC;$Ke literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_cabinet_front.png b/mods/xdecor/textures/xdecor_cabinet_front.png new file mode 100644 index 0000000000000000000000000000000000000000..638096801e2facf222270e03698a46f030a1ef40 GIT binary patch literal 247 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!aez;VYj&74Nw1BR%Xk)I|q{`4>XU(ca+lCD1)DS~Y8|5%J9Y<5eXFKOk1ZuDMba4!kkYqi` zIO(tf5A(*@Q!oF|uP*LA%EY{^#~@R}^46V1=JL4b9a}Vh?7e()#!eaarGX+2w~M9q z816LP;z*G6%DlYtjr<;^$-z33>z3vjbAO7oV|aPfc{Ssq?&FINw0*5S$)&r&mIZVQgQu&X%Q~loCIF4nSqA_B literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_cabinet_sides.png b/mods/xdecor/textures/xdecor_cabinet_sides.png new file mode 100644 index 0000000000000000000000000000000000000000..32ab2579eac5afa625c23941f8877aa2ada3e683 GIT binary patch literal 245 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFv5AX?b%?>lqi?l3?u_=hM(ozuC zQx;W{7BEy3PYp3_$Z)Pov{jZ7G}e$@A2_)bsHM}>#W93KmgV4X-a`QbEC)mn3357> zu{$tE|Zh_m8`LBs3liDVs^oyQ*HI zIO`Pq+!W2-N$VH!oXyx7a>~sl@I~Z#iKZ`WjBoLrf0ZxeDt4W}H^p;y!Gbj|J0IFl qoggs%!YAcE9-l*8Zaqz1O$<>E<{IX|S33Y5#o+1c=d#Wzp$PyQ@l|L5 literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_cactusbrick.png b/mods/xdecor/textures/xdecor_cactusbrick.png new file mode 100644 index 0000000000000000000000000000000000000000..4856f09a0332a5cdc4db575ee6052c8618cfc95e GIT binary patch literal 465 zcmV;?0WSWDP)<0xV|&F>nIJ!N5nA1HHJkK!OCz$i{YVYPqwqe|dJz%gJD>23@BH zJbnY^-`88C2SSGf(9X;$T>>Un0>Zz$N}2?Rf`8W2(zvs*L4E|<(8X!E2{d&BId23a zN&!oh1%rNjk&KDHySUG>$9Mn$0NzPNK~xwS1;L9#f-n>S(7V~?DZ&PfU0~^W4$;C) zs{jA7&H-TjaCk${_k$3lD28Ja#-|khEItWjQbJyos?t;otwqx+0Z3?w-pv`wTo5gE zeLqmt^KN9*G&>GqHdkhpVJl@DDjUF}v~GrLQ7lS`e7ylWyWWvLJ_&I>lY!XIt*(Se_FPvt9!44_asw~STx2>wEP62z`aW)Qy zLA)i&;`qMrahMctgr&$!Wlv8ngj%l63yd*n9T6I$JFV+KHFXz>Fp)5?00000NkvXX Hu0mjf=F+~R literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_candle_floor.png b/mods/xdecor/textures/xdecor_candle_floor.png new file mode 100644 index 0000000000000000000000000000000000000000..c1bc4e3f5eeb8f6702c65e95215a8ab15f66b3f8 GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^0zmA*!VDxI2ESSgq;vy(LR^9L_iwNN&t?68k^6rZ z!>%pehxSZbv%L1{qf>Wo>^j-+v9H>CO_I*yK=~=Ik}MzhO8_-6l?3?(Gpur$(0&fc z^YV0Y4AD5BoUlMf!yz+mM#CoNDF?ZPJ#`w4l!O-aoM>Q8sB%m-<)3k|_SrjTwk!rU yiDt=XJgKdXCH+jyRX;4WdAdFnrY*3kVR*ez&U2sO`m;b&89ZJ6T-G@yGywqAsYy%# literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_candle_hanging.png b/mods/xdecor/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/mods/xdecor/textures/xdecor_candle_inv.png b/mods/xdecor/textures/xdecor_candle_inv.png new file mode 100644 index 0000000000000000000000000000000000000000..90a479e1150176c73fb5f45a5ecdbedfaed3f626 GIT binary patch literal 177 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHF4e$wZ1=8QYz5YL!_5Vfg|5*&X zwsarbGilB8+NY0B-MO*rWWUG0YU?#gI*SA4r?^V8eB3Vq)WB2{%pehxSZbv%L1{qf>Wo>^j-+v9H={O_I*yK>5^e^KPJOrjj7PV1`u=6WY%Kd4ZlT zjv*T7lM@cGiYzcO_Hnq$cq*Z_Q$@@{QjjyiErp>aE+CROv0(mA?x~NSHD=!CPA)JO z;GdDelQzS6iYVJ9TP~g#4Em3DXx+M)-Gv4jZ7s$e!&b3Ws}cZ0C{?z zE{-7_(a8x5>;yzYL|P15SQqkKchNX}NAT1JgE<^&K4(r$Vlz%DyI*_a00TqkK6dG& SaoiwxFnGH9xvX literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_cauldron_sides.png b/mods/xdecor/textures/xdecor_cauldron_sides.png new file mode 100644 index 0000000000000000000000000000000000000000..6644edb3194b83229f6ba36915d138cb74841b1f GIT binary patch literal 197 zcmeAS@N?(olHy`uVBq!ia0vp^0wBx*Bp9q_EZ7UAdOTemLnNm9_U-06Y{29CRglq_ zQ`SVnr!D5z!PbW5d>#Qe`(~X?RJ>IuT_^hg*vRI#~Zb#?}ko!Dc{an^LB{Ts5`xZ-! literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_cauldron_top_anim_boiling_water.png b/mods/xdecor/textures/xdecor_cauldron_top_anim_boiling_water.png new file mode 100644 index 0000000000000000000000000000000000000000..48584d5f857fc071a5eb786f24b932dc4c8271ee GIT binary patch literal 657 zcmV;C0&e|@P)hzogD{3%J<$U_GeX$mSP9+H~@WCB{C zU1RW2&*7mQ9%pDBKa}adoB zA4Xr$kB+2b@*{zLpL1pV(R4Ns0^l#q01;BM&j~P^7tDzh*t|htU_A*!zJz zzIvxGz53k`iTh#jXfOL=^hLgiALoaA3YH(O;|KP|;-UAnv3b;%AL7De+S68GUplHB zKbrsMQ9C>Y?&-Bw1k;XR4vS12cdXsgoAP|P^EX$Z|3!%_uAqVKiDr;ukAC!Wl z)dMZ`cr%J3KC{)0KdVJFyA5X%&0`6LI4q;t2Ed4ezgkPsc7UV@U2Q$w3s*b_kZo!P zNKP_+9bh8};>zJwtVLRQnBx=6&qsfszkQss!i5PxIf&d`gflXlfBEdFs`xb00000NkvXXu0mjfX-37t literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_cauldron_top_empty.png b/mods/xdecor/textures/xdecor_cauldron_top_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..5cdf5fdd3fe280eeb1731e4db5e05328b53eadd0 GIT binary patch literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^0wBx*Bp9q_EZ7UA+B{txLnJPT_8a;!7z!{SzZW{I zqly3He|AUViKa&xnabrNr@7_-@&850B(oT?CC$;4}{x?x78*b_d-O-GAg&AwrL-@#?^`B@7WD85*9M__@a pmZ?C~`MhhV<1J_Ht-osift9)5>P+c3rQ;x%dAjxSg+d4fc}tH!O?#JbTCnfmJ+(c_ ziFJ1S>RwGsNL(s^W@c}SO(Vm-uf|`PeED)ij`_`31;2D;gdOMK zp0~c>@47>Q$|6&)PI-7za(Va-v)1LDU!HuOab#1jfBjp2mY>2rf7KU11zOJF>FVdQ I&MBb@0Huah4*&oF literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_coalstone_tile.png b/mods/xdecor/textures/xdecor_coalstone_tile.png new file mode 100644 index 0000000000000000000000000000000000000000..3122db0d8c1642e4251366a4d4bdd3d0a8425382 GIT binary patch literal 463 zcmV;=0WkiFP)^2 zE-o!CEif=JB_$;@Gc#IRUSD5hQBhPYD=Sx5S5i_^RaI3{QBgQJIDLJAy1Kr#wYgeZ zSxQPuOiWBfL_|J5K4D>Hq@<{fjFFg_o}Qkgk&%{pd3`7-C`U&}Nl8g$WN56cu{1O^ zUS3{MP*A6*tBsA4ZEbN|TU$FjJ7QvHs;aI(KR;<{Zh(M=XJ>3wR99_na-*ZCU0hr{ zIy#k=nrmxto139PKtMb^JY-ife*gdg*-1n}R2Uf*!HYtIFcbjLJMrF)M+n)#xr=O- zKpKKM?eYH~mYxG37Eu%}k)$G$q##a`G)tfIRZ%_=i05?uqARR7W^1`2*kxL`u0sE6 znYmH$_P%${Rl;{{dL9VGhr2uA@sqcf8wtyF91m3`PMzruPXsw43dH#-P`2+b%#!Nkodo6?PEC@jpLZ7K}|@5DEYQ002ovPDHLk FV1gBgwJ87q literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_cobweb.png b/mods/xdecor/textures/xdecor_cobweb.png new file mode 100644 index 0000000000000000000000000000000000000000..bb1eceaf7dce0e5786745a260e37b7bf5b3403d9 GIT binary patch literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^3h)VWy>jKs`}gnv|Np;i*)j-w z{zBQ^Kw0LJAirQB{j2QAJs_3s>Eal|AjL}_c%P|nn$Nc5 ze`pQ=M4gKpw!P+KR-HD#Y0Wne&R2W;GsPz4zN{2o6Bj0WuKV6(=HBme^<253Yw{E0 y%(WLEIC975Le#Hn4jFqs^M#(z1=*U7#Qo|+J%uI*OlkpH%i!ti=d#Wzp$P!~zfrLO literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_curtain_open_overlay.png b/mods/xdecor/textures/xdecor_curtain_open_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..e6eea416fea51e6ff20fb5221f060b3263699e3d GIT binary patch literal 118 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!D3?x-;bCrM;TYyi9E0F$QS10?gH4(^SED7=p zW^j0RBMr!r^K@|x;fPL7S(DzP@NBO}$6qy(kM=BzKW8hX>=$R?%H`P`w68A%sFK0c L)z4*}Q$iB};pZP5 literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_cushion.png b/mods/xdecor/textures/xdecor_cushion.png new file mode 100644 index 0000000000000000000000000000000000000000..ad4674c4ede176496a352cabea5721c32f99939f GIT binary patch literal 374 zcmV-+0g3*JP)oGR9bI346y~KG;XclVAAm-;x{NIvO0%H4(<1I;h*h5fwzSeWs4@4}4<{ U)H^8&^#A|>07*qoM6N<$f>hdv9smFU literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_dandelion_white_pot.png b/mods/xdecor/textures/xdecor_dandelion_white_pot.png new file mode 100644 index 0000000000000000000000000000000000000000..ccb91ee59be152a0c6cf404746068bb093a422f0 GIT binary patch literal 349 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}PJmB{>;M1%eJ06<_RBtd{pj-b z^NCiv{stOpOJ!R(f&_Q&-{L+~86q`v-V~rp<6>^LG;Zf=Zk23a(*_BPYLN|DF+Kh^ z(?Xq!>bR@Pq?+g@nQKNGYx!u(ujh_g1+0jeE4hC zMbC2+v-d3fW_T^~dX)X=&*t@?zRtLI-@n)Ip4M8ktxMl7x|wuY<+U!ui~3+zkHsPX i`V5oLXZt_4{m;M1%Z=Ox}nIs$9FPmtk z>u;d(`)%pJZyV~1If3G7OJ(0)VQAe5l3g@K&V8mbP^C&XuW>QAMYV`?HTQsKb==itQcd)d%rzs8wR|+?SNgMj0b0sd666Q690>B3 zu}=h2lRaG=LnOjmd*AXk8SuD9-(dTlAR-!8*!1Ba|I1@0pUzLdbMJ|YIqMJZc>zC! zef?IiUd3@)qkG-wAEMW`-}}}gpSWq`y2DB_&U~JW6_;LAo%rkt+pd87QJ1e4oLT?O z?UW#2DeK~|Ra}Wa_Rgyq8cjdXwY+|2&e4N0UFrh;6^|4hY^EQYb>6#S%I$6Iz3(L7 cneKbaymcn`FNyhccY~bi>FVdQ&MBb@0BuHt)&Kwi literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_desertstone_tile.png b/mods/xdecor/textures/xdecor_desertstone_tile.png new file mode 100644 index 0000000000000000000000000000000000000000..094437fc0165fb5fa51a90b884d2ffc524e0285e GIT binary patch literal 260 zcmV+f0sH=mP)6Xj7S9OLJ4rOPpg)|NsBnl~#5D z004|hL_t&-(>;#?4#Xe`1OWvRto{FQZ_(zE7y_GFAYx__B4H9?6x@32Um}F0s}1)V zF(M+X;nUSD!gN>?QHvAf{Hqi(^vvz?NCp%GM~#fwrFebLqc@FW^r{ua((I3+?oUzv zjKhS{xGsgeu9tyX`NqV$wQ0N4>gj>5+_{h|bMM7C7uTcD_t6ht?gqxTN}qKA0000< KMNUMnLSTYQgls1O literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_empty_shelf.png b/mods/xdecor/textures/xdecor_empty_shelf.png new file mode 100644 index 0000000000000000000000000000000000000000..a8363c0f49cd01de7eb3b8a2fd3ec657e95738de GIT binary patch literal 363 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}U4T!B>%t7j0uSvff5Qqt!^SY< z>B%Zhbp1i1wo_vs{nwliPrK-52mXxlnkc*Ct7$2vcD4&J8l(m|Kv685< zvbdkAa=eqylzZ!=fG*)H3GxHE2nnoukrxi+_IbKEhDb=V9z5uEI6=VeVzs(((}(Go zS|9wjpOYP%!EN}tvM<9#%_^%{n5F4Jcrqii2y^x3POew1=k5NT31Z4wQnf~vgK_7t zFM13N1*c|9xh;1(<`>j??1)SedlzHZ!`+QZ8VMTTmNg!q%)PlV^uFJ{TG7+-hki|D t_ZDFKbn{Gm!ydi~XYU5fK$8AUr4_J{=k>7ZxKB5EDB#S1Kk*J2qJ_D^4RGITjTl7!@HmFjN>7BRVrx z6%-vwL}n%+I~NrpBpx{x6dV*28Zj$QH#1Zb5f(r?T}(%3Lp@<28!r|V9Y#T67ZxHD z5f>;SK}kYoDJDlF9X38XT_GGZARIA4JYORnHA+Wj8yF}W7bYDVEio-l92zSvC`mCZ zO-e*&K|Ej<6d)cNEh!;EC?i5AAUriMQ5zU3NJ3>NAU+!xCoL&TGc8XqDM}O*8xs>4 zP2c&w0002_NklQCU&zjngJ*y3uNz9i!XR`<65qf^0h@Jk!K6J)bD9Hv)Y+WE>g#-C)+7V-FlT zybvxI3PWl}L|OtduCC*OG4qpE$})QewHpU-J$@IB;a+-p+ zIXJSYCd|Jqsh}jBGBBfVDWPpCmoP50swR_*AA58ffhs49Eh?IlAdG_;6%-sMAUqQh z7Zns98yF}R6de!{6dD&K7#1TD5fw>9W-u#F5fK(KElwO7D=jEV78M{bD^58xR82={ zAR8|?GgKrVITscq5D*heL}s(|?{komC?P>QGgTH8ARZbmDIq~9BSLeLl*IY=qW$|% znx_~SBq=6GCLlW-7%6j-mD&FN!T9y8{rhbD`dR1UMbgJZJzzC2QKs?izxefT;n^o3 zJ`@ug8y6=X8Y@UbV=*mH9U3h$D@_*_ArliABONwKLS;iGj`IKj0L4i}K~xx5O^TsU z!$25EfA6le*RF#}G6W<9#0&y~n%o~gfk7g`pfL+gNYl`}wf7+w5}thTA@m>cpzN4c zaC9mXO)Mv`qf>T%HVd>if|TW?B2|v1NI|aY?G6iwdpx(6i0~7ITig)E zE;^N;SAzNFQ7N#CP7QqA4XuVh@w(mDPdw)brSJ=3m`wu)AL%Rr0000tMl%id z7n>MO(opYKQs_`rShG-d|8pm9pvnYK7sn6|S=NIGd7B&@X7}s$_foiUz*Xl! z3tPpe!$1&)(eKXe<_8-W4iW_=Am0CR zQYFEPL_t8ZY@*oC4(AA=B0(_%ld`1ZAi`#p(?*iCWRNtil`741P)jiqd9XA@`=EPL zC?@9eX#C}_OKxuKOVeM`n-mxTMYd%7%AI{4(~|Ph(xLnHcDv%a<<#owwrYQhT>!8b zpaQ~na1L<>M7Em^G#}6d{XPI+eeV>p*(Rp3^+r}x_5jcThf(!A3PXYEPCEJPaxGPI dcelQB=^w%_NYK^H`v?F4002ovPDHLkV1gdKqfP(- literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_enderchest_side.png b/mods/xdecor/textures/xdecor_enderchest_side.png new file mode 100644 index 0000000000000000000000000000000000000000..4691247686ccbf737d14ae26f74085da1a34a324 GIT binary patch literal 414 zcmV;P0b%}$P)*G7Sw75DyeBDmagikBW+lk&%&ugM*fqmW73dl9G~J zTU$#@OSj9|iU0rrv`IukR2Ufr!OKp9hF*8ngFwm-H{n1M-np=`_QcrFV8_*_E!4@Sv8O9cwwo&W#<07*qo IM6N<$f+3BN$p8QV literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_enderchest_top.png b/mods/xdecor/textures/xdecor_enderchest_top.png new file mode 100644 index 0000000000000000000000000000000000000000..1f6676cee5413e128063ca98eb6960d53cd183d3 GIT binary patch literal 403 zcmV;E0c`$>P) zC?_%^Au25@IA>>P9vmeN4G@oykBW+lk&%&ugM*fqmW73dl9G~AQc^}nMq683OG`@= zA<7j1006H^L_t&-83n;XPQySDMZx#G#|A5z2*HR23+}-EuY-^XW&yE9V!Pc`387tr z-AGL8B<&6&ZAD$Vmn3bS(B(mrKiz51tX-PQYV+z`Yt+HMu*|Y-r$RbE$)S?dar>q` zOTz$vedhe=ak4W2kgn$9*D4DRBP76NBLLZe3Zyj{!x@1yvYTD#53m5s9Dwl-9(^MK xUYb=j13(XaOgg@zG?bWv@~JnJCIG@A{s9#_L!D(xqniK#002ovPDHLkV1l=Mi=_Yn literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_geranium_pot.png b/mods/xdecor/textures/xdecor_geranium_pot.png new file mode 100644 index 0000000000000000000000000000000000000000..0a68204cc20c7f3a98a5c01a6d0666e28c469d11 GIT binary patch literal 382 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}b%0NZ>;M1%eJ06TcsGRh%O;j@ znYHptkH3w3^1igCvIcH5fm}7439TDtfwJy1m4PbvocgGi#=T_gLzQe^<6>@$Y7v=G zcGCt4trTwQV0Pzf?hRQn(?Xqqh7{QwEQ<=Lax)LnSF@Cp%&^pPSCdIK(MvMdj5OBr z(Uj*4u3iLm275`6AILc%5SsET0!Xd)ba4!kkYqi0(C@H;fa}HIX=-Jcwm1bGT=wXH zJvZk@=ML5h*Zhvp0ePlDCE*prQgx3et-CY6S~na>)c2hsqr)q+C&;}yqHFDnMV)(f zS>K9bBkNv;8Aq%axX_pTYWZD$iMT%pk9GCcZ{Eirox58veye@g z7XO!>CYztvnN5D}nm&DTIAa1Q!^$E-1_lE=CSisQhPIFIFgv=lzMPzCadZNswPK zgTu2MX+VyMr;B3e)78&qol`;+0Oukc ACjbBd literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_glyph10.png b/mods/xdecor/textures/xdecor_glyph10.png new file mode 100644 index 0000000000000000000000000000000000000000..06bd07432b6d871322a1479f2e6c27d48a2b4169 GIT binary patch literal 104 zcmeAS@N?(olHy`uVBq!ia0vp^Y#_|Y3?y$c)pCP40X`wFK>Fgv=lzMPzCadZNswPK vgTu2MX+VyEr;B3Fgv=lzMPzCadZNswPK wgTu2MX+Vykr;B3zopr03W^=KmY&$ literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_glyph12.png b/mods/xdecor/textures/xdecor_glyph12.png new file mode 100644 index 0000000000000000000000000000000000000000..1f6be218becbec9e5963087a8d63e053c6b007a6 GIT binary patch literal 103 zcmeAS@N?(olHy`uVBq!ia0vp^Y#_|Y3?y$c)pCP40X`wFK>Fgv=lzMPzCadZNswPK ugTu2MX+RFYr;B32D literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_glyph13.png b/mods/xdecor/textures/xdecor_glyph13.png new file mode 100644 index 0000000000000000000000000000000000000000..4678f7f1c0f35a7c9d719e57f730202c683672c7 GIT binary patch literal 106 zcmeAS@N?(olHy`uVBq!ia0vp^Y#_|Y3?y$c)pCP40X`wFK>Fgv=lzMPzCadZNswPK ygTu2MX+VyUr;B3Fgv=lzMPzCadZNswPK ygTu2MX+VyUr;B3lpPnt(^HAD9PaI>gTe~DWM4fF_av$ literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_glyph17.png b/mods/xdecor/textures/xdecor_glyph17.png new file mode 100644 index 0000000000000000000000000000000000000000..7ed2bd43be8df8f2a152ffa2efde8314ad731ea2 GIT binary patch literal 100 zcmeAS@N?(olHy`uVBq!ia0vp^Y#_|Y3?y$c)pCP40X`wF|NsBLc=37t5&l0w5yp}r uzhDN3XE)M-93D>>#}E$Lt<7fAQjTAS&XRY6}!( zDhcunW?(3reAWWU6Y_L%4B?PXezGCq$%+J)i2-a3f{jeFgv=lzMPzCadZNswPK xgTu2MX+VyUr;B3Fgv=lzMPzCadZNswPK ygTu2MX+VyUr;B3;q literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_glyph4.png b/mods/xdecor/textures/xdecor_glyph4.png new file mode 100644 index 0000000000000000000000000000000000000000..dc1909b6a337f47aa43e81c2f861a3da3c4c5ad3 GIT binary patch literal 106 zcmeAS@N?(olHy`uVBq!ia0vp^Y#_|Y3?y$c)pCP40X`wFK>Fgv=lzMPzCadZNswPK ygTu2MX+VyUr;B389ZJ6T-G@yGywo%YZ%Y~ literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_glyph5.png b/mods/xdecor/textures/xdecor_glyph5.png new file mode 100644 index 0000000000000000000000000000000000000000..1473ea41d1809a857b372bd402053a51f0c1e740 GIT binary patch literal 104 zcmeAS@N?(olHy`uVBq!ia0vp^Y#_|Y3?y$c)pCP40X`wFK>Fgv=lzMPzCadZNswPK vgTu2MX+VyEr;B3o^D-_5CL@MrTIX1bfN~6;u6{1-oD!M<6pa?+ literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_glyph6.png b/mods/xdecor/textures/xdecor_glyph6.png new file mode 100644 index 0000000000000000000000000000000000000000..45c0c9a64bf56d873d97fc7fc84712e5e52a160f GIT binary patch literal 106 zcmeAS@N?(olHy`uVBq!ia0vp^Y#_|Y3?y$c)pCP40X`wFK>Fgv=lzMPzCadZNswPK ygTu2MX+VyUr;B3Fgv=lzMPzCadZNswPK wgTu2MX+VyEr;B3FVdQ&MBb@06Ik(7XSbN literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_glyph8.png b/mods/xdecor/textures/xdecor_glyph8.png new file mode 100644 index 0000000000000000000000000000000000000000..c5ae1c3b7b5f8a39756eadff3767f188d6b27eb5 GIT binary patch literal 105 zcmeAS@N?(olHy`uVBq!ia0vp^Y#_|Y3?y$c)pCP40X`wFK>Fgv=lzMPzCadZNswPK wgTu2MX+Vykr;B3!@>j8WlYx>9p00i_>zopr02ehDx&QzG literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_glyph9.png b/mods/xdecor/textures/xdecor_glyph9.png new file mode 100644 index 0000000000000000000000000000000000000000..148b03d0b3b190fe3b368c83cad65bf176976293 GIT binary patch literal 102 zcmeAS@N?(olHy`uVBq!ia0vp^Y#_|Y3?y$c)pCP40X`wFK>Fgv=lzMPzCadZNswPK ugTu2MX+RF2r;B3{$9^V|T+FnGH9xvXdknFN37i)sE_+`C^@3xBp+P$08 zZ#iCayluTXwspU5d}|cj)c5LYWo-9aP8W+7Zrz>V*jBJ(Ymnt!hGi99_Ln}W>dwMpys< literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_half_cabinet_sides.png b/mods/xdecor/textures/xdecor_half_cabinet_sides.png new file mode 100644 index 0000000000000000000000000000000000000000..6f274b8bc75745a6953c9701c461411c2c076e26 GIT binary patch literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFv5AX?b1=3kz=D86TMKLx7QC1rA zLOMz!O40(x>f-t;qNyQ<4H?c=iMA`w3jP5qWh@Eu3ubV5b|VeQ3G;Mu4B?PX76=I| z2`dpSOBC?+&-R@yIrGqiZCT%6g;x8q8+XjN-23dzN>fdqtmWlvqxM!`Phs17cXinO zn|rNV59VY=-8v(g>&bIStL>bZmzy3>2oruG1<|bU}Iw=FE8)y?JXf8k+3Xf6;KajNswPKgTu2MX+Vyv zr;B3Xi(P`5!c2aS8oV zv1oVlaJcE9cXrZ>M+wS&r&-Fs>f5qLGo9l~y(M$_kKS1?Y1_-aZGNg145#y)yV+Si zlMV~1ED@H@ROCwDrNQ`7>Q6k!jo{Ch%5KlCZm-T>*ihJga)+bOx%#><&P?^f9MK>b Nd%F6$taD0e0sud7Pa6OL literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_hive_front.png b/mods/xdecor/textures/xdecor_hive_front.png new file mode 100644 index 0000000000000000000000000000000000000000..451555152f96e83dcc5e1031493da61bb1837b19 GIT binary patch literal 726 zcmV;{0xA88P)?nbra{HCPQtEB$hAz!wNSyVNxiB` zz^qEjxKPBfO2e;8vYb7mk1~92GO3V)r-_v*A(s||Df!@$|;M04*vsc5jQq8?#)Wl-f$Ys;RV${WF)5K!g%WBHH zU(&;6$+}wE%W2!qZq~?a*U4(oz+l9&P06-R$FxkvvP;IZOUATM&AU{fluDnIOQV-d zrkqfnkV&VVQKFSjqn1nE(01O@dEU@<-q3g8(|P09eB;=C)y8LDS1w*xEZE6u$GBBy zUND4wLe|GBKI(HXaR9?@I3^7)_e&V z0~hgLvEj!>K79Q*Av0a}IYG;ji2at?;18^)!15yy|L zE~;F%s+tTIHKriA?;7pd0jFA~{5B~87c&~ODFyu2P66H{ z+x^%80cfu%)-up52p<96`qos}CIM`__ybG2`A)Pg9^?biFdG4I0Rh54y+pW4ze2Yu zAprpadI7;e0lq^4z5mJucK!Ya0fGSmyGD-z0<2Hpp}V0gF^uuQ`a#(f|Me07*qo IM6N<$f*ucQ(EtDd literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_hive_side.png b/mods/xdecor/textures/xdecor_hive_side.png new file mode 100644 index 0000000000000000000000000000000000000000..7fd26ad725d9af6ff69787a237c93986a4a684e8 GIT binary patch literal 720 zcmV;>0x$iEP)?nbra{HCPQtEB$hAz!wNSyVNxiB` zz^qEjxKPBfO2e;8vYb7mk1~92GO3V)r-_v*A(s||Df!@$|;M04*vsc5jQq8?#)Wl-f$Ys;RV${WF)5K!g%WBHH zU(&;6$+}wE%W2!qZq~?a*U4(oz+l9&P06-R$FxkvvP;IZOUATM&AU{fluDnIOQV-d zrkqfnkV&VVQKFSjqn1nE(01O@dEU@<-q3g8(|P09eB;=C)y8Mk#AMjXX~(!#&c9;T z$7rRKGsCY;!LCZ3i7|zGHjjcmoR3MQm{6pcOr4QRq?u8qnp2gEL4tNQz_VDsuvOd7 zcHGZ*;?{fL(s$w2eZjU{v7bS+qei-^Pu9n4$F^O@w^XW`K(e7ib2nB90002Gz}Ah_=u?fXH)q5cGP0E_=s0o~14saOH0TBiIqDFGKV8nY<{{MIZY-y+=o*Z=`% zuqf6t&?^WY;{E#8QrRT|YQ6XaNxb@%2$^~@&{ssYn0Rg>4kpTj2yVf?yasdIFU)05C)5B)bzhKqIX3@Z4(!yoWzhcL; zOT@29#j#DuwM)UPNWra2&c9*O!)4dVWz)oFv!h6}qfD%uM5&lWteZx)rcAJ&M#HX1 z%DP|M&2GP|Nw=s^;njED&vxS0c;3);+s}2|&2z-DOtPX%)5K!Tx>LNUN3o$w)5Bua z#A3;|Ot7Fv%D7P3%4*rmX|tqF$+l3gokiHna^TW+-qCo%u1LhNOtPUz+|PAiSuI{x zE8^FCv7koCwNI{{M#i#AYGN^aaXIDLfZfk@-OzR5(s#Y1YVR$F^PduQQbZ008w#L_t&- z83n=3N&-Ou!14LdI6JHBsv(%mb}@o3qKC{&&k%Iz5qiI%cL)+X7*>ZqlqDfNENC zpUX~mFl|a<&^i9_H&BkTB*-tA!Qt7BG$6;+)5S4_BRV-jfzN=8%R$2Fl#&2r=+Y8) z0cQ&j-a`VxUd=|AE}cHe^Ziqi_=Y4gaSmSz28KtH?1g5VKc5B~z~JfX=d#Wzp$Pzi C%P)HX literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_iron_lightbox.png b/mods/xdecor/textures/xdecor_iron_lightbox.png new file mode 100644 index 0000000000000000000000000000000000000000..45146f9375e747fd3071b8618c59acc73d9026db GIT binary patch literal 301 zcmV+|0n+}7P)z|CAp8ygL81H8nLg|A;LArY8T;ME{&6|7;H|EG+-4F8{DH|HVT8#W(+Q z9X&lg|L;`(|8V~Qk^f}||BM;`lqTeVx-r2a0c3u=%aTd zZGl#2GA3vG5fIcy+;`BbBS5OdM$)LrP@K(UQcD-3;t2OXIuX2$R*>6d;0$z<7g@L6 zSNapk90|zI9|T&C=cl|w%USm0WAGGz>%t7j>B%CP$+TNtPi(njkAxF2`mDd z)8^^o7$PCbdN45Wj)4e^!MVvv%6~PB{x^%={F>#}rm}qZ{53Y4ABm+FOsbzf)$8oW z-zRr0TU@llI=j5Y$M>n_YVDAvFN}}6l$^NxQFeKj-?E!KHz}|_x78P3EO{us*y35p zD#`5=nhVzdtmJg#6_5lSiFUAEAlK5X;GZ1$C2nGJ|&06_!djB_Q9TlzzrhV%QGZq91NM2 z6FDs_=fHuKoSd9pJ46m`&@h|NkP@+NnQHUWL*2gJjy$U3({ug29AcZACUL7Oi!w}* Wm0Ymn+qZKdH+Z`GxvXqnfKe}xSTc=OF^W(yjaW66Ts3Y+CxlTij8iX+kIG;ZM{%{#5 zX%;ZxiYuk^e8D+aIY6#3SmZhW#1a%)6v~W&(pqz4jDAGNJ&)o?O)(Y}6oD-Lia~Cy zt&MH$6FTL2swOyp{!fh&NUjb%N&AkmG%fz#D)l> zw8Um7BE({#AZ&}l_i+TQu5nE;+S?Uo%^DYnb}YIW+4$ypTW@yT{d%+8<8ko)ZnNHR zcbj_qyy4)FewI}Rz@bHr4?I%kyE3&?_k38k$)AyM;A zYyiae-k>{KtCfIcgdrq0gz2WSM|7lV)99l`ccOFi%BZZOj(zY2NzX}m3~+CxIAs_t z_(uU@mUOeyi!g|WdFi3=!*rOHeyrj#j%TGWSBamEv(lG|9K&o@`Yx&hznqo6TlH-@ zFMT4@qMesMkg|_gv(iU?nhou&^l2u8)Ss0;h(~{n+2_~)r2qOX!cxeToyA354PT54 zoX_a!{g~_`&Z{6A!Dqtzrl$w(aDX3rW`5vsn0^3!dt&HCn&J)loi5zH=lOi^I$gJ4 dXsbeI;xC4RU6SU@n=k+X002ovPDHLkV1l9^XjcFL literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_japanese_door_inv.png b/mods/xdecor/textures/xdecor_japanese_door_inv.png new file mode 100644 index 0000000000000000000000000000000000000000..4d3ec649712d84415586f426f42d3e38d551c89e GIT binary patch literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa3-AeX1=7ud`is--`@@X$+|(27 zWg^WaZ{NOM~E*H>SbXsPz7U2kY6x^!?PP{Ku)=*i(`n!#N-4Z5J_lYV06=9 zRy(AT!jagyLqoEOm8FqEhb4q-qEHftL5o2|V$X&Ujm2w34<&@?w`s6tvKy-`WHa(O zH|Nm_22-gt?bLUPsRv%p>ni!Rvt3lq&fxoogLf}mF}zFUXxP=xD`&?U;O4?~^CK%m Y=wpTB>y~`<0Xl)f)78&qol`;+0Q{m$Bme*a literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_lantern_inv.png b/mods/xdecor/textures/xdecor_lantern_inv.png new file mode 100644 index 0000000000000000000000000000000000000000..71cef66d43c3ce58f6e3a338f4bf5a9eb0785c79 GIT binary patch literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa3-AeX1=1QS3gy}U^ZK$Q}_b#))o!+XKg}p!(j3q&S!3+-1ZlnP@{+=$5Aso@k2|yr{(7?dxropUs zNF#+Kv2%xpWD_e(BZCf02-ifRBn}2|LynDyBobE!xJ7EW99$8{6UcLkFU`Y=H)X;c g%cFve*m4XQb{B9&TECyt4>X#=)78&qol`;+0NTtp)c^nh literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_lever_off.png b/mods/xdecor/textures/xdecor_lever_off.png new file mode 100644 index 0000000000000000000000000000000000000000..6d8bb493ff20cbbef6e7e0f4f543c60c5379503a GIT binary patch literal 300 zcmV+{0n`48P))jEs?ad40KoSE_SOmt#DkXhCglaZgWEs;a8V$;p+K znpRd?ZDn_WfQ3v;M1%0|P_ig36j4GpcU zR;}9E7{035cY3nT!VJf)e`+;=CNq`<`2{mLJiCzw`<6rr{>g8HI9d q7kYhF_S^RYnnFz)UP|ruKbaCsY+Gzv_!)sNV(@hJb6Mw<&;$S`-E>j_ literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_mailbox.png b/mods/xdecor/textures/xdecor_mailbox.png new file mode 100644 index 0000000000000000000000000000000000000000..82898840a7d1fed16d85c9a02333fb126549357f GIT binary patch literal 196 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa3-AeXy%b=x%0^>}x#~VQqu0}V ziq(~MbaWbZR31M#w{Pd{+L}~epvpu~7sn6|S=ZACIU5XkS|4tAT6M5kfW3faA@`Di zI}6JB`7SP&o*gbAUvu`U{s-SlJ&8=;OcT!iRLIC~UCez{fTZ_@Uv9-w6mp00i_>zopr0I@eoga7~l literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_mailbox_bottom.png b/mods/xdecor/textures/xdecor_mailbox_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..b613863aa7d9e9be30a5b269ecf967795f9d750a GIT binary patch literal 116 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!D3?x-;bCrM;TYyi9Ym1U(osy*X1BFvS5lv4Q z#}E!#)`O0M3}x$4>O!kbGw zkCewg zNh+R;8V)!}h&V2M^m6s?r9al09$o(aZZ*sGIl8ZQR_immCMbx6FeGWT{W)j(e9nLF Y;yeK+!IR89K(iS!kpjlL59Ymkc%oMKnEK z978x{Sr0l2GAM8`YkdT6mim0flo12?dFQ*>>005gwL_t&- z83n;HP6JU81;Osww|p5(gw8>opj|L>&PEmGbpku-U3Ae|N2dWudy{eM`-YzSl?nhNxZ9u4gVz*AqB!f1a&ExJV{x$GG}>Ktnpv`3DQ1KlJ6O R+JOK7002ovPDHLkV1lKUq-OvC literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_multishelf.png b/mods/xdecor/textures/xdecor_multishelf.png new file mode 100644 index 0000000000000000000000000000000000000000..0a5e10e42bc40fd9ad2e82b73c8a1854f647296b GIT binary patch literal 503 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbMf?Es$;*M%951s>W}{)QEPhK*sy z)01toofV4xRaX`J9-ElDp)z1+WB9(V_!4(b2?1_VK2B*N9w8p~7}GRUdFv||FCN&l zXXBbR3SRA^24QY_3UVSmA3uC}c<eRvAyIpi-s>{o}JEzoEca;>iGzBs1$FOj*GZz*#iScoY^Ks11 zk&kC!SSKTsxKy#fXIhB6)1Wy<-E6EvT^$-KJNl!T=S`d2Uf&b% zq{A;YqXpDDylao`HwKFofFf{aB^xj-$y81eQ<|D0@OSpTpfUaQhboFyt=akR{03&^1 AGynhq literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_painting_2.png b/mods/xdecor/textures/xdecor_painting_2.png new file mode 100644 index 0000000000000000000000000000000000000000..8a9cf4a521c828c52256075eddbcd829e6b1cd40 GIT binary patch literal 378 zcmV-=0fqjFP)SF{*P-mt#D0PbFwWB)NfCepWYwTRYU*($nYO)8yC4+s!juDSwDmT|OP!P#9ah?B@7L+AGt6rAjV z6OsdyBePBya#kr>X_g%$ZjJ_Q?HY<5oq_lhqs0CyZe5-6%P0}wFLh}%e2RN559+)4 z@4Cl5@)YYj*WNq4MUeCI5sWqSF&SsVzO@?*PqJYpyVjyz{WJ@O1CayE>1&WMawLo# Ye;<1*RtFy9=>Px#07*qoM6N<$g0XRwW&i*H literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_painting_3.png b/mods/xdecor/textures/xdecor_painting_3.png new file mode 100644 index 0000000000000000000000000000000000000000..d094d3d00f8c3365a88684753ba3c2c4b0160758 GIT binary patch literal 365 zcmV-z0h0cSP)SF|2b;mt#D0PbFwWB)NfCepWVvTRYOy($>Abs;a5Z#=X0`y|%8T#QMfEmbEegL;B=NGgD4N1AC) zZ96)CVPTL?KACbvelsziIYEv)Im}f_?*IS*0d!JMQvg8b*k%9#0GdfeK~xwSRl!S6 z!$1%~!S}l7;~*jsNUX#CZ-m&xK1SdqV}sbaNia!pQLpPkk#mC=L&I00000 LNkvXXu0mjf!^oYG literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_painting_4.png b/mods/xdecor/textures/xdecor_painting_4.png new file mode 100644 index 0000000000000000000000000000000000000000..5ccb14192930df339414a25bac2105cd04cc8cbc GIT binary patch literal 370 zcmV-&0ge8NP)SF{*P-mt#D0PbFwWB)NfCe^)rTkgBkWpqOlgeNSbGR&j$?bzMFk$gjWAvc|iZ zt$bE+o^z9PRCT3(j-Pgil4^m!qPVl0ven1ir;@N^J5+*keYvW?#lO+1tGlnSyM~RO zbVw?vm!__utzuJNb!v7kNm7THrJt*~Jy~RxrL%aDoK9?cFW?xA00001bW%=J06^y0 zW&i*HkV!;AR2Ugm!7)z5KoCID|7Uh>OA%d43Z!uV>u`azRHVRm)`LRl_Y@Q?j=+NC z#N^EE=*oH*cn$9t*Gxk+mrso)t8DR z_Ld*_cV7UbP;NS@1L`YqS?7(3e;amk(cW}XKg~wtMC8PFyAKjZj)alp4;D=;_vl_p Q*Z=?k07*qoM6N<$g6dVK8~^|S literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_painting_empty.png b/mods/xdecor/textures/xdecor_painting_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..216429a42f6bd36bf6b160ae4e1fcc0589cb74e0 GIT binary patch literal 289 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}V1Q4E>;M1%fy@nHuxS4Lg&B_7 z&I+rFeWxee6#J|0Yz%JIw#S1(>X7i%Yb_ulO%Pai*gbU)2m zy~JI!KHQ?%N4GW3{#nnBdZ3BSB|&~5OMaCdxd)_bJY5_^BqUi6I{GmM3a}oivgLJI zEd8$DEr}zI!)X6nCI$h4sfQgHZ?ECf2*^$o?U=0MzJ9B!`+u|PGs+IVid~$fqqbc3wN*9aRVn%!^m(^b literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_pressure_stone.png b/mods/xdecor/textures/xdecor_pressure_stone.png new file mode 100644 index 0000000000000000000000000000000000000000..faf3ae0eb5a7e06baf73ca77add40cfc67251cc1 GIT binary patch literal 270 zcmV+p0rCEcP);HbZ=MNIlBhH*wLn+DVE}iu{=hXG}QsB_e1lttkM|e@lWz UM@-TF_y7O^07*qoM6N<$f{3qs`~Uy| literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_pressure_wood.png b/mods/xdecor/textures/xdecor_pressure_wood.png new file mode 100644 index 0000000000000000000000000000000000000000..504113a9311de34d5f92f2b1af59e83f20a47563 GIT binary patch literal 543 zcmV+)0^t3LP)ffq zbA?|%a!oGBn`(JVDZGeTu69baeoU!#MzMNLvw={FS2DnkTzOJ6b51bEmS@0?UB{bg zrEx^IgIAzzL9cpJsc}cWiCf8Mo}Q@DXqrfx;Jf>En;NV$Vjbx<(E zlw_i9L!D_qr*lQ5Z$x-gGJ8`r#gt~ObV#~{R>G2HuXjs*R5gZSLD;Q)zKB`5hg-9M zRk3_a%b;tygH&)!Ey|v4h*vSPd`y2&EVhMJfnGn&qjbTMWwd}+y@*`Gl4i!3YJONX zfnGd;T|R$UHjr~pR{_vS00001bW%=J06^y0W&i*Hxk*GpR2WxP$T3R-0RTYZ_c}xZ zPY_%@MKowhF%YNPnj8ZMf1!hm_$%78!6k6&JQ_;4Ls9T@&<3aX_(W961CIuOd*ur7 z7FAL7P{is#Qc=Zc%tF66L=aQO8#;xUItd&j4p`u6 zUD+p;sHJSn7|`6^r(sGGl|g(#mk%r3t2bV literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_prison_door.png b/mods/xdecor/textures/xdecor_prison_door.png new file mode 100644 index 0000000000000000000000000000000000000000..2f7e66f1f291a29b3c87d25c0fa0e54d9df94ff6 GIT binary patch literal 593 zcmV-X0vNtl-a0004WQchC7tUA<2gzDp^UHA6n%@C6rP-r9kdATYF=+zErfJs^JZ?Nn<4U>nh4b z4eyYxF{a^uEe@0wqqX{&t?9bvsM~BIT0f`*$Qm?6voJb0;wyiu@oZI0N`lw!ym#3N zGOVXf3TB+ark? zO){B;eqH-loG6o}y|PqxUe|M}T!y4WDnT>ZvM`x0Njv9sX=iUtU)rsm>!R#(^-M-H zExx~AqRibq2M!5guD>}_eZn21mGv;@!CZg6hf%3hm?Gm#EQ?^g;e>zXjT*Ayt+ba{ z8rrKlNQ2t;P4i*t(lDAHC%u?J`J-hy+q5BuwFuu}p*zmYfh#DrJNaZ#j}a$=8qHzVIQ7? fj`p8F66RE2=IbCpwVc?N00000NkvXXu0mjfDM1ke literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_prison_door_inv.png b/mods/xdecor/textures/xdecor_prison_door_inv.png new file mode 100644 index 0000000000000000000000000000000000000000..0751caf1ded75290470c45fb2de131e0dfe2dde7 GIT binary patch literal 243 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!O@L2`E0Es2dGmq=3novVoRyVT zTwI))kr5jkyKmn<2L}gZW8-`G?sa!}x3;#{*Vk{@uwmJf+eE6{4gqv+Z z{fs3+e!&b5&u*jvIjNp5jv*3~tOp&r4h4v?Y&f$yXobi7dY|wtdn2_*7pXrt6oe

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/mods/xdecor/textures/xdecor_radio_front.png b/mods/xdecor/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/mods/xdecor/textures/xdecor_radio_side.png b/mods/xdecor/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/mods/xdecor/textures/xdecor_radio_top.png b/mods/xdecor/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/mods/xdecor/textures/xdecor_rooster.png b/mods/xdecor/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^GBDK^TF5hXZh)JikJlyPQx_U$GY1RvY(Fh@Dq^F6 d+EqRkhEp+IH!b6Taso|b@O1TaS?83{1OQGmJ!Sv^ literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_rope_inv.png b/mods/xdecor/textures/xdecor_rope_inv.png new file mode 100644 index 0000000000000000000000000000000000000000..51a24a89714ae118d9640247d30b8b658edd4c56 GIT binary patch literal 187 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^4e$wZ1=2IC5?fNdH+E*8om>83 zb8l~E;L6{8CUTD420&T2Wb9tHg{Y eDpL+LFfgzz;pE@)YyD}U`3#<}elF{r5}E+#T02t! literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_rope_wield.png b/mods/xdecor/textures/xdecor_rope_wield.png new file mode 100644 index 0000000000000000000000000000000000000000..3ca8fef3143aaef1e7502362959eca2984545004 GIT binary patch literal 197 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa2=EDU{r~^}gU!7&s}fsMyf=1c zo}F6`)&j_j@^o4|Ij>eiJ;j`7~U-=1W3xlVtpUXO@geCx2q(;X8 literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_rose_pot.png b/mods/xdecor/textures/xdecor_rose_pot.png new file mode 100644 index 0000000000000000000000000000000000000000..12923acf2985b82a5a5b803dbb145ce9dd66cab1 GIT binary patch literal 339 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}et=Ji>;M1%H<_6wTIu>5Xk3np zN?R(sLtGpv6521@x>0rs1B1^b*!wl#|S`)NxmnNj1?+GS`eW*7DJmZ@xQO31~G- zNsu4N2@IPjr_BOV{hlt4Arg|T2QLO5b`W4S*t>W0V+Y2X3-yU-9C#Iv>~m!TDpFuP zX1cCY>7Y&S%PJ>F*|hVC?nz~5|JB-`pC$KdL;mJv&m~q#UjK2sxAgq9l-|{DcVBa-D)e(Gc2fI#x=ohWlg_f e^4VInmSA&t;ucLK6T?SbCxW literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_rusty_bar.png b/mods/xdecor/textures/xdecor_rusty_bar.png new file mode 100644 index 0000000000000000000000000000000000000000..d2d5866937c01a91cebaf31aecd7df6af1b46674 GIT binary patch literal 194 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa2=EDU{r~@eoSt5Yme!jrBtn0scZTr3czapMVIz1hm432G@6>cw_y3R}Y;mdKI;Vst0A{yC>Hq)$ literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_rusty_prison_door.png b/mods/xdecor/textures/xdecor_rusty_prison_door.png new file mode 100644 index 0000000000000000000000000000000000000000..3b1dd1a5fd1c5281dd9cb8067ad929fb05b9ae8b GIT binary patch literal 749 zcmV_i&sI3Q#^`QK7dU)R4OW7E-qIrEPhNjdrUZlQapxIK3Xj;MkXeNPC0^3 zH&QApkz+uAP&+puASN0bG9Mp-Qao%kGe{;T6%`c{5)y?}J$gtqeNH+N5DS+*h6hs#ZyY^RX-XyLcmMx??=VcI@7O|LqQSOj0^`ULx39nU3C=Kz z6CnT((qG`mLz*4}DG!)sc_B*R3jV-mn5GzN#jB)9um+~!FKpJNX%lM2FcERBowuVr zEe7(`oX^ck!bu(%QyeQ%w+N^}!qYmq^!>%%wkd_R`@}JA>K80yKMegQXc;Rq6JKw@ z{2cfZ;XVv^ciX4fC`_Bs+30_(UGDcws1?^nlx0MlcI1bw0}3J3ie)x0TJH_kvpAck z^~vw6xG+`=Ly>MrMtIEgWAU?0DNJHBW+R1wdt`6({I*B#eqdFi+tP0;gJshcEOQCr zwJx&Qz`5_`o`6T1KK5+LzCW8>*CWFF$FNmFE;Zft@bP|YZL16DKZg)FM@S%t&%V~x zEw}LHyzRt&r|I`joAdT%uB90hSH+MoHcc$lLvQn_9^)r(up&0k>k}-z-6GUlzkno{ z^afg?t|KAxJ#Ri+%``PHyzx?7>#$@2A+VGl0zz2TCRkbE5E8M1v})i~gS>otTM6-4 zZiJAx$ke(u`!XO09&%iZMa$~8LOZ%hj~!5Fb<|wcGSpKYwH0(nh1bfCRrHGxAHpv} zY<{J7Ui*}MQt8Rh)~8HV1-9ZPZ~qZOd9ykxT?jvp1lXt`LY{&qf0!5(<3L*9Nb>cK fv}zPprLp)2KqD~1s3JFh00000NkvXXu0mjfg10^2 literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_rusty_prison_door_inv.png b/mods/xdecor/textures/xdecor_rusty_prison_door_inv.png new file mode 100644 index 0000000000000000000000000000000000000000..486486b25e1eb74182a7a816a67a12e5b391a430 GIT binary patch literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!Wq?nJE0A8%5<4l?p*g@hSW7ET zPtR3Vb<5NeBVAn;6_qA|oS3 zMOtz{J2`d;h?qR+Zem#QK*B+}K+W^`UWVr{3uZ90p5K)Fb3uaJk=n%%m{?eaHv|-z gRyZdtxxAv?zNtpWUDoLHL!f;Op00i_>zopr0DH$x@&Et; literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_screen_door.png b/mods/xdecor/textures/xdecor_screen_door.png new file mode 100644 index 0000000000000000000000000000000000000000..a00ebb3bf6c917f017f1b4941d53fe22c5b3e11b GIT binary patch literal 803 zcmV+;1Kj+HP)oO5G$SWAa}d3kVcOE@reRY+b%J2W&jT2xVNWMM5WEpk&vDk&*5dG65TW{fTY6Zi^3} zp(O}oqE>)G*$&~CX{qb`ZhD1)9RsdhJwS`w?7Yjfec$i%lpqTn3`7T0ZZA2i-|qKY zpJTqH+_Vf)O7!OEgt1aAAx);DJa7pBVIXgQ-euS0xVG~?kKU9UAULel<^UAza6BH; zWP&UR0EPajQi~xh;TmFWZYA>coOgG}AvdBo(upNS&~lOz^VpbYx0WxCj9CC17slDW?)j z8!8820*U;3yWua5Z=(MDHUn4GTkTp&M`qr1yuvm;YznM hg#Uh#pvI4b{sZ03JASX&8Cw7V002ovPDHLkV1mYRVlV&z literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_screen_door_inv.png b/mods/xdecor/textures/xdecor_screen_door_inv.png new file mode 100644 index 0000000000000000000000000000000000000000..6c9633e1a8bdff055b50360ba1f57b24ba6b9b42 GIT binary patch literal 257 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!eSlAhE0A8-kUO_Hc|ulnhL2NW zuzON;gsr8;uFkTYltc#y2NM&M0Dpg7UEPk9u;#?z+8F=E73nc9Rx7Hr_V-q@GzlpH zjbJPZ@(X5gcy=QV$SLr2aSV}=)IG>3)~vwea*#j8bHcVo-~Oeq{g&G1zH;l;GUd?A z^Cxy$^|gD1@~~~3IBQPhag|WR0;eTv$6qR55|LH!`BGK?ZR>i~OH+(r9Q8OWVR77Z z*OfvWv!Kbk#@(K~LgW&cq<#D$buwksZO%Uo?X1kEUklb+0_|q-boFyt=akR{0CV$O AT>t<8 literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_slide_door.png b/mods/xdecor/textures/xdecor_slide_door.png new file mode 100644 index 0000000000000000000000000000000000000000..1810ccddebfe4fc0842c1d75d9154b41b751cedf GIT binary patch literal 700 zcmV;t0z>_YP)IzBvLjaRX8I%C>Jmx5G@=JF&`6AGay_$C08~fPBS3P&B@8i z#>K|My6r&j3`o$kH@jq2v^8kCw`52`GiD)|pi2zr09Gl~ zpxCP+leclc8kR6rX-#2{97X_*T!_Wn#-w@+i>lp@bO2{l7@s=*McoU!;a`E>55&n%ge7u_| zDCS*KrJr97-qNfs?ANEc_7bs7h_QCZy8|h&rFrXzUJU$iywzKaSL%T(UGXlab8gjS z#Vgdkc-wjU3dHZU4G5i43Ks2Z(N6DbYa^mmeHkPlnu#NC`?Q7PO>$63x&3#@uM(-! zOn8HDChm4?rp*TvW!6&i(k#~?DJ5*Ry3#C_GveI(2FX(Cs-xC}?5U^U<94+~N~yu& z-1x2KAnwQ}>q3KMni?Fz*-0h@pxkahzmLb`m)3&>0Fvv8gr8d)^Z-b$PtQ~r06bxu iXaiVOPf}`?lKunCI8|zg1p@W}0000TRm?^^dcTbtY<5N9- zTpJ!~%NpO}Z;*(dS6-sSklo*qW&U!-3x!(_$qG9TFff>?sLgNJ>E8{sfx*+&&t;uc GLK6V}yGZQ- literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_speaker_back.png b/mods/xdecor/textures/xdecor_speaker_back.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/mods/xdecor/textures/xdecor_speaker_front.png b/mods/xdecor/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/mods/xdecor/textures/xdecor_speaker_side.png b/mods/xdecor/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/mods/xdecor/textures/xdecor_speaker_top.png b/mods/xdecor/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/mods/xdecor/textures/xdecor_stone_rune.png b/mods/xdecor/textures/xdecor_stone_rune.png new file mode 100644 index 0000000000000000000000000000000000000000..319a2df6b372cdd7fd30bac868f353c791e01803 GIT binary patch literal 265 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHF4e$wZjg5%#a`g)I59;actgWeO zZ*Q-wtxZl&&dkhAPfw4Jj}HwE_4e`(4hqiB&bEzs%?{K!-P6S}ghMttK_o~-C_zXl zL7Qd`&6yH6xO|M(1aUS8s5Xw;$Cb;&Y# z0jr3nhkfO=T zwopib0L#qFadG!9?#mKxes*TAu-cn@XOAqT5RaI3rH#aX|zP!4+ zx~He7udmO+BkBdv%vqi;jv*3~vVPoRhZQ&$r(Sjv+`8`V-~3$+{uBI#6mD&+ZO?b9 zcKcW39p!4HHCg1UvCq{rQ6_iJTs8e2n-S8R<#+sYcPICRY02g9FLrp|nxidX|HAdS ztf#c%tmvj?b^QXY;uE$`^AB*dJmAZ9h_{!y+$Fcz?!B@~==CoRM_%1Y^7v8{ADqGP qaZB0OYtj1?En;V+a&XtleXuvM=enV`Dp&~UN(N6?KbLh*2~7Yyw01xM literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_tatami.png b/mods/xdecor/textures/xdecor_tatami.png new file mode 100644 index 0000000000000000000000000000000000000000..e1998f7a846d224cd55b7371800a45ae51f0aefa GIT binary patch literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^4e$wZ^|aO2l#(#lRCs-U($Cwo z&u?qEbEwn2!*?@Kfw`xPV+codazctoQb9+T+VxMI%_xl>jpf7hJ-cEsMj spTps1VcyzX+m#yx53m=zocvxsLyxyyYP;mla*$mNp00i_>zopr0Qu)J1ONa4 literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_television_front_animated.png b/mods/xdecor/textures/xdecor_television_front_animated.png new file mode 100644 index 0000000000000000000000000000000000000000..ae5df4ff736c9b1addba6e5bdf76a0b656624def GIT binary patch literal 1715 zcmV;k22A;hP)M|N6)O|L)6s zNPVqe^3WGEi`|KaBg-`R8u=bOJ-SCKSVx8NkUXdQ)+yZgOI70jGdgDv%ka4vAoicnzeI> ztAT==uClz(#LcjL@9g=#S|V^3a`c#EG_QKeyFv2J&HHZ({pHh^k( zZdGQHU1WemJcv$CeOh8lIz(SaP+TA#X(1qz=ygs=wZouiT2K(@9bvP+uExdqOWX89YN7*XjP4rhw_~@oI22 zgpxOunOUr#VODA!iJU1qL{udJ00bXNL_t(YOSP13Xx3F2#(&p2=l_5HdwYDgoav)( zZ7C}iM^q9+ElfA5>;-%MC`gtd;n#wQBq)ifPZkU@aGyemT9{eJAW_N=|Q zrE_y`d;Tw{4_jkGAKP`l-S>6w>pmCvxrLYy@1)s?K%_Wi5gsEkjZF+W1wjx9@2LbF zDH`gTQ0( z)(D3Q@kld`futgSuKj+mTb}|3KYIYr3TV(RXmG5&^@{$(kNK1mQiDL=2%mxf(-BDE zF`DVl5ebn2SOE^_!Pv}_8bgM|iPR<`Sj9LTX&}WUKrSG|5cw>&IAN1428R+Vplm`Y zlf!^>Wnw9wgh)urzquWDcR@Hu7*~CeMv@`*`-9a|(Pr5-#x05`=SMV6!3@w-+9lt>Hl1ZSb zk1%X(GR8!;#qsgweP$1a#(_tHp`n%*vl4I=;!8W|4X4lfd*wr{2I|w%YpZSyH|HmF zkvVI4;%fCOrqwv!Uw>6#7;WvdcaBPV*T6h3=8GQ+MOUyW!pNT56A0PAUYHS zD@tZ|wOEFaEhzz3!{^q^8b02z=6vzOqA_VrmSwOTP}jMJlJww}U57I=9NE$y;qdai zIAY7&s|ugoccmolPa7oftu#U0Su)gzqrGnif0Qiwm=cD3-Lfdp=T4UTdXV(iXqjJI zf<}wqs|A~nL-S%UA$@4(ak4!Q>pfZ-2lvc({f)W!b4s|1I1s{390yrd%juTA^({?^Xj99S?v z-Z{|$Z~{7-o<%y?EO~FdMH#Le-}s&l&;2j+@ekYgpiWpcIHv#r002ov JPDHLkV1oKmM0EfF literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_television_left.png b/mods/xdecor/textures/xdecor_television_left.png new file mode 100644 index 0000000000000000000000000000000000000000..65444fb83dacce485c86697872cb694a18a572ac GIT binary patch literal 92 zcmeAS@N?(olHy`uVBq!ia0vp^0wBx*Bp9q_EZ7UAls#P>LnJOIha@<#>hP@b*mHl) o{+Sm<40uu-@4wjh_pe|m14GD6R&7~r7h8}vPgg&ebxsLQ0OUv+PXGV_ literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_trampoline.png b/mods/xdecor/textures/xdecor_trampoline.png new file mode 100644 index 0000000000000000000000000000000000000000..a8536c2185d9f452afac58d4df7548d4142cf0f0 GIT binary patch literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^0wBx*Bp9q_EZ7UAm`Z~Df*C||JSAO$ymU_&#}J9| z(Bp<&Ook$^7jJVoS0r-S`}{ByOM2??Ey31$hU*TN?RhKTm$aWbBPh5!+qosa<*(i${gnNpCcpp8WxcsxJcT_)USVphef%O9 VnOR{y;m#n3c)I$ztaD0e0sz)}J@^0s literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_trampoline_sides.png b/mods/xdecor/textures/xdecor_trampoline_sides.png new file mode 100644 index 0000000000000000000000000000000000000000..497a86a59329a5f820cfc3cfd1ad02cfefcdf8e7 GIT binary patch literal 288 zcmV+*0pI?KP)nX}UDg zG}D0xHdD9z5(cISAutWaFs0(jsX7gj{x}t1hRY=lmnog96g&&fi(S)o>0vk>5^-v} zhv{9hJ6wj-#85>F(}&-7>DvIC)TA!D3sq<~>D%sII;1p|lAFg}MyMc7Q|g*nI)OCI zm407oyY63d6zAU+-!Dy#Oo5g mc}}LTi+@S~v+%lhNPhvIse{mOg#=pw0000;M1%&&4qKOp*=lmrbwX9obSP sW7j)RY7+{VG90T~Ew$+Qz2>T``X66A+--CD@E+u1Pgg&ebxsLQ02JqkegFUf literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_viola_pot.png b/mods/xdecor/textures/xdecor_viola_pot.png new file mode 100644 index 0000000000000000000000000000000000000000..7549c4ce8c98e7ee25ff3017203b955f38fd9dee GIT binary patch literal 333 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}W`IwK>;M1%eJ06HPhT8v9~;^) zn`ou$Z=eC>rY)6?F-|fyF6OqV7Lf^M-;fp4<8L!9 z)TzkcpvujBSyVuXzM7?+WQL`VyP8a@iC&VqW~8x}kEVQnXO2G5QudM{Kak}h5SsET z0!a0Ex;TbNNKQRy=*Ju=;BxT#<59P#=2=;Znam9^*FSMwWuSlQQ7JJs6ui|*Ro^veA@)umImu0MSvN$ym% z#l^@4|6WvOEfD2u|Fm(Q>_Y=P&Wt{jaw+{s{`=Jx-(7JKsM;JH@^0#nQ2QDKopoHt Rey#(#&(qb@APDw z&6WOzUb@Q)Jc|8Q8^esVofS&lHFq|KcPBcU-mbg^)K%l@;uyjq%X?-c?;!&Qmy7a8 zbtb4WD^xA1HyLP zQD9zcw=FN@ir(KRR_dQbyV7SY*mmvxvjyjGdIWn&oY72KeEr)ko};m!*FBg$M=icl hWPexwywcZq|CQOOsi-A1zXQ61!PC{xWt~$(695IrT(AHD literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_wood_frame.png b/mods/xdecor/textures/xdecor_wood_frame.png new file mode 100644 index 0000000000000000000000000000000000000000..f528f5ada041a74affdbc74408b044cf7495f695 GIT binary patch literal 271 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!aez;VE07Mil!>#I^EZ+(Rp2*N z;MbAiQxfBL)D*T>6>!rLF7s2b3Dn5YVkk6G21=lFC3 PUB%$(>gTe~DWM4fFj`#4 literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_wood_tile.png b/mods/xdecor/textures/xdecor_wood_tile.png new file mode 100644 index 0000000000000000000000000000000000000000..272df2c41cca0f052fc6222dbc8b94edc9f7c9e9 GIT binary patch literal 364 zcmV-y0h9iTP)yo6e>cut8}GH*vCu6t3tgjuqBQm}SSyMtMjWIb&~A+UH)x`SA{f>?-GF{N=y zs&GkeMIwnxtcvvpe(OM4d7xr< zK2`RIToTyQerb;8b=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 diff --git a/mods/xdecor/textures/xdecor_wooden_lightbox.png b/mods/xdecor/textures/xdecor_wooden_lightbox.png new file mode 100644 index 0000000000000000000000000000000000000000..c5a6b526534bb95b5a858a9142e3f845ebe1317f GIT binary patch literal 262 zcmV+h0r~!kP)Vfp`kookR`17iKQYltA95o^k|Ns9$TO)b^ z0053jL_t&-83nkT_DcnoRdfc`r2-Pzn9%CzF(UvDLz#32WlGx&-ZP1A^-pY M07*qoM6N<$f(-s=o&W#< literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_woodframed_glass.png b/mods/xdecor/textures/xdecor_woodframed_glass.png new file mode 100644 index 0000000000000000000000000000000000000000..9fd6ea8e90f685f82eca6dddd8a616fe9835b2aa GIT binary patch literal 270 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!M}SX=>wyE08^eqjW;jkyw#jx@ zSXJy>?611BF+9~=Zq=&mK-rx;@12+s8EGJ%XQ#BT+{HzW|IC>e2}Y9JntTuUgsiJ| zuvg?Mao4OjtSkna$ygHP7tG-B>_!@pQ{w637$PCbda%*)umKN)!Bxe@+kzu@G5)Xb zdeZUH@c10}p5xDFT%Ngfvv=C-xOHp{r^PcI>Z{F!7EE8A$xywM(Lpbr(P6KRxrfKJ z-3u0;c$%eR^6RaOqx0V%xx5Wey%<(JJvV7<=&f9RLBW1Ocb6maM?Uhan6s#c&Ik<$ P+RxzW>gTe~DWM4fFzjVO literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_woodframed_glass_detail.png b/mods/xdecor/textures/xdecor_woodframed_glass_detail.png new file mode 100644 index 0000000000000000000000000000000000000000..9b5d1413e767938ed97ecf8ade06fbc68e33b602 GIT binary patch literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa4)6(aUA5}^fdh|s?!5Q^|Nk>* zUfj9!4#)*EfFhHPD-D3kSWANZf`K#x!=Y@pjX)~G)5S4_LzeYmpk$K)1KWXk%>&1M z9&l}#t8iZ6AV+rsOLz73+k5R#Z9c!!!8_5Jn=R#2+dQT#lSvQPRFpXC04SvDDwSu==JFppC)xw+n|s@KlW=8RA;iB>a}S~QbZHQe0pkXJRpz~hKdFU-v7 zjaDy}S~reWGn->QSv4R>EgU{37T(_8EgKF=EE=t?t-QRvi;Ig_I3hzR7$zADI3g6O za!a3WM!ADov3*ywfL1^OkDdSk00DGTPE!Ct=GbNc00L4;L_t(IjeSyya-%Q|wLuPt z%TaEVkgzP!`$`K<|NqA-*@SLqw$%(EJ#_0aZrMO$S=_S3#CXMM{7mj9fovmmmN*3PsEHWe@?ENen4?lubw>GFwV1GV;g-s&*z2#)vd8 z+@xe2M5QXGRLv?SvAiYGtd&Bu62KwcrtuElGIo|)kejGiAOoH!O}O{SO%ZayM+xkQ z3$>U`p<7snLDTA@i2TvfCYx3XprS?LL08ZS2>jK*D$`q~4T5L{zK0+{H(f-FGTHvI z0s7vJf`PKFEi1FP)vZQ*4BDV<7~fK2^!70$LePXm7ds!qi1;>BAocc@ zZ8jL*IC2KR-Rf)x#-`2Q%sAwTcHHz);St|(ZFE4~oEbrqt})~rY@4xdi6Isqa)Z|d zZurJw0q_@3l5~KA_{NP8)nIuo5b@3NeXpl%L=T-2%&|acB9dUXrfX6^XSjf0_-28- c&-=Li1XVIdpgq{!>;M1&07*qoM6N<$g8D0ju>b%7 literal 0 HcmV?d00001 diff --git a/mods/xdecor/textures/xdecor_woodglass_door_inv.png b/mods/xdecor/textures/xdecor_woodglass_door_inv.png new file mode 100644 index 0000000000000000000000000000000000000000..e5b329339d01c44f5b96d259a6403ce364132f7c GIT binary patch literal 232 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHF4e$wZ1=1~n`is--`@@X$+|(27 zWg^Wa@7#H}YSr}v2ObCOh?~pt+`D(LySsa3k@t>YZpJ_jj3q&S!3+-1ZlnP@nVv3= zAso@k2?+v5CPHEf3`|oe1eh}mIQJ}UVAWZ4>fnJz3`sNm5;9o5I}J8$Zj?;p5so;} zb9G(bx&+f~J#8sY2bY+`2Z9#8zh~PxW0zYpoM1JDQ!loISG$j0r*1-)T{5I=KcZ+o zZbl!ldP}l=OvILDXFMBfLL7llCu>6;cSt6PRV}f4O|*bk^H?jQ0002GNkla1V|h=mMk`1hqdR^7`UAqN;*JC|1=mJ5cOu zRMp*x4cwe!RUM&N-KsHDRY$T_jT2qF0~$E<5WxOgds1H+46sf`=;@d^Bx(CnCZ&`K zxk11-vZ_DzYb!1}eV+U=#L#ZseG~oSjoWpet*|`JyNQ*2EY8yTbn%(n6)tz!68Z!r#hM7pyc~6iXB83 zi$ib`Mbtv6Z<4?-YPb z2KEXEDFOJ93JGwO@HNMtuK~YvP%`Q#*jD3xunBNfn!PS|-IHpmjkk_Uqo}#+m(s0k z&WEB+LchAOZv1ffBg)h7oYb$@x>?q12W4ha68cWf{JogOpH!B ia%Q4R^ZVmV;Wz*{=250#cssfP0000EMEz>Zw7dQHHMUB{bgr*cNDbV;;;RHSc1uX#|aa!9?2TgjSexPw!?g;TYDPpEK4 zwSP~lbw{>j9#H^LZ@>@q;Ev8cub~lMXhy7#gk;e zjbFfxV5x6E#FApAZ$-Y1Ua@*gmR&TSWH_8*IGkfQw}4Z@j$pKVOtX4S#gk*Oc}%2e zJi?G+sdPrCaYn6oOQ38)z>Z*`WICf~JE3JdonbhycT2vAS;drQvVBspdP~coYqWq; zh*vSPd`y2&EVhMJwuD!~k!7@iR=tQ^uX<9#l4i!3YWd#v`~Uy|;Ymb6R2Ufr!NE(y zU;u~V-}?=f*w!MpMoA%cNT?3p#0t6u;USM*`X9q{T{Ealw{-~u4>l+^u`!%(>v<4> zphi$M3pM}*tQ*t-0RWW@Py=)TGG`|3Ri?5;mt>n?L+L|i13iFDk~7r-iRhC2ok6|u zAn~j@J#atW@I(7fZ5H+$omTtXb&+7z