From 5bcb0207d83930b74fc1bd523f964a6b25f6ea19 Mon Sep 17 00:00:00 2001 From: Joachim Stolberg Date: Mon, 3 Jan 2022 12:04:16 +0100 Subject: [PATCH] built on 03/01/2022 12:04:16 --- .../.github/workflows/luacheck.yml | 13 + basic_materials/.luacheckrc | 30 + basic_materials/LICENSE | 600 ++++++++++++ basic_materials/electrical-electronic.lua | 86 ++ basic_materials/init.lua | 15 + basic_materials/locale/basic_materials.de.tr | 33 + basic_materials/locale/basic_materials.fr.tr | 33 + basic_materials/locale/basic_materials.it.tr | 34 + basic_materials/locale/basic_materials.ru.tr | 33 + basic_materials/metals.lua | 300 ++++++ basic_materials/misc.lua | 126 +++ basic_materials/mod.conf | 4 + .../models/basic_materials_chains.obj | 881 ++++++++++++++++++ basic_materials/plastics.lua | 56 ++ .../textures/basic_materials_brass_block.png | Bin 0 -> 272 bytes .../textures/basic_materials_brass_ingot.png | Bin 0 -> 223 bytes .../textures/basic_materials_cement_block.png | Bin 0 -> 243 bytes .../textures/basic_materials_chain_brass.png | Bin 0 -> 344 bytes .../basic_materials_chain_brass_inv.png | Bin 0 -> 1886 bytes .../textures/basic_materials_chain_steel.png | Bin 0 -> 386 bytes .../basic_materials_chain_steel_inv.png | Bin 0 -> 1730 bytes .../basic_materials_chainlink_brass.png | Bin 0 -> 178 bytes .../basic_materials_chainlink_steel.png | Bin 0 -> 175 bytes .../basic_materials_concrete_block.png | Bin 0 -> 252 bytes .../textures/basic_materials_copper_strip.png | Bin 0 -> 326 bytes .../textures/basic_materials_copper_wire.png | Bin 0 -> 306 bytes .../textures/basic_materials_empty_spool.png | Bin 0 -> 214 bytes .../basic_materials_energy_crystal.png | Bin 0 -> 817 bytes .../textures/basic_materials_gear_steel.png | Bin 0 -> 5845 bytes .../textures/basic_materials_gold_wire.png | Bin 0 -> 286 bytes .../basic_materials_heating_element.png | Bin 0 -> 369 bytes .../textures/basic_materials_ic.png | Bin 0 -> 293 bytes .../textures/basic_materials_motor.png | Bin 0 -> 247 bytes .../textures/basic_materials_oil_extract.png | Bin 0 -> 1966 bytes .../textures/basic_materials_padlock.png | Bin 0 -> 215 bytes .../textures/basic_materials_paraffin.png | Bin 0 -> 345 bytes .../basic_materials_plastic_sheet.png | Bin 0 -> 293 bytes .../basic_materials_plastic_strip.png | Bin 0 -> 160 bytes .../textures/basic_materials_silicon.png | Bin 0 -> 769 bytes .../textures/basic_materials_silver_wire.png | Bin 0 -> 251 bytes .../textures/basic_materials_steel_bar.png | Bin 0 -> 311 bytes .../textures/basic_materials_steel_strip.png | Bin 0 -> 326 bytes .../textures/basic_materials_steel_wire.png | Bin 0 -> 284 bytes .../basic_materials_terracotta_base.png | Bin 0 -> 775 bytes .../textures/basic_materials_wet_cement.png | Bin 0 -> 366 bytes ta4_addons/README.md | 45 +- ta4_addons/generate_pixels.py | 20 + ta4_addons/init.lua | 6 +- ta4_addons/manual_DE.lua | 15 + ta4_addons/manual_DE.md | 16 +- ta4_addons/manual_EN.lua | 15 + ta4_addons/manual_EN.md | 16 +- ta4_addons/matrix_screen/main.lua | 462 +++++++++ ta4_addons/textures/px.png | Bin 0 -> 82 bytes ta4_addons/textures/px1.png | Bin 0 -> 69 bytes ta4_addons/textures/px10.png | Bin 0 -> 69 bytes ta4_addons/textures/px11.png | Bin 0 -> 69 bytes ta4_addons/textures/px12.png | Bin 0 -> 69 bytes ta4_addons/textures/px13.png | Bin 0 -> 69 bytes ta4_addons/textures/px14.png | Bin 0 -> 69 bytes ta4_addons/textures/px15.png | Bin 0 -> 69 bytes ta4_addons/textures/px16.png | Bin 0 -> 69 bytes ta4_addons/textures/px17.png | Bin 0 -> 69 bytes ta4_addons/textures/px18.png | Bin 0 -> 69 bytes ta4_addons/textures/px19.png | Bin 0 -> 69 bytes ta4_addons/textures/px2.png | Bin 0 -> 69 bytes ta4_addons/textures/px20.png | Bin 0 -> 69 bytes ta4_addons/textures/px21.png | Bin 0 -> 69 bytes ta4_addons/textures/px22.png | Bin 0 -> 69 bytes ta4_addons/textures/px23.png | Bin 0 -> 69 bytes ta4_addons/textures/px24.png | Bin 0 -> 69 bytes ta4_addons/textures/px25.png | Bin 0 -> 69 bytes ta4_addons/textures/px26.png | Bin 0 -> 69 bytes ta4_addons/textures/px27.png | Bin 0 -> 69 bytes ta4_addons/textures/px28.png | Bin 0 -> 69 bytes ta4_addons/textures/px29.png | Bin 0 -> 69 bytes ta4_addons/textures/px3.png | Bin 0 -> 69 bytes ta4_addons/textures/px30.png | Bin 0 -> 69 bytes ta4_addons/textures/px31.png | Bin 0 -> 69 bytes ta4_addons/textures/px32.png | Bin 0 -> 69 bytes ta4_addons/textures/px33.png | Bin 0 -> 69 bytes ta4_addons/textures/px34.png | Bin 0 -> 69 bytes ta4_addons/textures/px35.png | Bin 0 -> 69 bytes ta4_addons/textures/px36.png | Bin 0 -> 69 bytes ta4_addons/textures/px37.png | Bin 0 -> 69 bytes ta4_addons/textures/px38.png | Bin 0 -> 69 bytes ta4_addons/textures/px39.png | Bin 0 -> 69 bytes ta4_addons/textures/px4.png | Bin 0 -> 69 bytes ta4_addons/textures/px40.png | Bin 0 -> 69 bytes ta4_addons/textures/px41.png | Bin 0 -> 69 bytes ta4_addons/textures/px42.png | Bin 0 -> 69 bytes ta4_addons/textures/px43.png | Bin 0 -> 69 bytes ta4_addons/textures/px44.png | Bin 0 -> 69 bytes ta4_addons/textures/px45.png | Bin 0 -> 69 bytes ta4_addons/textures/px46.png | Bin 0 -> 69 bytes ta4_addons/textures/px47.png | Bin 0 -> 69 bytes ta4_addons/textures/px48.png | Bin 0 -> 69 bytes ta4_addons/textures/px49.png | Bin 0 -> 69 bytes ta4_addons/textures/px5.png | Bin 0 -> 69 bytes ta4_addons/textures/px50.png | Bin 0 -> 69 bytes ta4_addons/textures/px51.png | Bin 0 -> 69 bytes ta4_addons/textures/px52.png | Bin 0 -> 69 bytes ta4_addons/textures/px53.png | Bin 0 -> 69 bytes ta4_addons/textures/px54.png | Bin 0 -> 69 bytes ta4_addons/textures/px55.png | Bin 0 -> 69 bytes ta4_addons/textures/px56.png | Bin 0 -> 69 bytes ta4_addons/textures/px57.png | Bin 0 -> 69 bytes ta4_addons/textures/px58.png | Bin 0 -> 69 bytes ta4_addons/textures/px59.png | Bin 0 -> 69 bytes ta4_addons/textures/px6.png | Bin 0 -> 69 bytes ta4_addons/textures/px60.png | Bin 0 -> 69 bytes ta4_addons/textures/px61.png | Bin 0 -> 69 bytes ta4_addons/textures/px62.png | Bin 0 -> 69 bytes ta4_addons/textures/px63.png | Bin 0 -> 69 bytes ta4_addons/textures/px64.png | Bin 0 -> 69 bytes ta4_addons/textures/px7.png | Bin 0 -> 69 bytes ta4_addons/textures/px8.png | Bin 0 -> 69 bytes ta4_addons/textures/px9.png | Bin 0 -> 69 bytes ta4_addons/textures/px_bg.png | Bin 0 -> 84 bytes .../ta4_addons_appl_matrix_screen.png | Bin 0 -> 168 bytes .../textures/ta4_addons_matrix_screen.png | Bin 0 -> 84 bytes .../ta4_addons_matrix_screen_inventory.png | Bin 0 -> 160 bytes .../ta4_addons_matrix_screen_overlay.png | Bin 0 -> 127 bytes ta4_addons/touchscreen/main.lua | 572 ++++++------ .../.github/workflows/check-release.yml | 11 + unified_inventory/.luacheckrc | 1 + unified_inventory/README.md | 11 +- unified_inventory/api.lua | 155 ++- unified_inventory/bags.lua | 82 +- unified_inventory/callbacks.lua | 43 +- unified_inventory/category.lua | 150 +++ unified_inventory/default-categories.lua | 704 ++++++++++++++ unified_inventory/doc/mod_api.txt | 135 +++ unified_inventory/init.lua | 126 ++- unified_inventory/internal.lua | 585 ++++++------ ...ied_inventory.template.tr => template.txt} | 126 ++- .../locale/unified_inventory.de.tr | 41 +- .../locale/unified_inventory.es.tr | 134 +-- .../locale/unified_inventory.fr.tr | 47 +- .../locale/unified_inventory.it.tr | 41 +- .../locale/unified_inventory.ms.tr | 40 +- .../locale/unified_inventory.pl.tr | 47 +- .../locale/unified_inventory.pt.tr | 36 +- .../locale/unified_inventory.ru.tr | 40 +- .../locale/unified_inventory.tr.tr | 44 +- .../locale/unified_inventory.zh_CN.tr | 49 +- .../locale/unified_inventory.zh_TW.tr | 49 +- unified_inventory/mod.conf | 5 +- unified_inventory/register.lua | 277 +++--- unified_inventory/settingtypes.txt | 3 + unified_inventory/textures/ui_bags_header.png | Bin 1241 -> 0 bytes .../textures/ui_bags_inv_large.png | Bin 3401 -> 0 bytes .../textures/ui_bags_inv_medium.png | Bin 2300 -> 0 bytes .../textures/ui_bags_inv_small.png | Bin 1232 -> 0 bytes unified_inventory/textures/ui_bags_trash.png | Bin 1157 -> 0 bytes .../textures/ui_category_all.png | Bin 0 -> 1233 bytes .../textures/ui_category_none.png | Bin 0 -> 7966 bytes .../textures/ui_craftguide_form.png | Bin 962 -> 0 bytes .../textures/ui_crafting_arrow.png | Bin 0 -> 788 bytes .../textures/ui_crafting_form.png | Bin 2343 -> 0 bytes unified_inventory/textures/ui_form_bg.png | Bin 1003 -> 0 bytes .../textures/ui_formbg_9_sliced.png | Bin 0 -> 240 bytes .../textures/ui_main_inventory.png | Bin 4467 -> 0 bytes unified_inventory/textures/ui_misc_form.png | Bin 5789 -> 0 bytes unified_inventory/textures/ui_single_slot.png | Bin 629 -> 648 bytes .../textures/ui_single_slot_bright.png | Bin 0 -> 1032 bytes .../textures/ui_smallbg_9_sliced.png | Bin 0 -> 139 bytes .../textures/ui_trash_slot_icon.png | Bin 0 -> 697 bytes .../textures/ui_xyz_off_icon.png | Bin 8606 -> 0 bytes unified_inventory/textures/ui_xyz_on_icon.png | Bin 2182 -> 0 bytes unified_inventory/waypoints.lua | 315 ++++--- 171 files changed, 5548 insertions(+), 1160 deletions(-) create mode 100644 basic_materials/.github/workflows/luacheck.yml create mode 100644 basic_materials/.luacheckrc create mode 100644 basic_materials/LICENSE create mode 100644 basic_materials/electrical-electronic.lua create mode 100644 basic_materials/init.lua create mode 100644 basic_materials/locale/basic_materials.de.tr create mode 100644 basic_materials/locale/basic_materials.fr.tr create mode 100644 basic_materials/locale/basic_materials.it.tr create mode 100644 basic_materials/locale/basic_materials.ru.tr create mode 100644 basic_materials/metals.lua create mode 100644 basic_materials/misc.lua create mode 100644 basic_materials/mod.conf create mode 100644 basic_materials/models/basic_materials_chains.obj create mode 100644 basic_materials/plastics.lua create mode 100644 basic_materials/textures/basic_materials_brass_block.png create mode 100644 basic_materials/textures/basic_materials_brass_ingot.png create mode 100644 basic_materials/textures/basic_materials_cement_block.png create mode 100644 basic_materials/textures/basic_materials_chain_brass.png create mode 100644 basic_materials/textures/basic_materials_chain_brass_inv.png create mode 100644 basic_materials/textures/basic_materials_chain_steel.png create mode 100644 basic_materials/textures/basic_materials_chain_steel_inv.png create mode 100644 basic_materials/textures/basic_materials_chainlink_brass.png create mode 100644 basic_materials/textures/basic_materials_chainlink_steel.png create mode 100644 basic_materials/textures/basic_materials_concrete_block.png create mode 100644 basic_materials/textures/basic_materials_copper_strip.png create mode 100644 basic_materials/textures/basic_materials_copper_wire.png create mode 100644 basic_materials/textures/basic_materials_empty_spool.png create mode 100644 basic_materials/textures/basic_materials_energy_crystal.png create mode 100644 basic_materials/textures/basic_materials_gear_steel.png create mode 100644 basic_materials/textures/basic_materials_gold_wire.png create mode 100644 basic_materials/textures/basic_materials_heating_element.png create mode 100644 basic_materials/textures/basic_materials_ic.png create mode 100644 basic_materials/textures/basic_materials_motor.png create mode 100644 basic_materials/textures/basic_materials_oil_extract.png create mode 100644 basic_materials/textures/basic_materials_padlock.png create mode 100644 basic_materials/textures/basic_materials_paraffin.png create mode 100644 basic_materials/textures/basic_materials_plastic_sheet.png create mode 100644 basic_materials/textures/basic_materials_plastic_strip.png create mode 100644 basic_materials/textures/basic_materials_silicon.png create mode 100644 basic_materials/textures/basic_materials_silver_wire.png create mode 100644 basic_materials/textures/basic_materials_steel_bar.png create mode 100644 basic_materials/textures/basic_materials_steel_strip.png create mode 100644 basic_materials/textures/basic_materials_steel_wire.png create mode 100644 basic_materials/textures/basic_materials_terracotta_base.png create mode 100644 basic_materials/textures/basic_materials_wet_cement.png create mode 100644 ta4_addons/generate_pixels.py create mode 100644 ta4_addons/matrix_screen/main.lua create mode 100644 ta4_addons/textures/px.png create mode 100644 ta4_addons/textures/px1.png create mode 100644 ta4_addons/textures/px10.png create mode 100644 ta4_addons/textures/px11.png create mode 100644 ta4_addons/textures/px12.png create mode 100644 ta4_addons/textures/px13.png create mode 100644 ta4_addons/textures/px14.png create mode 100644 ta4_addons/textures/px15.png create mode 100644 ta4_addons/textures/px16.png create mode 100644 ta4_addons/textures/px17.png create mode 100644 ta4_addons/textures/px18.png create mode 100644 ta4_addons/textures/px19.png create mode 100644 ta4_addons/textures/px2.png create mode 100644 ta4_addons/textures/px20.png create mode 100644 ta4_addons/textures/px21.png create mode 100644 ta4_addons/textures/px22.png create mode 100644 ta4_addons/textures/px23.png create mode 100644 ta4_addons/textures/px24.png create mode 100644 ta4_addons/textures/px25.png create mode 100644 ta4_addons/textures/px26.png create mode 100644 ta4_addons/textures/px27.png create mode 100644 ta4_addons/textures/px28.png create mode 100644 ta4_addons/textures/px29.png create mode 100644 ta4_addons/textures/px3.png create mode 100644 ta4_addons/textures/px30.png create mode 100644 ta4_addons/textures/px31.png create mode 100644 ta4_addons/textures/px32.png create mode 100644 ta4_addons/textures/px33.png create mode 100644 ta4_addons/textures/px34.png create mode 100644 ta4_addons/textures/px35.png create mode 100644 ta4_addons/textures/px36.png create mode 100644 ta4_addons/textures/px37.png create mode 100644 ta4_addons/textures/px38.png create mode 100644 ta4_addons/textures/px39.png create mode 100644 ta4_addons/textures/px4.png create mode 100644 ta4_addons/textures/px40.png create mode 100644 ta4_addons/textures/px41.png create mode 100644 ta4_addons/textures/px42.png create mode 100644 ta4_addons/textures/px43.png create mode 100644 ta4_addons/textures/px44.png create mode 100644 ta4_addons/textures/px45.png create mode 100644 ta4_addons/textures/px46.png create mode 100644 ta4_addons/textures/px47.png create mode 100644 ta4_addons/textures/px48.png create mode 100644 ta4_addons/textures/px49.png create mode 100644 ta4_addons/textures/px5.png create mode 100644 ta4_addons/textures/px50.png create mode 100644 ta4_addons/textures/px51.png create mode 100644 ta4_addons/textures/px52.png create mode 100644 ta4_addons/textures/px53.png create mode 100644 ta4_addons/textures/px54.png create mode 100644 ta4_addons/textures/px55.png create mode 100644 ta4_addons/textures/px56.png create mode 100644 ta4_addons/textures/px57.png create mode 100644 ta4_addons/textures/px58.png create mode 100644 ta4_addons/textures/px59.png create mode 100644 ta4_addons/textures/px6.png create mode 100644 ta4_addons/textures/px60.png create mode 100644 ta4_addons/textures/px61.png create mode 100644 ta4_addons/textures/px62.png create mode 100644 ta4_addons/textures/px63.png create mode 100644 ta4_addons/textures/px64.png create mode 100644 ta4_addons/textures/px7.png create mode 100644 ta4_addons/textures/px8.png create mode 100644 ta4_addons/textures/px9.png create mode 100644 ta4_addons/textures/px_bg.png create mode 100644 ta4_addons/textures/ta4_addons_appl_matrix_screen.png create mode 100644 ta4_addons/textures/ta4_addons_matrix_screen.png create mode 100644 ta4_addons/textures/ta4_addons_matrix_screen_inventory.png create mode 100644 ta4_addons/textures/ta4_addons_matrix_screen_overlay.png create mode 100644 unified_inventory/.github/workflows/check-release.yml create mode 100644 unified_inventory/category.lua create mode 100644 unified_inventory/default-categories.lua rename unified_inventory/locale/{unified_inventory.template.tr => template.txt} (73%) delete mode 100644 unified_inventory/textures/ui_bags_header.png delete mode 100644 unified_inventory/textures/ui_bags_inv_large.png delete mode 100644 unified_inventory/textures/ui_bags_inv_medium.png delete mode 100644 unified_inventory/textures/ui_bags_inv_small.png delete mode 100644 unified_inventory/textures/ui_bags_trash.png create mode 100644 unified_inventory/textures/ui_category_all.png create mode 100644 unified_inventory/textures/ui_category_none.png delete mode 100644 unified_inventory/textures/ui_craftguide_form.png create mode 100644 unified_inventory/textures/ui_crafting_arrow.png delete mode 100644 unified_inventory/textures/ui_crafting_form.png delete mode 100644 unified_inventory/textures/ui_form_bg.png create mode 100644 unified_inventory/textures/ui_formbg_9_sliced.png delete mode 100644 unified_inventory/textures/ui_main_inventory.png delete mode 100644 unified_inventory/textures/ui_misc_form.png create mode 100644 unified_inventory/textures/ui_single_slot_bright.png create mode 100644 unified_inventory/textures/ui_smallbg_9_sliced.png create mode 100644 unified_inventory/textures/ui_trash_slot_icon.png delete mode 100644 unified_inventory/textures/ui_xyz_off_icon.png delete mode 100644 unified_inventory/textures/ui_xyz_on_icon.png diff --git a/basic_materials/.github/workflows/luacheck.yml b/basic_materials/.github/workflows/luacheck.yml new file mode 100644 index 0000000..a13efa9 --- /dev/null +++ b/basic_materials/.github/workflows/luacheck.yml @@ -0,0 +1,13 @@ +name: luacheck +on: [push, pull_request] +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@master + - name: apt + run: sudo apt-get install -y luarocks + - name: luacheck install + run: luarocks install --local luacheck + - name: luacheck run + run: $HOME/.luarocks/bin/luacheck ./ diff --git a/basic_materials/.luacheckrc b/basic_materials/.luacheckrc new file mode 100644 index 0000000..55879b0 --- /dev/null +++ b/basic_materials/.luacheckrc @@ -0,0 +1,30 @@ +std = "lua51+minetest" +unused_args = false +allow_defined_top = true +max_line_length = 999 + +stds.minetest = { + read_globals = { + "DIR_DELIM", + "minetest", + "core", + "dump", + "vector", + "nodeupdate", + "VoxelManip", + "VoxelArea", + "PseudoRandom", + "ItemStack", + "default", + table = { + fields = { + "copy", + }, + }, + } +} + +read_globals = { + "default", + "moreores", +} diff --git a/basic_materials/LICENSE b/basic_materials/LICENSE new file mode 100644 index 0000000..c5885ae --- /dev/null +++ b/basic_materials/LICENSE @@ -0,0 +1,600 @@ +License for code: LGPL 3.0 +License for media and all other assets: CC-by-SA 4.0 + +############################################################################### + + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. + +############################################################################### + +Attribution-ShareAlike 4.0 International + +======================================================================= + +Creative Commons Corporation ("Creative Commons") is not a law firm and +does not provide legal services or legal advice. Distribution of +Creative Commons public licenses does not create a lawyer-client or +other relationship. Creative Commons makes its licenses and related +information available on an "as-is" basis. Creative Commons gives no +warranties regarding its licenses, any material licensed under their +terms and conditions, or any related information. Creative Commons +disclaims all liability for damages resulting from their use to the +fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and +conditions that creators and other rights holders may use to share +original works of authorship and other material subject to copyright +and certain other rights specified in the public license below. The +following considerations are for informational purposes only, are not +exhaustive, and do not form part of our licenses. + + Considerations for licensors: Our public licenses are + intended for use by those authorized to give the public + permission to use material in ways otherwise restricted by + copyright and certain other rights. Our licenses are + irrevocable. Licensors should read and understand the terms + and conditions of the license they choose before applying it. + Licensors should also secure all rights necessary before + applying our licenses so that the public can reuse the + material as expected. Licensors should clearly mark any + material not subject to the license. This includes other CC- + licensed material, or material used under an exception or + limitation to copyright. More considerations for licensors: + wiki.creativecommons.org/Considerations_for_licensors + + Considerations for the public: By using one of our public + licenses, a licensor grants the public permission to use the + licensed material under specified terms and conditions. If + the licensor's permission is not necessary for any reason--for + example, because of any applicable exception or limitation to + copyright--then that use is not regulated by the license. Our + licenses grant only permissions under copyright and certain + other rights that a licensor has authority to grant. Use of + the licensed material may still be restricted for other + reasons, including because others have copyright or other + rights in the material. A licensor may make special requests, + such as asking that all changes be marked or described. + Although not required by our licenses, you are encouraged to + respect those requests where reasonable. More considerations + for the public: + wiki.creativecommons.org/Considerations_for_licensees + +======================================================================= + +Creative Commons Attribution-ShareAlike 4.0 International Public +License + +By exercising the Licensed Rights (defined below), You accept and agree +to be bound by the terms and conditions of this Creative Commons +Attribution-ShareAlike 4.0 International Public License ("Public +License"). To the extent this Public License may be interpreted as a +contract, You are granted the Licensed Rights in consideration of Your +acceptance of these terms and conditions, and the Licensor grants You +such rights in consideration of benefits the Licensor receives from +making the Licensed Material available under these terms and +conditions. + + +Section 1 -- Definitions. + + a. Adapted Material means material subject to Copyright and Similar + Rights that is derived from or based upon the Licensed Material + and in which the Licensed Material is translated, altered, + arranged, transformed, or otherwise modified in a manner requiring + permission under the Copyright and Similar Rights held by the + Licensor. For purposes of this Public License, where the Licensed + Material is a musical work, performance, or sound recording, + Adapted Material is always produced where the Licensed Material is + synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright + and Similar Rights in Your contributions to Adapted Material in + accordance with the terms and conditions of this Public License. + + c. BY-SA Compatible License means a license listed at + creativecommons.org/compatiblelicenses, approved by Creative + Commons as essentially the equivalent of this Public License. + + d. Copyright and Similar Rights means copyright and/or similar rights + closely related to copyright including, without limitation, + performance, broadcast, sound recording, and Sui Generis Database + Rights, without regard to how the rights are labeled or + categorized. For purposes of this Public License, the rights + specified in Section 2(b)(1)-(2) are not Copyright and Similar + Rights. + + e. Effective Technological Measures means those measures that, in the + absence of proper authority, may not be circumvented under laws + fulfilling obligations under Article 11 of the WIPO Copyright + Treaty adopted on December 20, 1996, and/or similar international + agreements. + + f. Exceptions and Limitations means fair use, fair dealing, and/or + any other exception or limitation to Copyright and Similar Rights + that applies to Your use of the Licensed Material. + + g. License Elements means the license attributes listed in the name + of a Creative Commons Public License. The License Elements of this + Public License are Attribution and ShareAlike. + + h. Licensed Material means the artistic or literary work, database, + or other material to which the Licensor applied this Public + License. + + i. Licensed Rights means the rights granted to You subject to the + terms and conditions of this Public License, which are limited to + all Copyright and Similar Rights that apply to Your use of the + Licensed Material and that the Licensor has authority to license. + + j. Licensor means the individual(s) or entity(ies) granting rights + under this Public License. + + k. Share means to provide material to the public by any means or + process that requires permission under the Licensed Rights, such + as reproduction, public display, public performance, distribution, + dissemination, communication, or importation, and to make material + available to the public including in ways that members of the + public may access the material from a place and at a time + individually chosen by them. + + l. Sui Generis Database Rights means rights other than copyright + resulting from Directive 96/9/EC of the European Parliament and of + the Council of 11 March 1996 on the legal protection of databases, + as amended and/or succeeded, as well as other essentially + equivalent rights anywhere in the world. + + m. You means the individual or entity exercising the Licensed Rights + under this Public License. Your has a corresponding meaning. + + +Section 2 -- Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, + the Licensor hereby grants You a worldwide, royalty-free, + non-sublicensable, non-exclusive, irrevocable license to + exercise the Licensed Rights in the Licensed Material to: + + a. reproduce and Share the Licensed Material, in whole or + in part; and + + b. produce, reproduce, and Share Adapted Material. + + 2. Exceptions and Limitations. For the avoidance of doubt, where + Exceptions and Limitations apply to Your use, this Public + License does not apply, and You do not need to comply with + its terms and conditions. + + 3. Term. The term of this Public License is specified in Section + 6(a). + + 4. Media and formats; technical modifications allowed. The + Licensor authorizes You to exercise the Licensed Rights in + all media and formats whether now known or hereafter created, + and to make technical modifications necessary to do so. The + Licensor waives and/or agrees not to assert any right or + authority to forbid You from making technical modifications + necessary to exercise the Licensed Rights, including + technical modifications necessary to circumvent Effective + Technological Measures. For purposes of this Public License, + simply making modifications authorized by this Section 2(a) + (4) never produces Adapted Material. + + 5. Downstream recipients. + + a. Offer from the Licensor -- Licensed Material. Every + recipient of the Licensed Material automatically + receives an offer from the Licensor to exercise the + Licensed Rights under the terms and conditions of this + Public License. + + b. Additional offer from the Licensor -- Adapted Material. + Every recipient of Adapted Material from You + automatically receives an offer from the Licensor to + exercise the Licensed Rights in the Adapted Material + under the conditions of the Adapter's License You apply. + + c. No downstream restrictions. You may not offer or impose + any additional or different terms or conditions on, or + apply any Effective Technological Measures to, the + Licensed Material if doing so restricts exercise of the + Licensed Rights by any recipient of the Licensed + Material. + + 6. No endorsement. Nothing in this Public License constitutes or + may be construed as permission to assert or imply that You + are, or that Your use of the Licensed Material is, connected + with, or sponsored, endorsed, or granted official status by, + the Licensor or others designated to receive attribution as + provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not + licensed under this Public License, nor are publicity, + privacy, and/or other similar personality rights; however, to + the extent possible, the Licensor waives and/or agrees not to + assert any such rights held by the Licensor to the limited + extent necessary to allow You to exercise the Licensed + Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this + Public License. + + 3. To the extent possible, the Licensor waives any right to + collect royalties from You for the exercise of the Licensed + Rights, whether directly or through a collecting society + under any voluntary or waivable statutory or compulsory + licensing scheme. In all other cases the Licensor expressly + reserves any right to collect such royalties. + + +Section 3 -- License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the +following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material (including in modified + form), You must: + + a. retain the following if it is supplied by the Licensor + with the Licensed Material: + + i. identification of the creator(s) of the Licensed + Material and any others designated to receive + attribution, in any reasonable manner requested by + the Licensor (including by pseudonym if + designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of + warranties; + + v. a URI or hyperlink to the Licensed Material to the + extent reasonably practicable; + + b. indicate if You modified the Licensed Material and + retain an indication of any previous modifications; and + + c. indicate the Licensed Material is licensed under this + Public License, and include the text of, or the URI or + hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any + reasonable manner based on the medium, means, and context in + which You Share the Licensed Material. For example, it may be + reasonable to satisfy the conditions by providing a URI or + hyperlink to a resource that includes the required + information. + + 3. If requested by the Licensor, You must remove any of the + information required by Section 3(a)(1)(A) to the extent + reasonably practicable. + + b. ShareAlike. + + In addition to the conditions in Section 3(a), if You Share + Adapted Material You produce, the following conditions also apply. + + 1. The Adapter's License You apply must be a Creative Commons + license with the same License Elements, this version or + later, or a BY-SA Compatible License. + + 2. You must include the text of, or the URI or hyperlink to, the + Adapter's License You apply. You may satisfy this condition + in any reasonable manner based on the medium, means, and + context in which You Share Adapted Material. + + 3. You may not offer or impose any additional or different terms + or conditions on, or apply any Effective Technological + Measures to, Adapted Material that restrict exercise of the + rights granted under the Adapter's License You apply. + + +Section 4 -- Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that +apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right + to extract, reuse, reproduce, and Share all or a substantial + portion of the contents of the database; + + b. if You include all or a substantial portion of the database + contents in a database in which You have Sui Generis Database + Rights, then the database in which You have Sui Generis Database + Rights (but not its individual contents) is Adapted Material, + + including for purposes of Section 3(b); and + c. You must comply with the conditions in Section 3(a) if You Share + all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not +replace Your obligations under this Public License where the Licensed +Rights include other Copyright and Similar Rights. + + +Section 5 -- Disclaimer of Warranties and Limitation of Liability. + + a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE + EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS + AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF + ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, + IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, + WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, + ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT + KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT + ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. + + b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE + TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, + NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, + INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, + COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR + USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR + DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR + IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. + + c. The disclaimer of warranties and limitation of liability provided + above shall be interpreted in a manner that, to the extent + possible, most closely approximates an absolute disclaimer and + waiver of all liability. + + +Section 6 -- Term and Termination. + + a. This Public License applies for the term of the Copyright and + Similar Rights licensed here. However, if You fail to comply with + this Public License, then Your rights under this Public License + terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under + Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided + it is cured within 30 days of Your discovery of the + violation; or + + 2. upon express reinstatement by the Licensor. + + For the avoidance of doubt, this Section 6(b) does not affect any + right the Licensor may have to seek remedies for Your violations + of this Public License. + + c. For the avoidance of doubt, the Licensor may also offer the + Licensed Material under separate terms or conditions or stop + distributing the Licensed Material at any time; however, doing so + will not terminate this Public License. + + d. Sections 1, 5, 6, 7, and 8 survive termination of this Public + License. + + +Section 7 -- Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different + terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the + Licensed Material not stated herein are separate from and + independent of the terms and conditions of this Public License. + + +Section 8 -- Interpretation. + + a. For the avoidance of doubt, this Public License does not, and + shall not be interpreted to, reduce, limit, restrict, or impose + conditions on any use of the Licensed Material that could lawfully + be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is + deemed unenforceable, it shall be automatically reformed to the + minimum extent necessary to make it enforceable. If the provision + cannot be reformed, it shall be severed from this Public License + without affecting the enforceability of the remaining terms and + conditions. + + c. No term or condition of this Public License will be waived and no + failure to comply consented to unless expressly agreed to by the + Licensor. + + d. Nothing in this Public License constitutes or may be interpreted + as a limitation upon, or waiver of, any privileges and immunities + that apply to the Licensor or You, including from the legal + processes of any jurisdiction or authority. + + +======================================================================= + +Creative Commons is not a party to its public +licenses. Notwithstanding, Creative Commons may elect to apply one of +its public licenses to material it publishes and in those instances +will be considered the “Licensor.” The text of the Creative Commons +public licenses is dedicated to the public domain under the CC0 Public +Domain Dedication. Except for the limited purpose of indicating that +material is shared under a Creative Commons public license or as +otherwise permitted by the Creative Commons policies published at +creativecommons.org/policies, Creative Commons does not authorize the +use of the trademark "Creative Commons" or any other trademark or logo +of Creative Commons without its prior written consent including, +without limitation, in connection with any unauthorized modifications +to any of its public licenses or any other arrangements, +understandings, or agreements concerning use of licensed material. For +the avoidance of doubt, this paragraph does not form part of the +public licenses. + +Creative Commons may be contacted at creativecommons.org. diff --git a/basic_materials/electrical-electronic.lua b/basic_materials/electrical-electronic.lua new file mode 100644 index 0000000..91fac4e --- /dev/null +++ b/basic_materials/electrical-electronic.lua @@ -0,0 +1,86 @@ +-- Translation support +local S = minetest.get_translator("basic_materials") + +-- items + +minetest.register_craftitem("basic_materials:silicon", { + description = S("Silicon lump"), + inventory_image = "basic_materials_silicon.png", +}) + +minetest.register_craftitem("basic_materials:ic", { + description = S("Simple Integrated Circuit"), + inventory_image = "basic_materials_ic.png", +}) + +minetest.register_craftitem("basic_materials:motor", { + description = S("Simple Motor"), + inventory_image = "basic_materials_motor.png", +}) + +minetest.register_craftitem("basic_materials:heating_element", { + description = S("Heating element"), + inventory_image = "basic_materials_heating_element.png", +}) + +minetest.register_craftitem("basic_materials:energy_crystal_simple", { + description = S("Simple energy crystal"), + inventory_image = "basic_materials_energy_crystal.png", +}) + +-- crafts + +minetest.register_craft( { + output = "mesecons_materials:silicon 4", + recipe = { + { "default:sand", "default:sand" }, + { "default:sand", "default:steel_ingot" }, + }, +}) + +minetest.register_craft( { + output = "basic_materials:ic 4", + recipe = { + { "mesecons_materials:silicon", "mesecons_materials:silicon" }, + { "mesecons_materials:silicon", "default:copper_ingot" }, + }, +}) + +minetest.register_craft( { + output = "basic_materials:motor 2", + recipe = { + { "default:mese_crystal_fragment", "basic_materials:copper_wire", "basic_materials:plastic_sheet" }, + { "default:copper_ingot", "default:steel_ingot", "default:steel_ingot" }, + { "default:mese_crystal_fragment", "basic_materials:copper_wire", "basic_materials:plastic_sheet" } + }, + replacements = { + { "basic_materials:copper_wire", "basic_materials:empty_spool" }, + { "basic_materials:copper_wire", "basic_materials:empty_spool" }, + } +}) + +minetest.register_craft( { + output = "basic_materials:heating_element 2", + recipe = { + { "default:copper_ingot", "default:mese_crystal_fragment", "default:copper_ingot" } + }, +}) + +minetest.register_craft({ + --type = "shapeless", + output = "basic_materials:energy_crystal_simple 2", + recipe = { + { "default:mese_crystal_fragment", "default:torch", "default:mese_crystal_fragment" }, + { "default:diamond", "default:gold_ingot", "default:diamond" } + }, +}) + +-- aliases + +minetest.register_alias("homedecor:ic", "basic_materials:ic") +minetest.register_alias("homedecor:motor", "basic_materials:motor") +minetest.register_alias("technic:motor", "basic_materials:motor") +minetest.register_alias("homedecor:heating_element", "basic_materials:heating_element") +minetest.register_alias("homedecor:power_crystal", "basic_materials:energy_crystal_simple") + +minetest.register_alias_force("mesecons_materials:silicon", "basic_materials:silicon") diff --git a/basic_materials/init.lua b/basic_materials/init.lua new file mode 100644 index 0000000..348c059 --- /dev/null +++ b/basic_materials/init.lua @@ -0,0 +1,15 @@ +-- Basic materials mod +-- by Vanessa Dannenberg + +-- This mod supplies all those little random craft items that everyone always +-- seems to need, such as metal bars (ala rebar), plastic, wire, and so on. + +local modpath = minetest.get_modpath("basic_materials") + +basic_materials = {} +basic_materials.mod = { author = "Vanessa Dannenberg" } + +dofile(modpath.."/metals.lua") +dofile(modpath.."/plastics.lua") +dofile(modpath.."/electrical-electronic.lua") +dofile(modpath.."/misc.lua") diff --git a/basic_materials/locale/basic_materials.de.tr b/basic_materials/locale/basic_materials.de.tr new file mode 100644 index 0000000..8fddd8a --- /dev/null +++ b/basic_materials/locale/basic_materials.de.tr @@ -0,0 +1,33 @@ +# textdomain: basic_materials +Silicon lump=Siliziumklumpen +Simple Integrated Circuit=Einfacher Integrierter Schaltkreis +Simple Motor=Einfacher Motor +Heating element=Heizelement +Simple energy crystal=Einfacher Energiekristall + +Spool of steel wire=Spule mit Stahldraht +Spool of copper wire=Spule mit Kupferdraht +Spool of silver wire=Spule mit Silberdraht +Spool of gold wire=Spule mit Golddraht +Steel Strip=Stahlstreifen +Copper Strip=Kupferstreifen +Steel Bar=Stahlstab +Chainlinks (brass)=Messingkettenglieder +Chainlinks (steel)=Stahlkettenglieder +Brass Ingot=Messingbarren +Steel gear=Stahlzahnrad +Padlock=Vorhängeschloss +Chain (steel, hanging)=Hängende Stahlkette +Chain (brass, hanging)=Hängende Messingkette +Brass Block=Messingblock + +Oil extract=Ölextrakt +Unprocessed paraffin=Unverarbeitetes Paraffin +Uncooked Terracotta Base=Ungebranntes Terrakotta +Wet Cement=Nasser Zement +Cement=Zement +Concrete Block=Betonblock + +Plastic sheet=Kunststoffplatte +Plastic strips=Kunststoffstreifen +Empty wire spool=Leere Drahtspule diff --git a/basic_materials/locale/basic_materials.fr.tr b/basic_materials/locale/basic_materials.fr.tr new file mode 100644 index 0000000..0bebf79 --- /dev/null +++ b/basic_materials/locale/basic_materials.fr.tr @@ -0,0 +1,33 @@ +# textdomain: basic_materials +Silicon lump=Morceau de silicium +Simple Integrated Circuit=Circuit intégré simple +Simple Motor=Moteur simple +Heating element=Élément chauffant +Simple energy crystal=Cristal d’énergie simple + +Spool of steel wire=Bobine de fil d’acier +Spool of copper wire=Bobine de fil de cuivre +Spool of silver wire=Bobine de fil d’argent +Spool of gold wire=Bobine de fil d’or +Steel Strip=Bande de acier +Copper Strip=Bande de cuivre +Steel Bar=Barre d’acier +Chainlinks (brass)=Maillon en laiton +Chainlinks (steel)=Maillon en acier +Brass Ingot=Lingot de laiton +Steel gear=Rouage en acier +Padlock=Cadenas +Chain (steel, hanging)=Chaine en acier +Chain (brass, hanging)=Chaine en laiton +Brass Block=Bloc de laiton + +Oil extract=Extrait d’huile +Unprocessed paraffin=Paraffine non transformée +Uncooked Terracotta Base=Argile crue +Wet Cement=Ciment humide +Cement=Ciment +Concrete Block=Bloc de béton + +Plastic sheet=Morceau de plastique +Plastic strips=Bande de plastique +Empty wire spool=Bobine de fil vide diff --git a/basic_materials/locale/basic_materials.it.tr b/basic_materials/locale/basic_materials.it.tr new file mode 100644 index 0000000..aae0b3b --- /dev/null +++ b/basic_materials/locale/basic_materials.it.tr @@ -0,0 +1,34 @@ +# textdomain: basic_materials +# Author: Salvo 'LtWorf' Tomaselli +Silicon lump=Grumo di silicio +Simple Integrated Circuit=Circuito integrato semplice +Simple Motor=Motore semplice +Heating element=Elemento riscaldante +Simple energy crystal=Cristallo di energia semplice + +Spool of steel wire=Bobina di filo d'acciaio +Spool of copper wire=Bobina di filo di rame +Spool of silver wire=Bobina di filo d'argento +Spool of gold wire=Bobina di filo d'oro +Steel Strip=Striscia d'acciaio +Copper Strip=Striscia di rame +Steel Bar=Barra d'acciaio +Chainlinks (brass)=Catena (ottone) +Chainlinks (steel)=Catena (acciaio) +Brass Ingot=Lingotto di ottone +Steel gear=Ingranaggio d'acciaio +Padlock=Catenaccio +Chain (steel, hanging)=Catena (acciaio, pendente) +Chain (brass, hanging)=Catena (ottone, pendente) +Brass Block=Blocco di ottone + +Oil extract=Estratto d'olio +Unprocessed paraffin=Paraffina grezza +Uncooked Terracotta Base=Argilla cruda +Wet Cement=Cemento umido +Cement=Cemento +Concrete Block=Blocco di calcestruzzo + +Plastic sheet=Foglio di plastica +Plastic strips=Striscia di plastica +Empty wire spool=Rocchetto vuoto diff --git a/basic_materials/locale/basic_materials.ru.tr b/basic_materials/locale/basic_materials.ru.tr new file mode 100644 index 0000000..85e9c0c --- /dev/null +++ b/basic_materials/locale/basic_materials.ru.tr @@ -0,0 +1,33 @@ +# textdomain: basic_materials +Silicon lump=Кусок Кремния +Simple Integrated Circuit=Микросхема +Simple Motor=Мотор +Heating element=Нить Накала +Simple energy crystal=Энергетический Кристалл + +Spool of steel wire=Катушка Стальной Проволоки +Spool of copper wire=Катушка Медной Проволоки +Spool of silver wire=Катушка Серебрянной Проволоки +Spool of gold wire=Катушка Золотой Проволоки +Steel Strip=Стальная Полоса +Copper Strip=Медная Полоса +Steel Bar=Стальной Прут +Chainlinks (brass)=Латунные Звенья +Chainlinks (steel)=Стальные Звенья +Brass Ingot=Латунный Брусок +Steel gear=Стальная Шестерня +Padlock=Навесной Замок +Chain (steel, hanging)=Стальная Цепь +Chain (brass, hanging)=Латунная Цепь +Brass Block=Латунный Блок + +Oil extract=Масляный Экстракт +Unprocessed paraffin=Необработанный Парафин +Uncooked Terracotta Base=Ком Мокрого Терракота +Wet Cement=Ком Мокрого Цемента +Cement=Цемент +Concrete Block=Железобетон + +Plastic sheet=Пластиковый Лист +Plastic strips=Пластиковая Полоса +Empty wire spool=Пустая Катушка diff --git a/basic_materials/metals.lua b/basic_materials/metals.lua new file mode 100644 index 0000000..0a3243b --- /dev/null +++ b/basic_materials/metals.lua @@ -0,0 +1,300 @@ +-- Translation support +local S = minetest.get_translator("basic_materials") + +-- items + +minetest.register_craftitem("basic_materials:steel_wire", { + description = S("Spool of steel wire"), + groups = { wire = 1 }, + inventory_image = "basic_materials_steel_wire.png" +}) + +minetest.register_craftitem("basic_materials:copper_wire", { + description = S("Spool of copper wire"), + groups = { wire = 1 }, + inventory_image = "basic_materials_copper_wire.png" +}) + +minetest.register_craftitem("basic_materials:silver_wire", { + description = S("Spool of silver wire"), + groups = { wire = 1 }, + inventory_image = "basic_materials_silver_wire.png" +}) + +minetest.register_craftitem("basic_materials:gold_wire", { + description = S("Spool of gold wire"), + groups = { wire = 1 }, + inventory_image = "basic_materials_gold_wire.png" +}) + +minetest.register_craftitem("basic_materials:steel_strip", { + description = S("Steel Strip"), + groups = { strip = 1 }, + inventory_image = "basic_materials_steel_strip.png" +}) + +minetest.register_craftitem("basic_materials:copper_strip", { + description = S("Copper Strip"), + groups = { strip = 1 }, + inventory_image = "basic_materials_copper_strip.png" +}) + +minetest.register_craftitem("basic_materials:steel_bar", { + description = S("Steel Bar"), + inventory_image = "basic_materials_steel_bar.png", +}) + +minetest.register_craftitem("basic_materials:chainlink_brass", { + description = S("Chainlinks (brass)"), + groups = { chainlinks = 1 }, + inventory_image = "basic_materials_chainlink_brass.png" +}) + +minetest.register_craftitem("basic_materials:chainlink_steel", { + description = S("Chainlinks (steel)"), + groups = { chainlinks = 1 }, + inventory_image = "basic_materials_chainlink_steel.png" +}) + +minetest.register_craftitem("basic_materials:brass_ingot", { + description = S("Brass Ingot"), + inventory_image = "basic_materials_brass_ingot.png", +}) + +minetest.register_craftitem("basic_materials:gear_steel", { + description = S("Steel gear"), + inventory_image = "basic_materials_gear_steel.png" +}) + +minetest.register_craftitem("basic_materials:padlock", { + description = S("Padlock"), + inventory_image = "basic_materials_padlock.png" +}) + +-- nodes + +local chains_sbox = { + type = "fixed", + fixed = { -0.1, -0.5, -0.1, 0.1, 0.5, 0.1 } +} + +minetest.register_node("basic_materials:chain_steel", { + description = S("Chain (steel, hanging)"), + drawtype = "mesh", + mesh = "basic_materials_chains.obj", + tiles = {"basic_materials_chain_steel.png"}, + walkable = false, + climbable = true, + sunlight_propagates = true, + paramtype = "light", + inventory_image = "basic_materials_chain_steel_inv.png", + groups = {cracky=3}, + selection_box = chains_sbox, +}) + +minetest.register_node("basic_materials:chain_brass", { + description = S("Chain (brass, hanging)"), + drawtype = "mesh", + mesh = "basic_materials_chains.obj", + tiles = {"basic_materials_chain_brass.png"}, + walkable = false, + climbable = true, + sunlight_propagates = true, + paramtype = "light", + inventory_image = "basic_materials_chain_brass_inv.png", + groups = {cracky=3}, + selection_box = chains_sbox, +}) + +minetest.register_node("basic_materials:brass_block", { + description = S("Brass Block"), + tiles = { "basic_materials_brass_block.png" }, + is_ground_content = false, + groups = {cracky=1, level=2}, + sounds = default.node_sound_metal_defaults() +}) + +-- crafts + +minetest.register_craft( { + output = "basic_materials:copper_wire 2", + type = "shapeless", + recipe = { + "default:copper_ingot", + "basic_materials:empty_spool", + "basic_materials:empty_spool", + }, +}) + +minetest.register_craft( { + output = "basic_materials:silver_wire 2", + type = "shapeless", + recipe = { + "moreores:silver_ingot", + "basic_materials:empty_spool", + "basic_materials:empty_spool", + }, +}) + +minetest.register_craft( { + output = "basic_materials:gold_wire 2", + type = "shapeless", + recipe = { + "default:gold_ingot", + "basic_materials:empty_spool", + "basic_materials:empty_spool", + }, +}) + +minetest.register_craft( { + output = "basic_materials:steel_wire 2", + type = "shapeless", + recipe = { + "default:steel_ingot", + "basic_materials:empty_spool", + "basic_materials:empty_spool", + }, +}) + +minetest.register_craft( { + output = "basic_materials:steel_strip 12", + recipe = { + { "", "default:steel_ingot", "" }, + { "default:steel_ingot", "", "" }, + }, +}) + +minetest.register_craft( { + output = "basic_materials:copper_strip 12", + recipe = { + { "", "default:copper_ingot", "" }, + { "default:copper_ingot", "", "" }, + }, +}) + +minetest.register_craft( { + output = "basic_materials:steel_bar 6", + recipe = { + { "", "", "default:steel_ingot" }, + { "", "default:steel_ingot", "" }, + { "default:steel_ingot", "", "" }, + }, +}) + +minetest.register_craft( { + output = "basic_materials:padlock 2", + recipe = { + { "basic_materials:steel_bar" }, + { "default:steel_ingot" }, + { "default:steel_ingot" }, + }, +}) + +minetest.register_craft({ + output = "basic_materials:chainlink_steel 12", + recipe = { + {"", "default:steel_ingot", "default:steel_ingot"}, + { "default:steel_ingot", "", "default:steel_ingot" }, + { "default:steel_ingot", "default:steel_ingot", "" }, + }, +}) + +minetest.register_craft({ + output = "basic_materials:chainlink_brass 12", + recipe = { + {"", "basic_materials:brass_ingot", "basic_materials:brass_ingot"}, + { "basic_materials:brass_ingot", "", "basic_materials:brass_ingot" }, + { "basic_materials:brass_ingot", "basic_materials:brass_ingot", "" }, + }, +}) + +minetest.register_craft({ + output = 'basic_materials:chain_steel 2', + recipe = { + {"basic_materials:chainlink_steel"}, + {"basic_materials:chainlink_steel"}, + {"basic_materials:chainlink_steel"} + } +}) + +minetest.register_craft({ + output = 'basic_materials:chain_brass 2', + recipe = { + {"basic_materials:chainlink_brass"}, + {"basic_materials:chainlink_brass"}, + {"basic_materials:chainlink_brass"} + } +}) + +minetest.register_craft( { + output = "basic_materials:gear_steel 6", + recipe = { + { "", "default:steel_ingot", "" }, + { "default:steel_ingot","basic_materials:chainlink_steel", "default:steel_ingot" }, + { "", "default:steel_ingot", "" } + }, +}) + +minetest.register_craft( { + type = "shapeless", + output = "basic_materials:brass_ingot 3", + recipe = { + "default:copper_ingot", + "default:copper_ingot", + "moreores:silver_ingot", + }, +}) + +if not minetest.get_modpath("moreores") then + -- Without moreores, there still should be a way to create brass. + minetest.register_craft( { + output = "basic_materials:brass_ingot 9", + recipe = { + {"default:copper_ingot", "default:tin_ingot", "default:copper_ingot"}, + {"default:gold_ingot", "default:copper_ingot", "default:gold_ingot"}, + {"default:copper_ingot", "default:tin_ingot", "default:copper_ingot"}, + }, + }) +end + +minetest.register_craft( { + type = "shapeless", + output = "basic_materials:brass_ingot 9", + recipe = { "basic_materials:brass_block" }, +}) + +minetest.register_craft( { + output = "basic_materials:brass_block", + recipe = { + { "basic_materials:brass_ingot", "basic_materials:brass_ingot", "basic_materials:brass_ingot" }, + { "basic_materials:brass_ingot", "basic_materials:brass_ingot", "basic_materials:brass_ingot" }, + { "basic_materials:brass_ingot", "basic_materials:brass_ingot", "basic_materials:brass_ingot" }, + }, +}) + +-- aliases + +minetest.register_alias("homedecor:copper_wire", "basic_materials:copper_wire") +minetest.register_alias("technic:fine_copper_wire", "basic_materials:copper_wire") +minetest.register_alias("technic:fine_silver_wire", "basic_materials:silver_wire") +minetest.register_alias("technic:fine_gold_wire", "basic_materials:gold_wire") + +minetest.register_alias("homedecor:steel_wire", "basic_materials:steel_wire") + +minetest.register_alias("homedecor:brass_ingot", "basic_materials:brass_ingot") +minetest.register_alias("technic:brass_ingot", "basic_materials:brass_ingot") +minetest.register_alias("technic:brass_block", "basic_materials:brass_block") + +minetest.register_alias("homedecor:copper_strip", "basic_materials:copper_strip") +minetest.register_alias("homedecor:steel_strip", "basic_materials:steel_strip") + +minetest.register_alias_force("glooptest:chainlink", "basic_materials:chainlink_steel") +minetest.register_alias_force("homedecor:chainlink_steel", "basic_materials:chainlink_steel") +minetest.register_alias("homedecor:chainlink_brass", "basic_materials:chainlink_brass") +minetest.register_alias("chains:chain", "basic_materials:chain_steel") +minetest.register_alias("chains:chain_brass", "basic_materials:chain_brass") + +minetest.register_alias("pipeworks:gear", "basic_materials:gear_steel") + +minetest.register_alias("technic:rebar", "basic_materials:steel_bar") + diff --git a/basic_materials/misc.lua b/basic_materials/misc.lua new file mode 100644 index 0000000..0012897 --- /dev/null +++ b/basic_materials/misc.lua @@ -0,0 +1,126 @@ +-- Translation support +local S = minetest.get_translator("basic_materials") + +-- items + +minetest.register_craftitem("basic_materials:oil_extract", { + description = S("Oil extract"), + inventory_image = "basic_materials_oil_extract.png", +}) + +minetest.register_craftitem("basic_materials:paraffin", { + description = S("Unprocessed paraffin"), + inventory_image = "basic_materials_paraffin.png", +}) + +minetest.register_craftitem("basic_materials:terracotta_base", { + description = S("Uncooked Terracotta Base"), + inventory_image = "basic_materials_terracotta_base.png", +}) + +minetest.register_craftitem("basic_materials:wet_cement", { + description = S("Wet Cement"), + inventory_image = "basic_materials_wet_cement.png", +}) + +-- nodes + +minetest.register_node("basic_materials:cement_block", { + description = S("Cement"), + tiles = {"basic_materials_cement_block.png"}, + is_ground_content = true, + groups = {cracky=2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("basic_materials:concrete_block", { + description = S("Concrete Block"), + tiles = {"basic_materials_concrete_block.png",}, + groups = {cracky=1, level=2, concrete=1}, + sounds = default.node_sound_stone_defaults(), +}) + +-- crafts + +minetest.register_craft({ + type = "shapeless", + output = "basic_materials:oil_extract 2", + recipe = { + "group:leaves", + "group:leaves", + "group:leaves", + "group:leaves", + "group:leaves", + "group:leaves" + } +}) + +minetest.register_craft({ + type = "cooking", + output = "basic_materials:paraffin", + recipe = "basic_materials:oil_extract", +}) + +minetest.register_craft({ + type = "fuel", + recipe = "basic_materials:oil_extract", + burntime = 30, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "basic_materials:paraffin", + burntime = 30, +}) + +minetest.register_craft( { + type = "shapeless", + output = "basic_materials:terracotta_base 8", + recipe = { + "bucket:bucket_water", + "default:clay_lump", + "default:gravel", + }, + replacements = { {"bucket:bucket_water", "bucket:bucket_empty"}, }, +}) + +minetest.register_craft({ + type = "shapeless", + output = "basic_materials:wet_cement 3", + recipe = { + "default:dirt", + "dye:dark_grey", + "dye:dark_grey", + "dye:dark_grey", + "bucket:bucket_water" + }, + replacements = {{'bucket:bucket_water', 'bucket:bucket_empty'},}, +}) + +minetest.register_craft({ + type = "cooking", + output = "basic_materials:cement_block", + recipe = "basic_materials:wet_cement", + cooktime = 8 +}) + +minetest.register_craft({ + output = 'basic_materials:concrete_block 6', + recipe = { + {'group:sand', 'basic_materials:wet_cement', 'default:gravel'}, + {'basic_materials:steel_bar', 'basic_materials:wet_cement', 'basic_materials:steel_bar'}, + {'default:gravel', 'basic_materials:wet_cement', 'group:sand'}, + } +}) + +-- aliases + +minetest.register_alias("homedecor:oil_extract", "basic_materials:oil_extract") +minetest.register_alias("homedecor:paraffin", "basic_materials:paraffin") +minetest.register_alias("homedecor:plastic_base", "basic_materials:paraffin") +minetest.register_alias("homedecor:terracotta_base", "basic_materials:terracotta_base") + +minetest.register_alias("gloopblocks:wet_cement", "basic_materials:wet_cement") +minetest.register_alias("gloopblocks:cement", "basic_materials:cement_block") + +minetest.register_alias("technic:concrete", "basic_materials:concrete_block") diff --git a/basic_materials/mod.conf b/basic_materials/mod.conf new file mode 100644 index 0000000..7234bfe --- /dev/null +++ b/basic_materials/mod.conf @@ -0,0 +1,4 @@ +name = basic_materials +depends = default +optional_depends = moreores +min_minetest_version = 5.2.0 diff --git a/basic_materials/models/basic_materials_chains.obj b/basic_materials/models/basic_materials_chains.obj new file mode 100644 index 0000000..78724c9 --- /dev/null +++ b/basic_materials/models/basic_materials_chains.obj @@ -0,0 +1,881 @@ +# Blender v2.73 (sub 0) OBJ File: 'chains.blend' +# www.blender.org +o Torus.016_Torus +v 0.000000 -0.429978 0.000002 +v 0.000000 -0.401109 0.055211 +v -0.014044 -0.391975 0.048870 +v -0.014044 -0.423304 0.000002 +v -0.009826 -0.379748 0.040970 +v -0.009826 -0.406012 0.000002 +v 0.009826 -0.379748 0.040970 +v 0.009826 -0.406012 0.000002 +v 0.014044 -0.391975 0.048870 +v 0.014044 -0.423304 0.000002 +v 0.000000 -0.316336 0.080195 +v -0.014044 -0.316336 0.069112 +v -0.009826 -0.316336 0.057941 +v 0.009826 -0.316336 0.057941 +v 0.014044 -0.316336 0.069112 +v 0.000000 -0.231564 0.055211 +v -0.014044 -0.240700 0.048870 +v -0.009826 -0.252925 0.040970 +v 0.009826 -0.252925 0.040970 +v 0.014044 -0.240700 0.048870 +v 0.000000 -0.202695 0.000002 +v -0.014044 -0.209368 0.000002 +v -0.009826 -0.226661 0.000002 +v 0.009826 -0.226661 0.000002 +v 0.014044 -0.209368 0.000002 +v 0.000000 -0.231564 -0.055206 +v -0.014044 -0.240700 -0.048868 +v -0.009826 -0.252925 -0.040967 +v 0.009826 -0.252925 -0.040967 +v 0.014044 -0.240700 -0.048865 +v 0.000000 -0.316336 -0.080190 +v -0.014044 -0.316336 -0.069108 +v -0.009826 -0.316336 -0.057936 +v 0.009826 -0.316336 -0.057936 +v 0.014044 -0.316336 -0.069108 +v 0.000000 -0.400361 -0.055206 +v -0.014044 -0.391975 -0.048868 +v -0.009826 -0.379748 -0.040967 +v 0.009826 -0.379748 -0.040967 +v 0.014044 -0.391975 -0.048868 +v 0.000000 -0.262249 0.000002 +v -0.061672 -0.233381 0.000002 +v -0.054590 -0.224245 -0.012569 +v 0.000000 -0.255577 -0.012569 +v -0.045765 -0.212018 -0.008794 +v 0.000000 -0.238285 -0.008794 +v -0.045765 -0.212018 0.008798 +v 0.000000 -0.238285 0.008798 +v -0.054590 -0.224245 0.012574 +v 0.000000 -0.255577 0.012574 +v -0.089582 -0.148609 0.000002 +v -0.077200 -0.148609 -0.012569 +v -0.064722 -0.148609 -0.008794 +v -0.064722 -0.148609 0.008799 +v -0.077200 -0.148609 0.012574 +v -0.061672 -0.063837 0.000002 +v -0.054590 -0.072971 -0.012569 +v -0.045765 -0.085198 -0.008794 +v -0.045765 -0.085198 0.008799 +v -0.054590 -0.072971 0.012574 +v 0.000000 -0.034967 0.000002 +v 0.000000 -0.041641 -0.012569 +v 0.000000 -0.058933 -0.008794 +v 0.000000 -0.058933 0.008799 +v 0.000000 -0.041641 0.012574 +v 0.061672 -0.063837 0.000002 +v 0.054590 -0.072971 -0.012569 +v 0.045765 -0.085198 -0.008794 +v 0.045765 -0.085198 0.008799 +v 0.054590 -0.072971 0.012574 +v 0.089582 -0.148609 0.000002 +v 0.077200 -0.148609 -0.012569 +v 0.064722 -0.148609 -0.008794 +v 0.064722 -0.148609 0.008799 +v 0.077200 -0.148609 0.012574 +v 0.061672 -0.232631 0.000002 +v 0.054590 -0.224245 -0.012569 +v 0.045765 -0.212018 -0.008794 +v 0.045765 -0.212018 0.008798 +v 0.054590 -0.224245 0.012574 +v 0.000000 0.073316 0.000002 +v 0.061672 0.102183 0.000002 +v 0.054590 0.111319 0.012574 +v 0.000000 0.079988 0.012574 +v 0.045765 0.123546 0.008799 +v 0.000000 0.097280 0.008799 +v 0.045765 0.123546 -0.008794 +v 0.000000 0.097280 -0.008794 +v 0.054590 0.111319 -0.012569 +v 0.000000 0.079988 -0.012569 +v 0.089582 0.186956 0.000002 +v 0.077200 0.186956 0.012574 +v 0.064722 0.186956 0.008799 +v 0.064722 0.186956 -0.008794 +v 0.077200 0.186956 -0.012569 +v 0.061672 0.271728 0.000002 +v 0.054590 0.262594 0.012574 +v 0.045765 0.250367 0.008799 +v 0.045765 0.250367 -0.008794 +v 0.054590 0.262594 -0.012569 +v 0.000000 0.300597 0.000002 +v 0.000000 0.293923 0.012574 +v 0.000000 0.276631 0.008799 +v 0.000000 0.276631 -0.008794 +v 0.000000 0.293923 -0.012569 +v -0.061672 0.271728 0.000002 +v -0.054590 0.262594 0.012574 +v -0.045765 0.250367 0.008799 +v -0.045765 0.250367 -0.008794 +v -0.054590 0.262594 -0.012569 +v -0.089582 0.186956 0.000002 +v -0.077200 0.186956 0.012574 +v -0.064722 0.186956 0.008799 +v -0.064722 0.186956 -0.008794 +v -0.077200 0.186956 -0.012569 +v -0.061672 0.102931 0.000002 +v -0.054590 0.111319 0.012574 +v -0.045765 0.123546 0.008799 +v -0.045765 0.123546 -0.008794 +v -0.054590 0.111319 -0.012569 +v 0.000000 -0.095037 0.000002 +v 0.000000 -0.066168 -0.055206 +v 0.014044 -0.057034 -0.048868 +v 0.014044 -0.088363 0.000002 +v 0.009826 -0.044807 -0.040967 +v 0.009826 -0.071071 0.000002 +v -0.009826 -0.044807 -0.040967 +v -0.009826 -0.071071 0.000002 +v -0.014044 -0.057034 -0.048868 +v -0.014044 -0.088363 0.000002 +v 0.000000 0.018605 -0.080190 +v 0.014044 0.018605 -0.069108 +v 0.009826 0.018605 -0.057936 +v -0.009826 0.018605 -0.057936 +v -0.014044 0.018605 -0.069108 +v 0.000000 0.103377 -0.055206 +v 0.014044 0.094243 -0.048868 +v 0.009826 0.082016 -0.040967 +v -0.009826 0.082016 -0.040967 +v -0.014044 0.094243 -0.048868 +v 0.000000 0.132246 0.000002 +v 0.014044 0.125572 0.000002 +v 0.009826 0.108280 0.000002 +v -0.009826 0.108280 0.000002 +v -0.014044 0.125572 0.000002 +v 0.000000 0.103377 0.055211 +v 0.014044 0.094243 0.048870 +v 0.009826 0.082016 0.040970 +v -0.009826 0.082016 0.040970 +v -0.014044 0.094243 0.048870 +v 0.000000 0.018605 0.080195 +v 0.014044 0.018605 0.069112 +v 0.009826 0.018605 0.057941 +v -0.009826 0.018605 0.057941 +v -0.014044 0.018605 0.069112 +v 0.000000 -0.065420 0.055211 +v 0.014044 -0.057032 0.048870 +v 0.009826 -0.044807 0.040970 +v -0.009826 -0.044807 0.040970 +v -0.014044 -0.057032 0.048870 +v 0.000000 -0.598329 0.000002 +v 0.061672 -0.569460 0.000002 +v 0.054590 -0.560326 0.012574 +v 0.000000 -0.591655 0.012574 +v 0.045765 -0.548099 0.008798 +v 0.000000 -0.574363 0.008798 +v 0.045765 -0.548099 -0.008794 +v 0.000000 -0.574363 -0.008794 +v 0.054590 -0.560326 -0.012569 +v 0.000000 -0.591655 -0.012569 +v 0.089582 -0.484687 0.000002 +v 0.077200 -0.484687 0.012574 +v 0.064722 -0.484687 0.008798 +v 0.064722 -0.484687 -0.008794 +v 0.077200 -0.484687 -0.012569 +v 0.061672 -0.399915 0.000002 +v 0.054590 -0.409051 0.012574 +v 0.045765 -0.421278 0.008798 +v 0.045765 -0.421278 -0.008794 +v 0.054590 -0.409051 -0.012569 +v 0.000000 -0.371048 0.000002 +v 0.000000 -0.377719 0.012574 +v 0.000000 -0.395012 0.008798 +v 0.000000 -0.395012 -0.008794 +v 0.000000 -0.377719 -0.012569 +v -0.061672 -0.399915 0.000002 +v -0.054590 -0.409051 0.012574 +v -0.045765 -0.421278 0.008798 +v -0.045765 -0.421278 -0.008794 +v -0.054590 -0.409051 -0.012569 +v -0.089582 -0.484687 0.000002 +v -0.077200 -0.484687 0.012574 +v -0.064722 -0.484687 0.008798 +v -0.064722 -0.484687 -0.008794 +v -0.077200 -0.484687 -0.012569 +v -0.061672 -0.568712 0.000002 +v -0.054590 -0.560326 0.012574 +v -0.045765 -0.548099 0.008798 +v -0.045765 -0.548099 -0.008794 +v -0.054590 -0.560326 -0.012569 +v 0.000000 0.241043 0.000002 +v 0.000000 0.269910 0.055211 +v -0.014044 0.279047 0.048870 +v -0.014044 0.247717 0.000002 +v -0.009826 0.291274 0.040970 +v -0.009826 0.265007 0.000002 +v 0.009826 0.291274 0.040970 +v 0.009826 0.265007 0.000002 +v 0.014044 0.279047 0.048870 +v 0.014044 0.247717 0.000002 +v 0.000000 0.354683 0.080195 +v -0.014044 0.354683 0.069112 +v -0.009826 0.354683 0.057941 +v 0.009826 0.354683 0.057941 +v 0.014044 0.354683 0.069112 +v 0.000000 0.439455 0.055211 +v -0.014044 0.430321 0.048870 +v -0.009826 0.418094 0.040970 +v 0.009826 0.418094 0.040970 +v 0.014044 0.430321 0.048870 +v 0.000000 0.468325 0.000002 +v -0.014044 0.461651 0.000002 +v -0.009826 0.444361 0.000002 +v 0.009826 0.444361 0.000002 +v 0.014044 0.461651 0.000002 +v 0.000000 0.439455 -0.055206 +v -0.014044 0.430321 -0.048868 +v -0.009826 0.418094 -0.040967 +v 0.009826 0.418094 -0.040967 +v 0.014044 0.430321 -0.048868 +v 0.000000 0.354683 -0.080190 +v -0.014044 0.354683 -0.069108 +v -0.009826 0.354683 -0.057936 +v 0.009826 0.354683 -0.057936 +v 0.014044 0.354683 -0.069108 +v 0.000000 0.270661 -0.055206 +v -0.014044 0.279047 -0.048868 +v -0.009826 0.291274 -0.040967 +v 0.009826 0.291274 -0.040967 +v 0.014044 0.279047 -0.048868 +vt 0.187500 0.125000 +vt 0.250000 0.125000 +vt 0.250000 0.187500 +vt 0.187500 0.187500 +vt 0.250000 0.250000 +vt 0.187500 0.250000 +vt 0.250000 0.312500 +vt 0.187500 0.312500 +vt 0.250000 0.375000 +vt 0.187500 0.375000 +vt 0.187500 0.062500 +vt 0.250000 0.062500 +vt 0.312500 0.125000 +vt 0.312500 0.187500 +vt 0.312500 0.250000 +vt 0.312500 0.312500 +vt 0.312500 0.375000 +vt 0.312500 0.062500 +vt 0.375000 0.125000 +vt 0.375000 0.187500 +vt 0.375000 0.250000 +vt 0.375000 0.312500 +vt 0.375000 0.375000 +vt 0.375000 0.062500 +vt 0.437500 0.125000 +vt 0.437500 0.187500 +vt 0.437500 0.250000 +vt 0.437500 0.312500 +vt 0.437500 0.375000 +vt 0.437500 0.062500 +vt 0.500000 0.125000 +vt 0.500000 0.187500 +vt 0.500000 0.250000 +vt 0.500000 0.312500 +vt 0.500000 0.375000 +vt 0.500000 0.062500 +vt -0.000000 0.125000 +vt 0.062500 0.125000 +vt 0.062500 0.187500 +vt -0.000000 0.187500 +vt 0.062500 0.250000 +vt -0.000000 0.250000 +vt 0.062500 0.312500 +vt -0.000000 0.312500 +vt 0.062500 0.375000 +vt -0.000000 0.375000 +vt -0.000000 0.062500 +vt 0.062500 0.062500 +vt 0.125000 0.125000 +vt 0.125000 0.187500 +vt 0.125000 0.250000 +vt 0.125000 0.312500 +vt 0.125000 0.375000 +vt 0.125000 0.062500 +vt 0.750000 0.625000 +vt 0.812500 0.625000 +vt 0.812500 0.687500 +vt 0.750000 0.687500 +vt 0.750000 0.375000 +vt 0.812500 0.375000 +vt 0.812500 0.437500 +vt 0.750000 0.437500 +vt 0.812500 0.500000 +vt 0.750000 0.500000 +vt 0.812500 0.562500 +vt 0.750000 0.562500 +vt 0.875000 0.625000 +vt 0.875000 0.687500 +vt 0.875000 0.375000 +vt 0.875000 0.437500 +vt 0.875000 0.500000 +vt 0.875000 0.562500 +vt 0.937500 0.625000 +vt 0.937500 0.687500 +vt 0.937500 0.375000 +vt 0.937500 0.437500 +vt 0.937500 0.500000 +vt 0.937500 0.562500 +vt 1.000000 0.625000 +vt 1.000000 0.687500 +vt 1.000000 0.375000 +vt 1.000000 0.437500 +vt 1.000000 0.500000 +vt 1.000000 0.562500 +vt 0.500000 0.625000 +vt 0.562500 0.625000 +vt 0.562500 0.687500 +vt 0.500000 0.687500 +vt 0.562500 0.375000 +vt 0.562500 0.437500 +vt 0.500000 0.437500 +vt 0.562500 0.500000 +vt 0.500000 0.500000 +vt 0.562500 0.562500 +vt 0.500000 0.562500 +vt 0.625000 0.625000 +vt 0.625000 0.687500 +vt 0.625000 0.375000 +vt 0.625000 0.437500 +vt 0.625000 0.500000 +vt 0.625000 0.562500 +vt 0.687500 0.625000 +vt 0.687500 0.687500 +vt 0.687500 0.375000 +vt 0.687500 0.437500 +vt 0.687500 0.500000 +vt 0.687500 0.562500 +vt 0.250000 0.625000 +vt 0.312500 0.625000 +vt 0.312500 0.687500 +vt 0.250000 0.687500 +vt 0.312500 0.437500 +vt 0.250000 0.437500 +vt 0.312500 0.500000 +vt 0.250000 0.500000 +vt 0.312500 0.562500 +vt 0.250000 0.562500 +vt 0.375000 0.625000 +vt 0.375000 0.687500 +vt 0.375000 0.437500 +vt 0.375000 0.500000 +vt 0.375000 0.562500 +vt 0.437500 0.625000 +vt 0.437500 0.687500 +vt 0.437500 0.437500 +vt 0.437500 0.500000 +vt 0.437500 0.562500 +vt -0.000000 0.625000 +vt 0.062500 0.625000 +vt 0.062500 0.687500 +vt -0.000000 0.687500 +vt 0.062500 0.437500 +vt -0.000000 0.437500 +vt 0.062500 0.500000 +vt -0.000000 0.500000 +vt 0.062500 0.562500 +vt -0.000000 0.562500 +vt 0.125000 0.625000 +vt 0.125000 0.687500 +vt 0.125000 0.437500 +vt 0.125000 0.500000 +vt 0.125000 0.562500 +vt 0.187500 0.625000 +vt 0.187500 0.687500 +vt 0.187500 0.437500 +vt 0.187500 0.500000 +vt 0.187500 0.562500 +vt 0.687500 0.750000 +vt 0.750000 0.750000 +vt 0.750000 0.812500 +vt 0.687500 0.812500 +vt 0.750000 0.875000 +vt 0.687500 0.875000 +vt 0.750000 0.937500 +vt 0.687500 0.937500 +vt 0.750000 1.000000 +vt 0.687500 1.000000 +vt 0.812500 0.750000 +vt 0.812500 0.812500 +vt 0.812500 0.875000 +vt 0.812500 0.937500 +vt 0.812500 1.000000 +vt 0.875000 0.750000 +vt 0.875000 0.812500 +vt 0.875000 0.875000 +vt 0.875000 0.937500 +vt 0.875000 1.000000 +vt 0.937500 0.750000 +vt 0.937500 0.812500 +vt 0.937500 0.875000 +vt 0.937500 0.937500 +vt 0.937500 1.000000 +vt 1.000000 0.750000 +vt 1.000000 0.812500 +vt 1.000000 0.875000 +vt 1.000000 0.937500 +vt 1.000000 1.000000 +vt 0.500000 0.750000 +vt 0.562500 0.750000 +vt 0.562500 0.812500 +vt 0.500000 0.812500 +vt 0.562500 0.875000 +vt 0.500000 0.875000 +vt 0.562500 0.937500 +vt 0.500000 0.937500 +vt 0.562500 1.000000 +vt 0.500000 1.000000 +vt 0.625000 0.750000 +vt 0.625000 0.812500 +vt 0.625000 0.875000 +vt 0.625000 0.937500 +vt 0.625000 1.000000 +vt 0.750000 0.312500 +vt 0.812500 0.312500 +vt 0.750000 0.062500 +vt 0.812500 0.062500 +vt 0.812500 0.125000 +vt 0.750000 0.125000 +vt 0.812500 0.187500 +vt 0.750000 0.187500 +vt 0.812500 0.250000 +vt 0.750000 0.250000 +vt 0.875000 0.312500 +vt 0.875000 0.062500 +vt 0.875000 0.125000 +vt 0.875000 0.187500 +vt 0.875000 0.250000 +vt 0.937500 0.312500 +vt 0.937500 0.062500 +vt 0.937500 0.125000 +vt 0.937500 0.187500 +vt 0.937500 0.250000 +vt 1.000000 0.312500 +vt 1.000000 0.062500 +vt 1.000000 0.125000 +vt 1.000000 0.187500 +vt 1.000000 0.250000 +vt 0.562500 0.312500 +vt 0.562500 0.062500 +vt 0.562500 0.125000 +vt 0.562500 0.187500 +vt 0.562500 0.250000 +vt 0.625000 0.312500 +vt 0.625000 0.062500 +vt 0.625000 0.125000 +vt 0.625000 0.187500 +vt 0.625000 0.250000 +vt 0.687500 0.312500 +vt 0.687500 0.062500 +vt 0.687500 0.125000 +vt 0.687500 0.187500 +vt 0.687500 0.250000 +vt 0.250000 0.937500 +vt 0.312500 0.937500 +vt 0.312500 1.000000 +vt 0.250000 1.000000 +vt 0.312500 0.750000 +vt 0.250000 0.750000 +vt 0.312500 0.812500 +vt 0.250000 0.812500 +vt 0.312500 0.875000 +vt 0.250000 0.875000 +vt 0.375000 0.937500 +vt 0.375000 1.000000 +vt 0.375000 0.750000 +vt 0.375000 0.812500 +vt 0.375000 0.875000 +vt 0.437500 0.937500 +vt 0.437500 1.000000 +vt 0.437500 0.750000 +vt 0.437500 0.812500 +vt 0.437500 0.875000 +vt 0.000000 0.937500 +vt 0.062500 0.937500 +vt 0.062500 1.000000 +vt 0.000000 1.000000 +vt 0.062500 0.750000 +vt 0.000000 0.750000 +vt 0.062500 0.812500 +vt 0.000000 0.812500 +vt 0.062500 0.875000 +vt 0.000000 0.875000 +vt 0.125000 0.937500 +vt 0.125000 1.000000 +vt 0.125000 0.750000 +vt 0.125000 0.812500 +vt 0.125000 0.875000 +vt 0.187500 0.937500 +vt 0.187500 1.000000 +vt 0.187500 0.750000 +vt 0.187500 0.812500 +vt 0.187500 0.875000 +vn 0.000000 -1.000000 -0.004800 +vn 0.000000 -0.657400 0.753500 +vn -0.898300 -0.248500 0.362300 +vn -0.863600 -0.504100 -0.003400 +vn -0.661500 0.421500 -0.620200 +vn -0.746000 0.665900 0.000000 +vn 0.661500 0.421500 -0.620200 +vn 0.746000 0.665900 0.000000 +vn 0.898300 -0.248500 0.362300 +vn 0.863600 -0.504100 -0.003400 +vn 0.000000 0.000000 1.000000 +vn -0.925200 0.000000 0.379500 +vn -0.617100 0.000000 -0.786900 +vn 0.617100 0.000000 -0.786900 +vn 0.925200 0.000000 0.379500 +vn 0.000000 0.657400 0.753500 +vn -0.898300 0.248400 0.362300 +vn -0.661500 -0.421500 -0.620200 +vn 0.661500 -0.421500 -0.620200 +vn 0.898300 0.248400 0.362300 +vn 0.000000 1.000000 0.000000 +vn -0.866100 0.499800 0.000000 +vn -0.746000 -0.665900 0.000000 +vn 0.746000 -0.665900 0.000000 +vn 0.866100 0.499800 0.000000 +vn 0.000000 0.657400 -0.753500 +vn -0.898300 0.248400 -0.362400 +vn -0.661600 -0.421500 0.620200 +vn 0.661500 -0.421500 0.620200 +vn 0.898300 0.248400 -0.362300 +vn 0.000000 -0.000900 -1.000000 +vn -0.924600 -0.000600 -0.380700 +vn -0.617100 0.000000 0.786900 +vn 0.617100 0.000000 0.786900 +vn 0.924700 -0.000600 -0.380700 +vn 0.000000 -0.650300 -0.759600 +vn -0.895600 -0.254600 -0.364800 +vn -0.661600 0.421500 0.620200 +vn 0.661600 0.421500 0.620200 +vn 0.895600 -0.254600 -0.364800 +vn 0.004900 -1.000000 0.000000 +vn -0.729700 -0.683800 0.000000 +vn -0.324500 -0.256300 -0.910500 +vn 0.003300 -0.475500 -0.879700 +vn 0.578700 0.436200 -0.689100 +vn 0.000000 0.666600 -0.745400 +vn 0.578700 0.436200 0.689100 +vn 0.000000 0.666600 0.745400 +vn -0.324500 -0.256300 0.910500 +vn 0.003300 -0.475500 0.879700 +vn -1.000000 0.000000 0.000000 +vn -0.359600 0.000000 -0.933100 +vn 0.756400 0.000000 -0.654100 +vn 0.756400 0.000000 0.654100 +vn -0.359600 0.000000 0.933100 +vn -0.729700 0.683700 0.000000 +vn -0.324500 0.256300 -0.910500 +vn 0.578700 -0.436200 -0.689100 +vn 0.578700 -0.436200 0.689100 +vn -0.324500 0.256300 0.910500 +vn 0.000000 0.470900 -0.882200 +vn 0.000000 -0.666600 -0.745400 +vn 0.000000 -0.666600 0.745400 +vn 0.000000 0.470900 0.882200 +vn 0.729700 0.683700 0.000000 +vn 0.324500 0.256300 -0.910500 +vn -0.578700 -0.436200 -0.689100 +vn -0.578700 -0.436200 0.689100 +vn 0.324500 0.256300 0.910500 +vn 1.000000 -0.001100 0.000000 +vn 0.361000 -0.000700 -0.932600 +vn -0.756400 0.000000 -0.654100 +vn -0.756400 0.000000 0.654100 +vn 0.361000 -0.000700 0.932600 +vn 0.736100 -0.676800 0.000000 +vn 0.327100 -0.263100 -0.907600 +vn -0.578700 0.436200 -0.689100 +vn -0.578700 0.436200 0.689100 +vn 0.327100 -0.263100 0.907600 +vn -0.004900 -1.000000 0.000000 +vn 0.729700 -0.683800 0.000000 +vn 0.324500 -0.256300 0.910500 +vn -0.003300 -0.475400 0.879700 +vn 0.324500 -0.256300 -0.910500 +vn -0.003300 -0.475400 -0.879700 +vn 1.000000 0.000000 0.000000 +vn 0.359600 0.000000 0.933100 +vn 0.359600 0.000000 -0.933100 +vn -1.000000 -0.001100 0.000000 +vn -0.361000 -0.000700 0.932600 +vn -0.361000 -0.000700 -0.932600 +vn -0.736100 -0.676800 0.000000 +vn -0.327100 -0.263100 0.907600 +vn -0.327100 -0.263100 -0.907600 +vn 0.000000 -1.000000 0.004800 +vn 0.000000 -0.657400 -0.753500 +vn 0.898300 -0.248500 -0.362400 +vn 0.863600 -0.504100 0.003400 +vn -0.898300 -0.248500 -0.362400 +vn -0.863600 -0.504100 0.003400 +vn 0.000000 0.000000 -1.000000 +vn 0.925200 0.000000 -0.379500 +vn -0.925200 0.000000 -0.379500 +vn 0.898300 0.248500 -0.362400 +vn 0.661600 -0.421500 0.620200 +vn -0.898300 0.248500 -0.362400 +vn 0.898300 0.248500 0.362300 +vn -0.898300 0.248500 0.362300 +vn 0.000000 -0.000900 1.000000 +vn 0.924700 -0.000600 0.380700 +vn -0.924700 -0.000600 0.380700 +vn 0.000000 -0.650300 0.759600 +vn 0.895600 -0.254600 0.364700 +vn -0.895600 -0.254600 0.364700 +vn 0.729700 -0.683700 0.000000 +vn 0.729700 0.683800 0.000000 +vn -0.729700 0.683800 0.000000 +vn -0.898300 -0.248400 0.362300 +vn -0.863600 -0.504100 -0.003500 +vn 0.898300 -0.248400 0.362300 +vn 0.863600 -0.504100 -0.003500 +vn -0.661500 -0.421500 0.620200 +vn 0.924600 -0.000600 -0.380700 +vn -0.661500 0.421500 0.620200 +vn 0.661500 0.421500 0.620200 +s 1 +f 1/1/1 2/2/2 3/3/3 4/4/4 +f 4/4/4 3/3/3 5/5/5 6/6/6 +f 6/6/6 5/5/5 7/7/7 8/8/8 +f 8/8/8 7/7/7 9/9/9 10/10/10 +f 1/1/1 10/11/10 9/12/9 2/2/2 +f 2/2/2 11/13/11 12/14/12 3/3/3 +f 3/3/3 12/14/12 13/15/13 5/5/5 +f 5/5/5 13/15/13 14/16/14 7/7/7 +f 7/7/7 14/16/14 15/17/15 9/9/9 +f 9/12/9 15/18/15 11/13/11 2/2/2 +f 11/13/11 16/19/16 17/20/17 12/14/12 +f 12/14/12 17/20/17 18/21/18 13/15/13 +f 13/15/13 18/21/18 19/22/19 14/16/14 +f 14/16/14 19/22/19 20/23/20 15/17/15 +f 15/18/15 20/24/20 16/19/16 11/13/11 +f 16/19/16 21/25/21 22/26/22 17/20/17 +f 17/20/17 22/26/22 23/27/23 18/21/18 +f 18/21/18 23/27/23 24/28/24 19/22/19 +f 19/22/19 24/28/24 25/29/25 20/23/20 +f 20/24/20 25/30/25 21/25/21 16/19/16 +f 21/25/21 26/31/26 27/32/27 22/26/22 +f 22/26/22 27/32/27 28/33/28 23/27/23 +f 23/27/23 28/33/28 29/34/29 24/28/24 +f 24/28/24 29/34/29 30/35/30 25/29/25 +f 25/30/25 30/36/30 26/31/26 21/25/21 +f 26/37/26 31/38/31 32/39/32 27/40/27 +f 27/40/27 32/39/32 33/41/33 28/42/28 +f 28/42/28 33/41/33 34/43/34 29/44/29 +f 29/44/29 34/43/34 35/45/35 30/46/30 +f 30/47/30 35/48/35 31/38/31 26/37/26 +f 31/38/31 36/49/36 37/50/37 32/39/32 +f 32/39/32 37/50/37 38/51/38 33/41/33 +f 33/41/33 38/51/38 39/52/39 34/43/34 +f 34/43/34 39/52/39 40/53/40 35/45/35 +f 35/48/35 40/54/40 36/49/36 31/38/31 +f 36/49/36 1/1/1 4/4/4 37/50/37 +f 37/50/37 4/4/4 6/6/6 38/51/38 +f 38/51/38 6/6/6 8/8/8 39/52/39 +f 39/52/39 8/8/8 10/10/10 40/53/40 +f 1/1/1 36/49/36 40/54/40 10/11/10 +f 41/55/41 42/56/42 43/57/43 44/58/44 +f 44/59/44 43/60/43 45/61/45 46/62/46 +f 46/62/46 45/61/45 47/63/47 48/64/48 +f 48/64/48 47/63/47 49/65/49 50/66/50 +f 41/55/41 50/66/50 49/65/49 42/56/42 +f 42/56/42 51/67/51 52/68/52 43/57/43 +f 43/60/43 52/69/52 53/70/53 45/61/45 +f 45/61/45 53/70/53 54/71/54 47/63/47 +f 47/63/47 54/71/54 55/72/55 49/65/49 +f 49/65/49 55/72/55 51/67/51 42/56/42 +f 51/67/51 56/73/56 57/74/57 52/68/52 +f 52/69/52 57/75/57 58/76/58 53/70/53 +f 53/70/53 58/76/58 59/77/59 54/71/54 +f 54/71/54 59/77/59 60/78/60 55/72/55 +f 55/72/55 60/78/60 56/73/56 51/67/51 +f 56/73/56 61/79/21 62/80/61 57/74/57 +f 57/75/57 62/81/61 63/82/62 58/76/58 +f 58/76/58 63/82/62 64/83/63 59/77/59 +f 59/77/59 64/83/63 65/84/64 60/78/60 +f 60/78/60 65/84/64 61/79/21 56/73/56 +f 61/85/21 66/86/65 67/87/66 62/88/61 +f 62/35/61 67/89/66 68/90/67 63/91/62 +f 63/91/62 68/90/67 69/92/68 64/93/63 +f 64/93/63 69/92/68 70/94/69 65/95/64 +f 65/95/64 70/94/69 66/86/65 61/85/21 +f 66/86/65 71/96/70 72/97/71 67/87/66 +f 67/89/66 72/98/71 73/99/72 68/90/67 +f 68/90/67 73/99/72 74/100/73 69/92/68 +f 69/92/68 74/100/73 75/101/74 70/94/69 +f 70/94/69 75/101/74 71/96/70 66/86/65 +f 71/96/70 76/102/75 77/103/76 72/97/71 +f 72/98/71 77/104/76 78/105/77 73/99/72 +f 73/99/72 78/105/77 79/106/78 74/100/73 +f 74/100/73 79/106/78 80/107/79 75/101/74 +f 75/101/74 80/107/79 76/102/75 71/96/70 +f 76/102/75 41/55/41 44/58/44 77/103/76 +f 77/104/76 44/59/44 46/62/46 78/105/77 +f 78/105/77 46/62/46 48/64/48 79/106/78 +f 79/106/78 48/64/48 50/66/50 80/107/79 +f 41/55/41 76/102/75 80/107/79 50/66/50 +f 81/108/80 82/109/81 83/110/82 84/111/83 +f 84/9/83 83/17/82 85/112/78 86/113/48 +f 86/113/48 85/112/78 87/114/77 88/115/46 +f 88/115/46 87/114/77 89/116/84 90/117/85 +f 81/108/80 90/117/85 89/116/84 82/109/81 +f 82/109/81 91/118/86 92/119/87 83/110/82 +f 83/17/82 92/23/87 93/120/73 85/112/78 +f 85/112/78 93/120/73 94/121/72 87/114/77 +f 87/114/77 94/121/72 95/122/88 89/116/84 +f 89/116/84 95/122/88 91/118/86 82/109/81 +f 91/118/86 96/123/65 97/124/69 92/119/87 +f 92/23/87 97/29/69 98/125/68 93/120/73 +f 93/120/73 98/125/68 99/126/67 94/121/72 +f 94/121/72 99/126/67 100/127/66 95/122/88 +f 95/122/88 100/127/66 96/123/65 91/118/86 +f 96/123/65 101/85/21 102/88/64 97/124/69 +f 97/29/69 102/35/64 103/91/63 98/125/68 +f 98/125/68 103/91/63 104/93/62 99/126/67 +f 99/126/67 104/93/62 105/95/61 100/127/66 +f 100/127/66 105/95/61 101/85/21 96/123/65 +f 101/128/21 106/129/56 107/130/60 102/131/64 +f 102/46/64 107/45/60 108/132/59 103/133/63 +f 103/133/63 108/132/59 109/134/58 104/135/62 +f 104/135/62 109/134/58 110/136/57 105/137/61 +f 105/137/61 110/136/57 106/129/56 101/128/21 +f 106/129/56 111/138/89 112/139/90 107/130/60 +f 107/45/60 112/53/90 113/140/54 108/132/59 +f 108/132/59 113/140/54 114/141/53 109/134/58 +f 109/134/58 114/141/53 115/142/91 110/136/57 +f 110/136/57 115/142/91 111/138/89 106/129/56 +f 111/138/89 116/143/92 117/144/93 112/139/90 +f 112/53/90 117/10/93 118/145/47 113/140/54 +f 113/140/54 118/145/47 119/146/45 114/141/53 +f 114/141/53 119/146/45 120/147/94 115/142/91 +f 115/142/91 120/147/94 116/143/92 111/138/89 +f 116/143/92 81/108/80 84/111/83 117/144/93 +f 117/10/93 84/9/83 86/113/48 118/145/47 +f 118/145/47 86/113/48 88/115/46 119/146/45 +f 119/146/45 88/115/46 90/117/85 120/147/94 +f 81/108/80 116/143/92 120/147/94 90/117/85 +f 121/148/95 122/149/96 123/150/97 124/151/98 +f 124/151/98 123/150/97 125/152/39 126/153/8 +f 126/153/8 125/152/39 127/154/38 128/155/6 +f 128/155/6 127/154/38 129/156/99 130/157/100 +f 121/148/95 130/103/100 129/58/99 122/149/96 +f 122/149/96 131/158/101 132/159/102 123/150/97 +f 123/150/97 132/159/102 133/160/34 125/152/39 +f 125/152/39 133/160/34 134/161/33 127/154/38 +f 127/154/38 134/161/33 135/162/103 129/156/99 +f 129/58/99 135/57/103 131/158/101 122/149/96 +f 131/158/101 136/163/26 137/164/104 132/159/102 +f 132/159/102 137/164/104 138/165/105 133/160/34 +f 133/160/34 138/165/105 139/166/28 134/161/33 +f 134/161/33 139/166/28 140/167/106 135/162/103 +f 135/57/103 140/68/106 136/163/26 131/158/101 +f 136/163/26 141/168/21 142/169/25 137/164/104 +f 137/164/104 142/169/25 143/170/24 138/165/105 +f 138/165/105 143/170/24 144/171/23 139/166/28 +f 139/166/28 144/171/23 145/172/22 140/167/106 +f 140/68/106 145/74/22 141/168/21 136/163/26 +f 141/168/21 146/173/16 147/174/107 142/169/25 +f 142/169/25 147/174/107 148/175/19 143/170/24 +f 143/170/24 148/175/19 149/176/18 144/171/23 +f 144/171/23 149/176/18 150/177/108 145/172/22 +f 145/74/22 150/80/108 146/173/16 141/168/21 +f 146/178/16 151/179/109 152/180/110 147/181/107 +f 147/181/107 152/180/110 153/182/14 148/183/19 +f 148/183/19 153/182/14 154/184/13 149/185/18 +f 149/185/18 154/184/13 155/186/111 150/187/108 +f 150/88/108 155/87/111 151/179/109 146/178/16 +f 151/179/109 156/188/112 157/189/113 152/180/110 +f 152/180/110 157/189/113 158/190/7 153/182/14 +f 153/182/14 158/190/7 159/191/5 154/184/13 +f 154/184/13 159/191/5 160/192/114 155/186/111 +f 155/87/111 160/97/114 156/188/112 151/179/109 +f 156/188/112 121/148/95 124/151/98 157/189/113 +f 157/189/113 124/151/98 126/153/8 158/190/7 +f 158/190/7 126/153/8 128/155/6 159/191/5 +f 159/191/5 128/155/6 130/157/100 160/192/114 +f 121/148/95 156/188/112 160/97/114 130/103/100 +f 161/193/80 162/194/115 163/60/82 164/59/83 +f 164/195/83 163/196/82 165/197/78 166/198/48 +f 166/198/48 165/197/78 167/199/77 168/200/46 +f 168/200/46 167/199/77 169/201/84 170/202/85 +f 161/193/80 170/202/85 169/201/84 162/194/115 +f 162/194/115 171/203/86 172/69/87 163/60/82 +f 163/196/82 172/204/87 173/205/73 165/197/78 +f 165/197/78 173/205/73 174/206/72 167/199/77 +f 167/199/77 174/206/72 175/207/88 169/201/84 +f 169/201/84 175/207/88 171/203/86 162/194/115 +f 171/203/86 176/208/116 177/75/69 172/69/87 +f 172/204/87 177/209/69 178/210/68 173/205/73 +f 173/205/73 178/210/68 179/211/67 174/206/72 +f 174/206/72 179/211/67 180/212/66 175/207/88 +f 175/207/88 180/212/66 176/208/116 171/203/86 +f 176/208/116 181/213/21 182/81/64 177/75/69 +f 177/209/69 182/214/64 183/215/63 178/210/68 +f 178/210/68 183/215/63 184/216/62 179/211/67 +f 179/211/67 184/216/62 185/217/61 180/212/66 +f 180/212/66 185/217/61 181/213/21 176/208/116 +f 181/34/21 186/218/117 187/89/60 182/35/64 +f 182/36/64 187/219/60 188/220/59 183/31/63 +f 183/31/63 188/220/59 189/221/58 184/32/62 +f 184/32/62 189/221/58 190/222/57 185/33/61 +f 185/33/61 190/222/57 186/218/117 181/34/21 +f 186/218/117 191/223/89 192/98/90 187/89/60 +f 187/219/60 192/224/90 193/225/54 188/220/59 +f 188/220/59 193/225/54 194/226/53 189/221/58 +f 189/221/58 194/226/53 195/227/91 190/222/57 +f 190/222/57 195/227/91 191/223/89 186/218/117 +f 191/223/89 196/228/92 197/104/93 192/98/90 +f 192/224/90 197/229/93 198/230/47 193/225/54 +f 193/225/54 198/230/47 199/231/45 194/226/53 +f 194/226/53 199/231/45 200/232/94 195/227/91 +f 195/227/91 200/232/94 196/228/92 191/223/89 +f 196/228/92 161/193/80 164/59/83 197/104/93 +f 197/229/93 164/195/83 166/198/48 198/230/47 +f 198/230/47 166/198/48 168/200/46 199/231/45 +f 199/231/45 168/200/46 170/202/85 200/232/94 +f 161/193/80 196/228/92 200/232/94 170/202/85 +f 201/233/1 202/234/2 203/235/118 204/236/119 +f 204/111/119 203/110/118 205/237/5 206/238/6 +f 206/238/6 205/237/5 207/239/7 208/240/8 +f 208/240/8 207/239/7 209/241/120 210/242/121 +f 201/233/1 210/242/121 209/241/120 202/234/2 +f 202/234/2 211/243/11 212/244/12 203/235/118 +f 203/110/118 212/119/12 213/245/13 205/237/5 +f 205/237/5 213/245/13 214/246/14 207/239/7 +f 207/239/7 214/246/14 215/247/15 209/241/120 +f 209/241/120 215/247/15 211/243/11 202/234/2 +f 211/243/11 216/248/16 217/249/108 212/244/12 +f 212/119/12 217/124/108 218/250/18 213/245/13 +f 213/245/13 218/250/18 219/251/19 214/246/14 +f 214/246/14 219/251/19 220/252/107 215/247/15 +f 215/247/15 220/252/107 216/248/16 211/243/11 +f 216/248/16 221/185/21 222/187/22 217/249/108 +f 217/124/108 222/88/22 223/178/23 218/250/18 +f 218/250/18 223/178/23 224/181/24 219/251/19 +f 219/251/19 224/181/24 225/183/25 220/252/107 +f 220/252/107 225/183/25 221/185/21 216/248/16 +f 221/253/21 226/254/26 227/255/106 222/256/22 +f 222/131/22 227/130/106 228/257/122 223/258/23 +f 223/258/23 228/257/122 229/259/29 224/260/24 +f 224/260/24 229/259/29 230/261/104 225/262/25 +f 225/262/25 230/261/104 226/254/26 221/253/21 +f 226/254/26 231/263/31 232/264/32 227/255/106 +f 227/130/106 232/139/32 233/265/33 228/257/122 +f 228/257/122 233/265/33 234/266/34 229/259/29 +f 229/259/29 234/266/34 235/267/123 230/261/104 +f 230/261/104 235/267/123 231/263/31 226/254/26 +f 231/263/31 236/268/36 237/269/37 232/264/32 +f 232/139/32 237/144/37 238/270/124 233/265/33 +f 233/265/33 238/270/124 239/271/125 234/266/34 +f 234/266/34 239/271/125 240/272/40 235/267/123 +f 235/267/123 240/272/40 236/268/36 231/263/31 +f 236/268/36 201/233/1 204/236/119 237/269/37 +f 237/144/37 204/111/119 206/238/6 238/270/124 +f 238/270/124 206/238/6 208/240/8 239/271/125 +f 239/271/125 208/240/8 210/242/121 240/272/40 +f 201/233/1 236/268/36 240/272/40 210/242/121 diff --git a/basic_materials/plastics.lua b/basic_materials/plastics.lua new file mode 100644 index 0000000..e29af53 --- /dev/null +++ b/basic_materials/plastics.lua @@ -0,0 +1,56 @@ +-- Translation support +local S = minetest.get_translator("basic_materials") + +-- items + +minetest.register_craftitem("basic_materials:plastic_sheet", { + description = S("Plastic sheet"), + inventory_image = "basic_materials_plastic_sheet.png", +}) + +minetest.register_craftitem("basic_materials:plastic_strip", { + description = S("Plastic strips"), + groups = { strip = 1 }, + inventory_image = "basic_materials_plastic_strip.png", +}) + +minetest.register_craftitem("basic_materials:empty_spool", { + description = S("Empty wire spool"), + inventory_image = "basic_materials_empty_spool.png" +}) + +-- crafts + +minetest.register_craft({ + type = "cooking", + output = "basic_materials:plastic_sheet", + recipe = "basic_materials:paraffin", +}) + +minetest.register_craft({ + type = "fuel", + recipe = "basic_materials:plastic_sheet", + burntime = 30, +}) + +minetest.register_craft( { + output = "basic_materials:plastic_strip 9", + recipe = { + { "basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet" } + }, +}) + +minetest.register_craft( { + output = "basic_materials:empty_spool 3", + recipe = { + { "basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet" }, + { "", "basic_materials:plastic_sheet", "" }, + { "basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet" } + }, +}) + +-- aliases + +minetest.register_alias("homedecor:plastic_sheeting", "basic_materials:plastic_sheet") +minetest.register_alias("homedecor:plastic_strips", "basic_materials:plastic_strip") +minetest.register_alias("homedecor:empty_spool", "basic_materials:empty_spool") diff --git a/basic_materials/textures/basic_materials_brass_block.png b/basic_materials/textures/basic_materials_brass_block.png new file mode 100644 index 0000000000000000000000000000000000000000..c93780002f87ced40ad5cd844688948d20ae8ac9 GIT binary patch literal 272 zcmV+r0q_2aP)QAOHgp5C8x(050AB*_x`W!T=5K?%SEV?y&$p{{H{lo9lo84(;v! z`}%WB5`?cueVTx0*^E2e6CAk@9U$q7a6US*<7tZ^V-h$jBzVo87_Qrt>rjZ zLZCMXtGZFQN6*p}qh=|k;^VD83hTEnGx;DPF!Pi6H|b?HelzCZd%O6-zjXF)S*BSI Tw|Pu}wlH|Q`njxgN@xNA6Yo-v literal 0 HcmV?d00001 diff --git a/basic_materials/textures/basic_materials_cement_block.png b/basic_materials/textures/basic_materials_cement_block.png new file mode 100644 index 0000000000000000000000000000000000000000..6d30f477f359e93a71112578baace525ce0f0fdc GIT binary patch literal 243 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 Y0yypkc?hzDnE(I)07*qoM6N<$g3I$jPXGV_ literal 0 HcmV?d00001 diff --git a/basic_materials/textures/basic_materials_chainlink_brass.png b/basic_materials/textures/basic_materials_chainlink_brass.png new file mode 100644 index 0000000000000000000000000000000000000000..9a1ad87e5c4ec6bedb9fa3fcb8bf9c36b2841a57 GIT binary patch literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^3h)VW1=2k^8k@U}4@@yTw<_e> zl@)7JuCE4)GL{7S1v5B2yO9Ru_<6cGhH%KT9(3etHV|MqurTLclfJ;Oh9$Fh@A{^< z;{X3HV+MwRdBQvTS$DXyzI>(N-KXtxU**TObheBA+nWB{sdS{V1)3_Jdt ZY;yS)^B@^VH=qj`JYD@<);T3K0RX*6Kz#rJ literal 0 HcmV?d00001 diff --git a/basic_materials/textures/basic_materials_concrete_block.png b/basic_materials/textures/basic_materials_concrete_block.png new file mode 100644 index 0000000000000000000000000000000000000000..5dd0d660a238c6ca7f0274f260f9afb320b77277 GIT binary patch literal 252 zcmVY`8QRl6>1%B6N=CI;5pv6_`|C`xS z|39tB`Tu28&HpzWTK<37J>~!1O;i6r**fk2mBnrUcXww0JJp-=X?d3G`^9mlXICZ} zm%|Mxwv_z;c245|&#Mdn|J>gA|KH&$|NmWB@&EtrtzZmdgTz2`AT^JsME$R_mH7`h zpvhI?-}-FF{}UqZ{$H6s`C!ZX{nYTeq`B4b~ Y0Jhw^anS{dXaE2J07*qoM6N<$f(d7-Z~y=R literal 0 HcmV?d00001 diff --git a/basic_materials/textures/basic_materials_copper_wire.png b/basic_materials/textures/basic_materials_copper_wire.png new file mode 100644 index 0000000000000000000000000000000000000000..9df9f36635e86c5ea63c1dc3f12887fb3bc22202 GIT binary patch literal 306 zcmV-20nPr2P)U@EwPwOzp8T|3fHAS9c_ zBxqkZTD_-FGjG9BUV9J`Im_gE-a)``b5RszSq4CoB*byt8v?-NdL?ZcV?-$>N+~hM zblx@(>2cC@xsX#zmy3>h&>kk!8SA@iqF_Me4;ckR06t8OwhgAqIuQ`|V zIit{L90puO0RX#7^QkS`Hssqae-gaqFTDiXg`hN+$~Y4IV+R4_(EldzU{`8NZK>RL zu*cL*KY@tI>h|iaD~O2vH1VLyr+RR6|J13n^Jj9_7u?+FHXlP0<^TWy07*qoM6N<$ Ef~uT@yZ`_I literal 0 HcmV?d00001 diff --git a/basic_materials/textures/basic_materials_empty_spool.png b/basic_materials/textures/basic_materials_empty_spool.png new file mode 100644 index 0000000000000000000000000000000000000000..017a94fd20c34d95fc8342e9df02f0db5e4a64d0 GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`b3I)gLo80;o$SbUSV6#bzUdJG zfjgC~{*#=mh1NfC64-Rg>CGzD84+A%SN8|~`8*?WpMgfpa5~kR)YHQlO^dK*b=XraB`4f5$N;C&`1$k|s zef)*gf8GH9tlqubS59wCjXYtw|Ge&-sjcs%u9v!caTa(!^tZpfVcx$fzAL*Q8e9iD Ol)=;0&t;ucLK6VKXII() literal 0 HcmV?d00001 diff --git a/basic_materials/textures/basic_materials_energy_crystal.png b/basic_materials/textures/basic_materials_energy_crystal.png new file mode 100644 index 0000000000000000000000000000000000000000..f1c28e80547b2ade2e3ad9d04690351752d0eb1a GIT binary patch literal 817 zcmV-11J3-3P) zZ%mYR0KoB|Cm^E@>ok=dXX3-%c?!pc97GUWbD5fNOj^BY=2}L!nffYOptzAsa_j#B z3tw1nDO-Om=4{18?awf)jpm|%Ti6`CIJoD}@Ao|SJil+W)#eLp_4$Z@!mg#o?5=3w zsU-vA|I%H?99o~anYL2cTCDYf^fB>Y(cN6cL!wk2yA@hXwR5^0e}5R-AAOLvl_BwO zvLky#VupV9PNs(&g6w1qxp(hI4Ypu@+z31C*3({BD6S{-+v_1Q!|!{*q$BCsNAAHs zv6<|-J;>fhvO|xN?`c9G+O&YK#yR48cy8S!?bV9TT6D*9^wS1B9)_+O^qz9`juNf+ z#nCUUUg*D=nk}xy!8M=hy_M2EaxdzWB>8s?f}S+&N<&8&_NQ@=S0gVq__`yK5r32Y zYYX#-QrpcZ1?J%x?(izCixI5TYmk@YSeXdckFDfL;e5FSchtZ+HP5rIM!Wq^Q6R>l z$mv|n?-z@(>^T0bx8S}pmrT%xHC%_Bs3rUT7QE*Ttifiolwn%ss4L6Jy%$?7?2jHk zKlP^Yrd1UE$|CISQXD6Vef18^@g!c4f!!a+{;3jqem-(4itSfnUYPHzfyAirx+B=K z3g=2CHZi1*BUK7>Vj13;f%!uPYG5I%?+!x@M9@1I=Xe;l--y4h0JfDdeNy0l9mbO}R3;HP_UdniK3P_64OQZvU4iYD zA$2{HH2Je7aG;*xr6wlFIvM9E>fr6z+=l&g1m!lPf(>hh5@HrD;rrY(2`tM%vI@i?uA%RjjR~Ru{kPcI9By+@s~dU6S@ozea7Ws00000NkvXXu0mjfutA!B literal 0 HcmV?d00001 diff --git a/basic_materials/textures/basic_materials_gear_steel.png b/basic_materials/textures/basic_materials_gear_steel.png new file mode 100644 index 0000000000000000000000000000000000000000..584f9a51502729fb65198c204230d0100d729b5a GIT binary patch literal 5845 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 literal 0 HcmV?d00001 diff --git a/basic_materials/textures/basic_materials_gold_wire.png b/basic_materials/textures/basic_materials_gold_wire.png new file mode 100644 index 0000000000000000000000000000000000000000..781de7b1a9439a5d9180f06a1074b6f767a427c2 GIT binary patch literal 286 zcmV+(0pb3MP)}LrYr3NnDttB9Rl=MN-iv2S^8^AZA-TUKwwOhDdf26HCkQMyvnz zH1iicrMiQN$S9Li>LlRUToeU)o&%7kDO&5n5CAsoxpZZ%6=RGTW5in9d)usD&XaC4 zEtj;-bk7`ihj^CowR|KDuTjyIU=je}b`5)1vj47#X9@6pKA`?waQpBCHz7=}P`?2| z-9XiXb(C)ze-cz5uY&}x@gb;N*m)9+-$5Kf9R2SOTw5V+IZPlTQsnoet{@_EXyQqg kFZJLqdGA%(`!jj#2hL93EOD>hK>z>%07*qoM6N<$f|qX6 z@{*qEs#o=@suPJ}+gEYYz8q@%erhbw%@Y%z2L?Xw`&Ix6fCPq+KnNN5pJyi#FX(u) zqTotUTJ%Da!c>y5y#%-vhd2^9(<3Nn#=Cu6LU6yK2>Vm++p!MIf7n(;bPwu#KH7PM zcER9$E=6<#%Bw0KNp081^|D9wIewfOJRRt0i7n}VAOyib1eL79#eB+5&=9>G-_??b z*CWkr9TH}~T~mZx0<{-KyI{Sv;Ndg>+eBAYT}EeSi8IDvdJK0nJ!5R;y6RO>o{4%!RUSCcpnSb?EjDXgu~oqow_# P00000NkvXXu0mjfbef`4 literal 0 HcmV?d00001 diff --git a/basic_materials/textures/basic_materials_ic.png b/basic_materials/textures/basic_materials_ic.png new file mode 100644 index 0000000000000000000000000000000000000000..4c8889451813f0c8727e0efac36ff761b5f047fc GIT binary patch literal 293 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU!KjfKP~P za74IgfWMQMm#dGDPe`zDXlQU$l(V)`Gl7#ae!VaIKe&p=APB*-uL zKVHCaR!*bvb8f^mY(D}5g$--J~2#QIM$&r{Q^96y+6-Y#45 zTFOgP#I;eyQ>IYH*{d?W;OJ$Oz5EG1j`zR2TsArJ`Od^t$-d<+0!^y=VrSeF)*iL! zQ@Ico&!QeEa#z)ud&4?y&S|NNj@L^yPJdGJxO|24kiinYIS+KwDtcC}+P5p=ASdUy vTK3Jkx0#vV3)XFQd7uBqTIGFkor(M*_EfD+S3VsC`h>yL)z4*}Q$iB}YXn`L literal 0 HcmV?d00001 diff --git a/basic_materials/textures/basic_materials_oil_extract.png b/basic_materials/textures/basic_materials_oil_extract.png new file mode 100644 index 0000000000000000000000000000000000000000..e34623d0551bbf2334f46393b2a66ade0ca7b8b6 GIT binary patch literal 1966 zcmV;f2T}NmP))Rd!KV>=4LXXt)b124^d+!s8kw|Fe7L~6^YPd(_)Klv4VXQ`XDIycx03ad|5pJ~IZ~(kls0c)4hflp3Y5<-){$j&g zI$(?)H74_wm_W=RqMdB*SB4sZI7+_koVm-nl~8A5IOkxQp{kFcn4SCZPy#SLJ+mK# zuUhLu=I+NbGmNz$qA~CFdqW4nGsjLgiReh+%)avK7g~^IgA79iV*2EX*}2Du3IJow zA#3Sq5I7XE-{)_@#(;=e6i1(*ed)kZ05Cm0vp-G!BgPo?u6}PQ7-L|vt#OQ?-{15A zJag=1lMR2#F!lw3U3K-l!XaY;M6vhy%-nZ3Hv?2Z4d83W7#L&MOniu_%mM~*`1#qF zKC>wSc>3wty#SuDhTxomF(xm321t^!yr2k$@0>b)W@1wTFg-mpN=)}M(=KKP5ko|f zrfJvZz3)G%d`AEPQS439^xK;X0AuKmg8J6-nz7$6MJ};`RrPZxX6KG<3IL8hd+I|4 z^^GAg8*uJS*H1R9YJ!5gSO8#5LHFfj*B5{%pPFHx%Ga4`R}ffO7a|B7utCtdj0<7I z23!~d!~<81s`@b(hL2TUGFJ+KW14b~j|PnfTsVqwWCSh@!N!8f0LU1iqEOL6;-Sm} z25^{(kJJ)?Q>V{Ngrkio!o~=~umNjr*6bM6+47|5Y9LRfa-k03>O;&l$7R zI+u$WRWC6rh@)tmPyB6l41s+`%rZ0R8jl=^Y4zkNXMj%<5Of?wmE{GMoeL23CUmy2 z!P{NL1oa9+c2ChMR`F0#hzfj?bXw;CwiD4!wF3aaM_0fYboB+|72ao#l6ZLUb7wP$ zeJW+=p`bujchnJp-93V}Ce?i+`AQ3*inNm%YO(dLHq1orG=PZql%3CdeJhu$0-B}6 zK1q;75yYomPOjWfcrP$jwK+XKGg=!4oH~7GLcBLcH5Y~sLEzx5fwNg5#B5-#0W(0v zD7OMc01<)rf;9CINf1RTk|ajE9bg z7EQ@CK!gBD=UyU0v)QB|4C}KCT)w>63sf04@lS6Y0Pq6>8HJ7j2%!l3$GH~u{<5eps>oYj z%b#?=d2jqj!8&_)Np#DCIZEtZ#|2NcXsgUkuica&sQ6&Y;WyD`Vl!5H8GELkH9r;- zDwm`^F_M`^6HOTt>+v}?E2bUlpfofs2Lw>Lj!JUVxM$yxq-m!y!xnH@W}@S5GO zT{_Le*I&i$%fZzRigya$&8pWftaSLuYWe2D+=jogy#2KYR?2=1-pklN)ivBPrXm37 OQU*^~KbLh*2~7a=@>Ny< literal 0 HcmV?d00001 diff --git a/basic_materials/textures/basic_materials_paraffin.png b/basic_materials/textures/basic_materials_paraffin.png new file mode 100644 index 0000000000000000000000000000000000000000..77d2bbd12e37d724d87822457fa22b927a48c18f GIT binary patch literal 345 zcmV-f0jBjm@zqOr9pf#>1mvib%4#NfwJP zPZ)e+%=#VRlNOX9PL7g<0q_A)q;_`)qPX!U# zSv{nT;*Bx|Y8aR_c*mke6>T6Q2U`i>#6!_T=Ykt5RCo;UgIhoODtluh+q2gXSvwWv rlxFN&(J)=jtZ0kTh2#0x-pREfDC$N*K|~Z4L`Bdur1ORjbfHC|ln#V!@?U;3x!wNy#c})~ zE(_bXeKbvD7eygNnx@ui;WSOQ%F=b6kgKYavMfJCuxW(DFvvKLI`@6AApr6`--jrR zcM2#(Fwe8B>nh8#Xb4Vl@dE5aRDor>Biy!4LvRA1u4}UkiK1v9qKYjXAOeCDfMyRk zNRmX+q>j00000NkvXXu0mjfHCcNh literal 0 HcmV?d00001 diff --git a/basic_materials/textures/basic_materials_plastic_strip.png b/basic_materials/textures/basic_materials_plastic_strip.png new file mode 100644 index 0000000000000000000000000000000000000000..1318dfc04dfb0e80a85e934877e1b3eae6ad43f9 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>7Fi*Ar`0iURLBgpuppB@qR4B z>A(KrvCVIeOlocA)$m^7yhq-Jd-w6Xd+WSKW=k??s&cYs#dt9)JlFZe?*Df|dwZkc zJGQhB=?P-{*_3v0x_ngL(DeR*7Mlfw%evOCM`V@kMmH`p`ycT4I@X3iVE9{Sc9lH zdl3~uKiP|*7ZC(Oy^UT~e?l*M6@!SN}?zQjdx~p5WjW$kSxQ5;+H8 zFR@7+<03nvu|ztZtD;=4B1G}XSv5$i30XBDDh5(&5d#O@@cP4;Tj*|OG_yl&^=jQo zwy~_3%VZ0P(n$oP4044AV(}#6yn>XPhp6cAjYklep!!q1{G+|JjC9&q2QXNxHk?Ed z)DsCwgI;JNNC~*IvIeg|f^5D9YAONWSO7!rQ4D)VG3*(GQKX6EG2pgJvZRd&Y2Z*n=Ur7b9Ljy#6qfirx=|rjX5=j|mlHpHOrX zv&}YynIhKLpJ6;mBRa`J(TX@4jAHM=AodTrA5)-vAf@II ziiw~(sUL~4Tl)qNY!)iV`tzMGtWx8poUyDKwRq%Y`{HO=Yz`2cZdRNmDWyN9(gmD4 zbq0YDjbL~Z3@iQ27`2UhtNr}KvbdK{j???YT{yUD%d)e>>@0i< zb6cpYzBOcwIS||rkK;&HRRF|sOcX_@Bo7JJb;Vi>faiI*uDkcPZNqUKbC4z?`U)bV z4?QT$Qj4O%_kDsOAPhqQhGAe?7Up>-O;eI2F{kE;h&D~5ec!9KcHcTpleTTEbzT2Z zLDzMEui$#)cdl?7xAItEbtpxx8002ovPDHLkV1ne^ BX2t*j literal 0 HcmV?d00001 diff --git a/basic_materials/textures/basic_materials_steel_bar.png b/basic_materials/textures/basic_materials_steel_bar.png new file mode 100644 index 0000000000000000000000000000000000000000..0673b6eefcb9a4f1a89fbdb0752f267f30476427 GIT binary patch literal 311 zcmV-70m%M|P)S7)4Je$=eAk(uKaDh$2Nq5G>W!ke^1f3?^34G)+y2)SsozxJoGvY0^#aZWzvY z=iZNjUCVQA*}J`wGM_4kz&h%Xnm#rhNbW);d=P zl!ZMx7Jd+->v|)+>|nL+rp)US0IP6Y=ZZQ9d-C{bU+(;O{sVdPs6OnL;>-X5002ov JPDHLkV1h3Ykc|KU literal 0 HcmV?d00001 diff --git a/basic_materials/textures/basic_materials_steel_strip.png b/basic_materials/textures/basic_materials_steel_strip.png new file mode 100644 index 0000000000000000000000000000000000000000..6384dc8302080b28df9b484c8113e9809e76f64e GIT binary patch literal 326 zcmV-M0lEH(P)p{RH*@l&{j;V`-Lh=Kg3jd&7x*oiH8#cBX9Fr~jQwym-8a!Fq9kHYM%KS0fYf%w~K@}m*} Y0ADb?S;9pEJpcdz07*qoM6N<$g5}4dO8@`> literal 0 HcmV?d00001 diff --git a/basic_materials/textures/basic_materials_steel_wire.png b/basic_materials/textures/basic_materials_steel_wire.png new file mode 100644 index 0000000000000000000000000000000000000000..0c96c8f34b2857f76ef34a0e68d560d7712dc543 GIT binary patch literal 284 zcmV+%0ptFOP)JC@R=W}rb3>?xXFYS=9VU6sdR1afOp+Lku>gpC5<(z^1Cu=GY{0&*xw)NUt;HBinx+7> zZHxCF@4xtXe`AoK-t9<|7-NnEiirFWgsTu-{{~%xfg7l*F3Y=%2vk*%O+2acdQ}b* iZ0;X=RUZ9JqxB7_@8$Uni6R#O0000 zOGs2v90%av|J-x$%(>T@QD@YdDKgEVA}FjD(ZhlsSVAqL*P;j)xd_?`R*(d>XjKse zErN(z1wB_4H9;5^Q6^UQFk`X_$I+S5dEM9PE?S5X)c4_Eyghk<@IM~zZRPL`oat(P zcdBz8Jg8D=1OZg;eh&o7krn*;XC?%f+)v-Ct2hN%T>G}kgw z$!3uLnZ&CPU$^%5XCGh&2G7p>U!=>pyw<+3KJ(+-73nyVshZ}Li*T$8q?C|m#o`J( ziCGvtiT$mc$u<*ZN2cBk4L7Bd--$#3t|m~(=P{NV#rsr-jZRK4Inv@^49}jZ!r-Be zK8RhbVtu)ixxC`o;KZb^aBY#nFf^s<+)!bJ!;`b+K%6mz zbuME;KTTCEESnpG<`W1A9|HApxKoqh3`mWQi)Ha@YkazN8Ne0}j{&sWj)bl;iiUJF za*jEXT8R2M$aPW9O~4n9z;z|GOa@KSi1Pi@&lmtd+hizufYXwIMo3PYayXrrmMbAu z6?P#9eUcpWrv=91PUCU=7@6VRnnK7o|dVR9?jjdJ;fAxt=bLArhCDo^$7GP!M4W zcoVy!+^XWgbeD?TTm_= 16 then + x = 0 + y = y + 1 + end + end + texture[#texture+1] = "^[resize:128x128^ta4_addons_matrix_screen_overlay.png" + return table.concat(texture, "") +end + +local function generate_texture_from_indices(indices) + local texture = {"[combine:16x16:0,0=px_bg.png"} + local x, y = 0, 0 + for _,index in ipairs(indices) do + if index ~=1 then + texture[#texture+1] = ":" + texture[#texture+1] = x + texture[#texture+1] = "," + texture[#texture+1] = y + texture[#texture+1] = "=px" + texture[#texture+1] = index + texture[#texture+1] = ".png" + end + x = x + 1 + if x >= 16 then + x = 0 + y = y + 1 + end + end + texture[#texture+1] = "^[resize:128x128^ta4_addons_matrix_screen_overlay.png" + return table.concat(texture, "") +end + +local function string_to_table(input_string) + local indices = string_to_indices(input_string) + local t = {} + local x, y = 0, 0 + for i = 1,#indices do + t[y] = t[y] or {} + t[y][x] = indices[i] + x = x + 1 + if x >= 16 then + x = 0 + y = y + 1 + end + end + return t +end + +ta4_addons.base64_to_texture = function(color_string, palette) + --return generate_texture_from_color_list(string_to_colors(color_string, palette)) + return generate_texture_from_indices(string_to_indices(color_string)) +end + +local function update_matrix_display(pos, objref) + pos = vector.round(pos) + local nvm = N(pos) + objref:set_properties({ + textures = { ta4_addons.base64_to_texture(nvm.color_string or "", nvm.palette) }, + }) +end + +minetest.register_node("ta4_addons:matrix_screen", { + description = S("TA4 Matrix Screen"), + inventory_image = "ta4_addons_matrix_screen_inventory.png", + tiles = {"ta4_addons_matrix_screen.png"}, + drawtype = "nodebox", + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "wallmounted", + node_box = techage.display.lcd_box, + selection_box = techage.display.lcd_box, + light_source = 6, + + display_entities = { + ["techage:display_entity"] = { + depth = 0.42, + on_display_update = update_matrix_display + }, + }, + + after_place_node = function(pos, placer) + local number = techage.add_node(pos, "ta4_addons:matrix_screen") + local meta = M(pos) + meta:set_string("node_number", number) + meta:set_string("infotext", S("Matrix Screen no: ")..number) + local nvm = techage.get_nvm(pos) + nvm.color_string = "AABBCCDDEEFFGGHHAABBCCDDEEFFGGHH" + .. "IIJJKKLLMMNNOOPPIIJJKKLLMMNNOOPP" + .. "QQRRSSTTUUVVWWXXQQRRSSTTUUVVWWXX" + .. "YYZZaabbccddeeffYYZZaabbccddeeff" + .. "gghhiijjkkllmmnngghhiijjkkllmmnn" + .. "ooppqqrrssttuuvvooppqqrrssttuuvv" + .. "wwxxyyzz00112233wwxxyyzz00112233" + .. "445566778899++//445566778899++//" + lcdlib.update_entities(pos) + minetest.get_node_timer(pos):start(2) + end, + + after_dig_node = function(pos, oldnode, oldmetadata) + techage.remove_node(pos, oldnode, oldmetadata) + end, + + on_timer = techage.display.on_timer, + on_place = lcdlib.on_place, + on_construct = lcdlib.on_construct, + on_destruct = lcdlib.on_destruct, + on_rotate = lcdlib.on_rotate, + groups = {cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_glass_defaults(), +}) + +minetest.register_craft({ + output = "ta4_addons:matrix_screen", + recipe = { + {"dye:red", "dye:green", "dye:blue"}, + {"default:copper_ingot", "techage:ta4_display", "default:copper_ingot"}, + {"", "default:mese_crystal_fragment", ""}, + }, +}) + +techage.register_node({"ta4_addons:matrix_screen"}, { + on_recv_message = function(pos, src, topic, payload) + local mem = techage.get_mem(pos) + mem.ticks = mem.ticks or 0 + + if mem.ticks == 0 then + mem.ticks = 1 + end + + if topic == "pixels" then + N(pos).color_string = tostring(payload) + elseif topic == "palette" then + N(pos).palette = tostring(payload) + end + end, +}) + +local function generate_px_button(x, y, i, palette_func, name) + return "image_button["..x..","..y..";.5,.5;px.png^[colorize:#"..palette_func(i)..";"..name..";"..letters:sub(i,i).."]" +end + +local function get_px_val(nvm, x, y) + return ((nvm.px or {})[y] or {})[x] or 1 +end + +local function generate_base64(nvm) + local result = "" + for y=0,15 do + for x=0,15 do + local i = get_px_val(nvm, x, y) + result = result..letters:sub(i,i) + end + result = result.." " + end + return result:sub(1,-2) +end + +local function update_fs(pos) + local nvm = N(pos) + local palette = nvm.palette or "rgb6bit" + local palette_func = get_palette(palette) + local current_idx = nvm.current_idx or 1 + local fs = "formspec_version[4]size[18,12]" + fs = fs.."label[0.5,.75;Palette:]" + fs = fs.."dropdown[2,.5;3,.5;palette;"..table.concat(palettes, ",")..";"..(palettes_to_idx[palette] or 1).."]" + local x = .5 + local y = 1.5 + for i = 1,64 do + fs = fs..generate_px_button(x, y, i, palette_func, "color_idx_"..i) + x = x + .6 + if x > 2.5 then + x = .5 + y = y + .6 + end + end + for y_px = 0,15 do + for x_px = 0,15 do + fs = fs..generate_px_button(3.5+x_px*.6, 1.5+y_px*.6, get_px_val(nvm, x_px, y_px), palette_func, "px_"..x_px.."_"..y_px) + end + end + fs = fs.."label[13.5,.75;Current Color:]" + fs = fs..generate_px_button(17, .5, current_idx, palette_func, "current_color") + fs = fs.."style_type[textarea;font=mono]" + fs = fs.."textarea[13.5,4.5;4,5;base64;Base64 string:;"..generate_base64(nvm).."]" + fs = fs.."button[16.5,9.5;1,.5;read_base64;Read]" + fs = fs.."field[13.5,10.5;3,1;target;Target Techage Number:;"..minetest.formspec_escape(nvm.target or "").."]" + fs = fs.."button[16.5,10.5;1,1;send_cmnd;Send]" + M(pos):set_string("formspec", fs) +end + +minetest.register_node("ta4_addons:matrix_screen_programmer", { + description = S("TA4 Matrix Screen Programmer"), + tiles = { + -- up, down, right, left, back, front + "techage_filling_ta4.png^techage_frame_ta4_top.png", + "techage_filling_ta4.png^techage_frame_ta4.png", + "techage_filling_ta4.png^techage_frame_ta4.png", + "techage_filling_ta4.png^techage_frame_ta4.png", + "techage_filling_ta4.png^techage_frame_ta4.png", + "techage_filling_ta4.png^techage_frame_ta4.png^ta4_addons_appl_matrix_screen.png", + }, + drawtype = "normal", + paramtype = "light", + paramtype2 = "facedir", + on_construct = function(pos) + update_fs(pos) + M(pos):set_string("infotext", S("TA4 Matrix Screen Programmer")) + end, + after_place_node = function(pos, placer) + local number = techage.add_node(pos, "ta4_addons:matrix_screen_programmer") + local meta = M(pos) + meta:set_string("node_number", number) + meta:set_string("infotext", S("Matrix Screen Programmer ")..number) + end, + after_dig_node = function(pos, oldnode, oldmetadata) + techage.remove_node(pos, oldnode, oldmetadata) + end, + groups = {cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_metal_defaults(), + on_receive_fields = function (pos, formname, fields, sender) + local player_name = sender:get_player_name() + if minetest.is_protected(pos, player_name) then + return + end + local nvm = N(pos) + for i=1,64 do + if fields["color_idx_"..i] then + nvm.current_idx = i + end + end + for y=0,15 do + for x=0,15 do + if fields["px_"..x.."_"..y] then + nvm.px = nvm.px or {} + nvm.px[y] = nvm.px[y] or {} + nvm.px[y][x] = nvm.current_idx + end + end + end + if fields.read_base64 and fields.base64 then + nvm.px = string_to_table(fields.base64) + end + if fields.send_cmnd and fields.target and techage.check_numbers(fields.target, player_name) then + nvm.target = fields.target + local own_number = M(pos):get_string("node_number") + if not own_number or own_number == "" then + own_number = "0" + end + techage.send_multi(own_number, fields.target, "palette", nvm.palette or "rgb6bit") + techage.send_multi(own_number, fields.target, "pixels", generate_base64(nvm)) + end + if fields.palette then + nvm.palette = fields.palette + end + update_fs(pos) + end +}) + +techage.register_node({"ta4_addons:matrix_screen_programmer"}, { + on_recv_message = function(pos, src, topic, payload) + local nvm = N(pos) + if topic == "on" then + local own_number = M(pos):get_string("node_number") + techage.send_multi(own_number, nvm.target, "pixels", generate_base64(nvm)) + techage.send_multi(own_number, nvm.target, "palette", nvm.palette or "rgb6bit") + end + end, +}) + +minetest.register_craft({ + output = "ta4_addons:matrix_screen_programmer", + recipe = { + {"default:steel_ingot", "techage:ta4_ramchip", "default:steel_ingot"}, + {"", "ta4_addons:matrix_screen", ""}, + {"default:steel_ingot", "techage:ta4_wlanchip", "default:steel_ingot"}, + }, +}) + +if techage.repair_number then + minetest.register_lbm({ + label = "Fix lost techage numbers for matrix screens", + name = "ta4_addons:repair_matrix_screen_numbers", + nodenames = {"ta4_addons:matrix_screen", "ta4_addons:matrix_screen_programmer"}, + action = function(pos, node) + techage.repair_number(pos) + end + }) +end + +minetest.register_lbm({ + label = "Fix lost timer for matrix screens", + name = "ta4_addons:repair_matrix_screen_timer", + nodenames = {"ta4_addons:matrix_screen"}, + action = function(pos, node) + minetest.get_node_timer(pos):start(2) + end +}) \ No newline at end of file diff --git a/ta4_addons/textures/px.png b/ta4_addons/textures/px.png new file mode 100644 index 0000000000000000000000000000000000000000..d057ee32de8eb35acda495e6bca265588dacb6c6 GIT binary patch literal 82 zcmeAS@N?(olHy`uVBq!ia0vp^j3CU&3?x-=hn)ga%mF?juK)l4Uw%aT1dz++>Eal| caXmQ!$Yx?-e5AO?7|3GqboFyt=akR{0J&omJOBUy literal 0 HcmV?d00001 diff --git a/ta4_addons/textures/px1.png b/ta4_addons/textures/px1.png new file mode 100644 index 0000000000000000000000000000000000000000..19b3f6a1e4b828f4a278f093652c9caf4104802a GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*6y6A}`DJQfDVZ{ilA PKo*0itDnm{r-UW|l@bkj literal 0 HcmV?d00001 diff --git a/ta4_addons/textures/px10.png b/ta4_addons/textures/px10.png new file mode 100644 index 0000000000000000000000000000000000000000..836752a564fe1e9d82aed16ba93cf987a9478797 GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*6yBaRAiF))QQGNk!S R_5;NkJYD@<);T3K0RWju4W|GA literal 0 HcmV?d00001 diff --git a/ta4_addons/textures/px11.png b/ta4_addons/textures/px11.png new file mode 100644 index 0000000000000000000000000000000000000000..25b2325c57845cf7768959e4066216e14b201bca GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*6yBaUw1VqjXs7}{L& Rc{Na+!PC{xWt~$(69B~T5Geov literal 0 HcmV?d00001 diff --git a/ta4_addons/textures/px12.png b/ta4_addons/textures/px12.png new file mode 100644 index 0000000000000000000000000000000000000000..83a1832ec4bd696dbca5a99091223409e0aeb74d GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*6yBaVKMXJBSzTy>!; RSP>}B;OXk;vd$@?2>`n74^jXC literal 0 HcmV?d00001 diff --git a/ta4_addons/textures/px13.png b/ta4_addons/textures/px13.png new file mode 100644 index 0000000000000000000000000000000000000000..62a5f8f47fec02344e5bf9061888262f677cf5d6 GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*6yf1E$Sz`)GN$Z+!C Rr1wB^22WQ%mvv4FO#seq5RCu; literal 0 HcmV?d00001 diff --git a/ta4_addons/textures/px14.png b/ta4_addons/textures/px14.png new file mode 100644 index 0000000000000000000000000000000000000000..8ac371218ebae21e900dfe0a5c3c410fce07a50e GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*6yf1DTKVqgwq4BZ%_ R-vktA@O1TaS?83{1OT-J4*viE literal 0 HcmV?d00001 diff --git a/ta4_addons/textures/px15.png b/ta4_addons/textures/px15.png new file mode 100644 index 0000000000000000000000000000000000000000..65703035b80cba3e95160cae4a2264ef08487c5f GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*6yf1KaI#lXCpaaG#G R&yRrO44$rjF6*2UngHU15w8FM literal 0 HcmV?d00001 diff --git a/ta4_addons/textures/px16.png b/ta4_addons/textures/px16.png new file mode 100644 index 0000000000000000000000000000000000000000..f6cb70b23ea7ed58569ab1765223326c528e661a GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*6yf1Ljy&%naK_+N?3 R>H|=m!PC{xWt~$(69CBA59t5^ literal 0 HcmV?d00001 diff --git a/ta4_addons/textures/px17.png b/ta4_addons/textures/px17.png new file mode 100644 index 0000000000000000000000000000000000000000..9235ae39520da92fc6c9a0a6e221e1cfae8ca44e GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*6y6F5?Vymbs=Z3j2V P0$B{6u6{1-oD!M`7E4+Q`K literal 0 HcmV?d00001 diff --git a/ta4_addons/textures/px25.png b/ta4_addons/textures/px25.png new file mode 100644 index 0000000000000000000000000000000000000000..583c769c5edbe2134929837786c0e8d110848b0d GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*6yBScRzFfgrQWGH{# Ra~>$p;OXk;vd$@?2>`OM4_p8M literal 0 HcmV?d00001 diff --git a/ta4_addons/textures/px26.png b/ta4_addons/textures/px26.png new file mode 100644 index 0000000000000000000000000000000000000000..14801a618bf0dd1d0bbfbb519cbaeb0b053ed364 GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*6yBSeAfm>C&E`PVHt Q2oz`VboFyt=akR{0Fx38!Tws2;OXk;vd$@?2>__(4ygbD literal 0 HcmV?d00001 diff --git a/ta4_addons/textures/px28.png b/ta4_addons/textures/px28.png new file mode 100644 index 0000000000000000000000000000000000000000..6ecb8933067d2287b47f365538f27f97b0d057ad GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*6yBSe46Gcd1a{J-}n R`#zvJgQu&X%Q~loCIH8%5NH4Z literal 0 HcmV?d00001 diff --git a/ta4_addons/textures/px29.png b/ta4_addons/textures/px29.png new file mode 100644 index 0000000000000000000000000000000000000000..f841b9b058758c99e3d619c505103c959916aa54 GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*6yf5@L=U|?R&7`mkP RSOHL+!PC{xWt~$(69B`U5A^^5 literal 0 HcmV?d00001 diff --git a/ta4_addons/textures/px3.png b/ta4_addons/textures/px3.png new file mode 100644 index 0000000000000000000000000000000000000000..d325ef72c59259d4891a38a303e055e0bbc5c419 GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*6y6A~g=85q_vtiHeN R!epR0gQu&X%Q~loCIG-g5Gw!x literal 0 HcmV?d00001 diff --git a/ta4_addons/textures/px30.png b/ta4_addons/textures/px30.png new file mode 100644 index 0000000000000000000000000000000000000000..461394c004b4628b64d46d12923d5a434dda701e GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*6yf5-#Xu`n>MI(@hK Q8Bmy6k@mV R(RQFXgQu&X%Q~loCIHKK5M=-W literal 0 HcmV?d00001 diff --git a/ta4_addons/textures/px33.png b/ta4_addons/textures/px33.png new file mode 100644 index 0000000000000000000000000000000000000000..c31f0129a913b261a2c4622bed4f06002e0e49e1 GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*6y6C#cRWg-|>$89YW Q28uIyy85}Sb4q9e0Itgp)&Kwi literal 0 HcmV?d00001 diff --git a/ta4_addons/textures/px34.png b/ta4_addons/textures/px34.png new file mode 100644 index 0000000000000000000000000000000000000000..bd6e4b89e026120e985179b1dc0fafee657e3ce2 GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*6y6Cy;p7#P_`?4$%Mr literal 0 HcmV?d00001 diff --git a/ta4_addons/textures/px35.png b/ta4_addons/textures/px35.png new file mode 100644 index 0000000000000000000000000000000000000000..2a34105b3ffc54ef8f3b509b8ed00c0cf01f6c60 GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*6y6C$>9F)%SPhAJP+ R?*WQ4c)I$ztaD0e0sy5~4sHMd literal 0 HcmV?d00001 diff --git a/ta4_addons/textures/px36.png b/ta4_addons/textures/px36.png new file mode 100644 index 0000000000000000000000000000000000000000..4a1ebbc9847a351503d21846293dde7a627422e4 GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*6y6C%FKGcbiSt}0&K R#SIi^@O1TaS?83{1OT?V4>SM( literal 0 HcmV?d00001 diff --git a/ta4_addons/textures/px37.png b/ta4_addons/textures/px37.png new file mode 100644 index 0000000000000000000000000000000000000000..934016e36a1fbc97ac642d83e84047625bc558c9 GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*6yIbx48FffHPGHj6e RVF?sx@O1TaS?83{1OT8~4mJP) literal 0 HcmV?d00001 diff --git a/ta4_addons/textures/px38.png b/ta4_addons/textures/px38.png new file mode 100644 index 0000000000000000000000000000000000000000..64ec437466ac90a7ba8cca02581679626d14b0be GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*6yIbub*7?{>DhDuy` R7yuM!@O1TaS?83{1OT3k4q5;J literal 0 HcmV?d00001 diff --git a/ta4_addons/textures/px39.png b/ta4_addons/textures/px39.png new file mode 100644 index 0000000000000000000000000000000000000000..3f319ec5c1aca49270ff8cda169aa705b24536a4 GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*6yIbyeRF)%YSu98kI Rc?uL~@O1TaS?83{1OTCV4rKrU literal 0 HcmV?d00001 diff --git a/ta4_addons/textures/px4.png b/ta4_addons/textures/px4.png new file mode 100644 index 0000000000000000000000000000000000000000..548a5b997fa3c3ace8db0c6bd3aa2035d47f02f5 GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*6y6B2&#GcYnUGH`Sr RdIJ<^@O1TaS?83{1OTfG4#WTe literal 0 HcmV?d00001 diff --git a/ta4_addons/textures/px40.png b/ta4_addons/textures/px40.png new file mode 100644 index 0000000000000000000000000000000000000000..dad02249e5f27f197d7307c1ab50a1626c89dab8 GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*6yIby%cGcboS{;zB2 R{{<9h@O1TaS?83{1OT|S519Y} literal 0 HcmV?d00001 diff --git a/ta4_addons/textures/px41.png b/ta4_addons/textures/px41.png new file mode 100644 index 0000000000000000000000000000000000000000..cff5622889977146e05d0d8a82ceab952116fa59 GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*6yBer%iGBAfRhI-2X RYzK-nc)I$ztaD0e0syYo4(I>? literal 0 HcmV?d00001 diff --git a/ta4_addons/textures/px42.png b/ta4_addons/textures/px42.png new file mode 100644 index 0000000000000000000000000000000000000000..aadd5a59f62e24d4bfd3998ec33c8794366fdab8 GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*6yBerUZFfgxXTy=Ki Rw(~%722WQ%mvv4FO#sB05MTfR literal 0 HcmV?d00001 diff --git a/ta4_addons/textures/px43.png b/ta4_addons/textures/px43.png new file mode 100644 index 0000000000000000000000000000000000000000..bc6e629656785f737480b9cd3df77d9e86627eb7 GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*6yBerIVGO#c({uh+B R4*-fYc)I$ztaD0e0sx{F4h8@K literal 0 HcmV?d00001 diff --git a/ta4_addons/textures/px44.png b/ta4_addons/textures/px44.png new file mode 100644 index 0000000000000000000000000000000000000000..a81e8b2b61db386b886543c9c24e95fc59e630e8 GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*6yBeuS>XJ83s3b9Wz Q18HFJboFyt=akR{0IwDfe*gdg literal 0 HcmV?d00001 diff --git a/ta4_addons/textures/px45.png b/ta4_addons/textures/px45.png new file mode 100644 index 0000000000000000000000000000000000000000..f3aee2ff310cbd8205a4951a8f64a8e6b8bece21 GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*6yf9&sKWMBzpT-Eo2 R?;KE^!PC{xWt~$(69CKP5K#aC literal 0 HcmV?d00001 diff --git a/ta4_addons/textures/px46.png b/ta4_addons/textures/px46.png new file mode 100644 index 0000000000000000000000000000000000000000..a3c53acd277236eb335db8dcb7138d2857045a8d GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*6yf9%&1VPILs_}~8E ReL0{wgQu&X%Q~loCIHMI5Lo~K literal 0 HcmV?d00001 diff --git a/ta4_addons/textures/px47.png b/ta4_addons/textures/px47.png new file mode 100644 index 0000000000000000000000000000000000000000..2880e98a2a1f8965b4657ad6305631f03463fd18 GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*6yf9%f^WnlTw6tdyO R9xI?YgQu&X%Q~loCIHj+5VimS literal 0 HcmV?d00001 diff --git a/ta4_addons/textures/px48.png b/ta4_addons/textures/px48.png new file mode 100644 index 0000000000000000000000000000000000000000..835ec731d48709e1ba3f4ca7912e47c4b13612a7 GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*6yf9!u{&%heOw9=qN R`z}zN!PC{xWt~$(69CVL5J><4 literal 0 HcmV?d00001 diff --git a/ta4_addons/textures/px49.png b/ta4_addons/textures/px49.png new file mode 100644 index 0000000000000000000000000000000000000000..e9704248d0ba0f11d2663ff82aad0cba348af222 GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*6y6Mmd$U|?cmWT@tB RtN@BLc)I$ztaD0e0syL!4q^ZR literal 0 HcmV?d00001 diff --git a/ta4_addons/textures/px5.png b/ta4_addons/textures/px5.png new file mode 100644 index 0000000000000000000000000000000000000000..46d8f349fcb68ae23d6ea87c02a425ad61a14c12 GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*6yIZ_jVGRzENf*TfC Q0mT_SUHx3vIVCg!0FjUldjJ3c literal 0 HcmV?d00001 diff --git a/ta4_addons/textures/px50.png b/ta4_addons/textures/px50.png new file mode 100644 index 0000000000000000000000000000000000000000..2a385f9c3ba5f2244abebfd0fbde06e92be63b0f GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*6y6Mo2ZF))QQhBBzX Rs0NBNc)I$ztaD0e0syCM4s!qi literal 0 HcmV?d00001 diff --git a/ta4_addons/textures/px51.png b/ta4_addons/textures/px51.png new file mode 100644 index 0000000000000000000000000000000000000000..72d70d10dc1919382d9255be2e4a6ab5505a3a0b GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*6y6MpRHVqjXsxazXJ R$4a0$gQu&X%Q~loCIH9|5EcLc literal 0 HcmV?d00001 diff --git a/ta4_addons/textures/px52.png b/ta4_addons/textures/px52.png new file mode 100644 index 0000000000000000000000000000000000000000..f2bf6d6a7712243125524bd1fc46b8f8b5addf87 GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*6y6Mp=cXJBSz{J%|T R(N&;0gQu&X%Q~loCIHPj5OM$j literal 0 HcmV?d00001 diff --git a/ta4_addons/textures/px53.png b/ta4_addons/textures/px53.png new file mode 100644 index 0000000000000000000000000000000000000000..bfc0e1cdd6636966cfde8da0108270c6aeaa3801 GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*6yIsTq!U|?os3@u%G R;W<#8!PC{xWt~$(69Bsm54->X literal 0 HcmV?d00001 diff --git a/ta4_addons/textures/px54.png b/ta4_addons/textures/px54.png new file mode 100644 index 0000000000000000000000000000000000000000..7ecb742ff949ad7ef3fc53856731a76e195a85ec GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*6yIsVFXF))WQuCiuO RuK|iPc)I$ztaD0e0sx!X4aooi literal 0 HcmV?d00001 diff --git a/ta4_addons/textures/px55.png b/ta4_addons/textures/px55.png new file mode 100644 index 0000000000000000000000000000000000000000..164d9e2b77f42f612ec11401801abf6310ac0982 GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*6yIsWeFVqjj)`2W_n Rjjw>>44$rjF6*2UngG}65nuoS literal 0 HcmV?d00001 diff --git a/ta4_addons/textures/px56.png b/ta4_addons/textures/px56.png new file mode 100644 index 0000000000000000000000000000000000000000..8fc4b144dae0d192a7b4e8a578de984fc877f2d9 GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*6yIsX2aXJBDq3VC1p RMFA+z;OXk;vd$@?2>`x%53T?J literal 0 HcmV?d00001 diff --git a/ta4_addons/textures/px57.png b/ta4_addons/textures/px57.png new file mode 100644 index 0000000000000000000000000000000000000000..a0c2abbeedcca534505ce1365eeaeccdca290c37 GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*6yBfidOWME-nT-Dpa RYYG%+@O1TaS?83{1OTq>4x|78 literal 0 HcmV?d00001 diff --git a/ta4_addons/textures/px58.png b/ta4_addons/textures/px58.png new file mode 100644 index 0000000000000000000000000000000000000000..c7c55b1fa91ca7b16bfa5033795e9e89fd77bd1d GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*6yBfi>;FtCI&{(s@d R5)2e)@O1TaS?83{1OT@+4>te+ literal 0 HcmV?d00001 diff --git a/ta4_addons/textures/px59.png b/ta4_addons/textures/px59.png new file mode 100644 index 0000000000000000000000000000000000000000..ae66950236c609cba891f46ab708a3794ae95d73 GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*6yBfi#)GO(;-3fa71 R|3RQQgQu&X%Q~loCIHFT5ODwi literal 0 HcmV?d00001 diff --git a/ta4_addons/textures/px6.png b/ta4_addons/textures/px6.png new file mode 100644 index 0000000000000000000000000000000000000000..fa5586038078b965cd27cce8d7b7b1e6522f59b9 GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*6yIZ`=T85koNR!1GI R`3)3j@O1TaS?83{1OTIM4#@xj literal 0 HcmV?d00001 diff --git a/ta4_addons/textures/px60.png b/ta4_addons/textures/px60.png new file mode 100644 index 0000000000000000000000000000000000000000..726b3286170b09ada42d4bf053ca967cdb7a88b3 GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*6yBfkE(XJGlyw9@34 R;7p)6gQu&X%Q~loCIHs45Xt}m literal 0 HcmV?d00001 diff --git a/ta4_addons/textures/px61.png b/ta4_addons/textures/px61.png new file mode 100644 index 0000000000000000000000000000000000000000..bab6c7fc47adf14cdf882fe08b64046bf80d025e GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*6yfBc`%$iVWS@qcVB RQ#(+c!PC{xWt~$(69Cw95VimS literal 0 HcmV?d00001 diff --git a/ta4_addons/textures/px62.png b/ta4_addons/textures/px62.png new file mode 100644 index 0000000000000000000000000000000000000000..0a0a7b5fb6b7ce8e8faf7873f03638e36f408c30 GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*6yfBd%>VPFkm3h^u5 R*9H`4@O1TaS?83{1OUQe54ivU literal 0 HcmV?d00001 diff --git a/ta4_addons/textures/px63.png b/ta4_addons/textures/px63.png new file mode 100644 index 0000000000000000000000000000000000000000..0cc7701649206d2039e03ae9d05728489dc59335 GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*6yfBdf(Wnf*&v~s^u RSp`s>!PC{xWt~$(69Cev5PSdt literal 0 HcmV?d00001 diff --git a/ta4_addons/textures/px64.png b/ta4_addons/textures/px64.png new file mode 100644 index 0000000000000000000000000000000000000000..94381b429d7f7fe87e1bade52d893ab348ae29cc GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*6yfBgS%&%pYR=^yWV Rw;e!n22WQ%mvv4FO#tpo5$gZ| literal 0 HcmV?d00001 diff --git a/ta4_addons/textures/px7.png b/ta4_addons/textures/px7.png new file mode 100644 index 0000000000000000000000000000000000000000..495f997fcbc10e2a8ac704793961f5325a6a98ee GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*6yIZ`8785q|xGE8F0 R4+Dxbc)I$ztaD0e0sxfy4UGT* literal 0 HcmV?d00001 diff --git a/ta4_addons/textures/px8.png b/ta4_addons/textures/px8.png new file mode 100644 index 0000000000000000000000000000000000000000..543e9bbdc6a99cf19b3d56c0fd70efeee09284a1 GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*6yIZ}V{GcYkRhOS@I RKMg3(;OXk;vd$@?2>`8b4*viE literal 0 HcmV?d00001 diff --git a/ta4_addons/textures/px9.png b/ta4_addons/textures/px9.png new file mode 100644 index 0000000000000000000000000000000000000000..fd908c15e95e0492adc913af148ddd80ed2a9297 GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*6yBaR+mU|?cmSRGeC R?;22?!PC{xWt~$(69Bqr50(G` literal 0 HcmV?d00001 diff --git a/ta4_addons/textures/px_bg.png b/ta4_addons/textures/px_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..1a80c400f8f94fd901fce02fb7f6ed8e2d0bcdd8 GIT binary patch literal 84 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!D3?x-;bCrM;bAV5XE0A7ZWqS)q@p!s8hHzX@ cPEglJzX3_G|nd{NStX16yRYIVA9j`@;Y{mgE6dx zaYYwH3q!~2M@kM|3>~YNxJ+U=F}JZvgQ+vAX$4c$q7zzeEDQ`EWBEeOrHgTe~DWM4frCl%y literal 0 HcmV?d00001 diff --git a/ta4_addons/textures/ta4_addons_matrix_screen.png b/ta4_addons/textures/ta4_addons_matrix_screen.png new file mode 100644 index 0000000000000000000000000000000000000000..e5575ccd2c0adaee0e142835bdb9ae684229f670 GIT binary patch literal 84 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;m;-!5T!HlRD%)E?ipSH%F@)oK ca)QJiAa4N!W1?!UJCMcT>FVdQ&MBb@0F}!T&j0`b literal 0 HcmV?d00001 diff --git a/ta4_addons/textures/ta4_addons_matrix_screen_inventory.png b/ta4_addons/textures/ta4_addons_matrix_screen_inventory.png new file mode 100644 index 0000000000000000000000000000000000000000..60101787d74e0c9ec42213af0221566fe31e275d GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvp#Yx{S0G*fpW#1497D%{KR-W4 zMuvjGb0>hJo}Mm_AsXkC6CBumx(>N{oM=$w2t6>RQLr_CNrUEroW$;S!_I#$6384o-YJe0&O)(-}gZE?mgS5VXotIdA(_aiF0Lp00i_>zopr E08RNX_W%F@ literal 0 HcmV?d00001 diff --git a/ta4_addons/textures/ta4_addons_matrix_screen_overlay.png b/ta4_addons/textures/ta4_addons_matrix_screen_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..11752c24765e077fa70bc03934368471581f3558 GIT binary patch literal 127 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?O3?zSk_}l@c*aCb)T-^(NfXw+?ErCFau_VYZ zn8D%MjWi%f-P6S}#N&AKkA5}@sf!G`ECy?2OOLOxcDrl%sxPp-XIJtSS>eY5=t`c)I$ztaD0e0ssQ{B(MMg literal 0 HcmV?d00001 diff --git a/ta4_addons/touchscreen/main.lua b/ta4_addons/touchscreen/main.lua index 6674d8a..5524c49 100644 --- a/ta4_addons/touchscreen/main.lua +++ b/ta4_addons/touchscreen/main.lua @@ -3,8 +3,8 @@ TA4 Addons ========== - Copyright (C) 2020 Joachim Stolberg - Copyright (C) 2020 Thomas S. + Copyright (C) 2020-2021 Joachim Stolberg + Copyright (C) 2020-2021 Thomas S. AGPL v3 See LICENSE.txt for more information @@ -18,329 +18,329 @@ local M = minetest.get_meta local N = techage.get_nvm local function get_value(element, key, default) - return minetest.formspec_escape(element.get(key) or default) + return minetest.formspec_escape(element.get(key) or default) end local function parse_payload(payload) - local element_type = payload.get("type") - if type(element_type) ~= "string" then - return - end - element_type = string.lower(element_type) - if element_type == "button" then - local x = get_value(payload, "x", 1) - local y = get_value(payload, "y", 1) - local w = get_value(payload, "w", 2) - local h = get_value(payload, "h", 1) - local name = get_value(payload, "name", "button") - local label = get_value(payload, "label", "Button") - return "button["..x..","..y..";"..w..","..h..";"..name..";"..label.."]" - elseif element_type == "label" then - local x = get_value(payload, "x", 1) - local y = get_value(payload, "y", 1) - local label = get_value(payload, "label", "Label") - return "label["..x..","..y..";"..label.."]" - elseif element_type == "image" then - local x = get_value(payload, "x", 1) - local y = get_value(payload, "y", 1) - local w = get_value(payload, "w", 1) - local h = get_value(payload, "h", 1) - local texture_name = get_value(payload, "texture_name", "default_apple.png") - return "image["..x..","..y..";"..w..","..h..";"..texture_name.."]" - elseif element_type == "animated_image" then - local x = get_value(payload, "x", 1) - local y = get_value(payload, "y", 1) - local w = get_value(payload, "w", 1) - local h = get_value(payload, "h", 1) - local name = get_value(payload, "name", "animated_image") - local texture_name = get_value(payload, "texture_name", "default_apple.png") - local frame_count = get_value(payload, "frame_count", 1) - local frame_duration = get_value(payload, "frame_duration", 1000) - local frame_start = get_value(payload, "frame_start", 1) - return "animated_image["..x..","..y..";"..w..","..h..";"..name..";"..texture_name..";"..frame_count..";"..frame_duration..";"..frame_start.."]" - elseif element_type == "item_image" then - local x = get_value(payload, "x", 1) - local y = get_value(payload, "y", 1) - local w = get_value(payload, "w", 1) - local h = get_value(payload, "h", 1) - local item_name = get_value(payload, "item_name", "default:apple") - return "item_image["..x..","..y..";"..w..","..h..";"..item_name.."]" - elseif element_type == "pwdfield" then - local x = get_value(payload, "x", 1) - local y = get_value(payload, "y", 1) - local w = get_value(payload, "w", 2) - local h = get_value(payload, "h", 1) - local name = get_value(payload, "name", "pwdfield") - local label = get_value(payload, "label", "Password") - return "pwdfield["..x..","..y..";"..w..","..h..";"..name..";"..label.."]" - elseif element_type == "field" then - local x = get_value(payload, "x", 1) - local y = get_value(payload, "y", 1) - local w = get_value(payload, "w", 2) - local h = get_value(payload, "h", 1) - local name = get_value(payload, "name", "field") - local label = get_value(payload, "label", "Input") - local default = get_value(payload, "default", ""):gsub("%${", "$ {") -- To prevent reading metadata - return "field["..x..","..y..";"..w..","..h..";"..name..";"..label..";"..default.."]" - elseif element_type == "field_close_on_enter" then - local name = get_value(payload, "name", "field") - local close_on_enter = get_value(payload, "close_on_enter", "false") - return "field_close_on_enter["..name..";"..close_on_enter"]" - elseif element_type == "textarea" then - local x = get_value(payload, "x", 1) - local y = get_value(payload, "y", 1) - local w = get_value(payload, "w", 2) - local h = get_value(payload, "h", 1) - local name = get_value(payload, "name", "") - local label = get_value(payload, "label", "Textarea") - local default = get_value(payload, "default", ""):gsub("%${", "$ {") -- To prevent reading metadata - return "textarea["..x..","..y..";"..w..","..h..";"..name..";"..label..";"..default.."]" - elseif element_type == "image_button" then - local x = get_value(payload, "x", 1) - local y = get_value(payload, "y", 1) - local w = get_value(payload, "w", 1) - local h = get_value(payload, "h", 1) - local texture_name = get_value(payload, "texture_name", "default_apple.png") - local name = get_value(payload, "name", "image_button") - local label = get_value(payload, "label", "") - return "image_button["..x..","..y..";"..w..","..h..";"..texture_name..";"..name..";"..label.."]" - elseif element_type == "item_image_button" then - local x = get_value(payload, "x", 1) - local y = get_value(payload, "y", 1) - local w = get_value(payload, "w", 1) - local h = get_value(payload, "h", 1) - local item_name = get_value(payload, "item_name", "default:apple") - local name = get_value(payload, "name", "item_image_button") - local label = get_value(payload, "label", "") - return "item_image_button["..x..","..y..";"..w..","..h..";"..item_name..";"..name..";"..label.."]" - elseif element_type == "button_exit" then - local x = get_value(payload, "x", 1) - local y = get_value(payload, "y", 1) - local w = get_value(payload, "w", 2) - local h = get_value(payload, "h", 1) - local name = get_value(payload, "name", "button_exit") - local label = get_value(payload, "label", "Exit Button") - return "button_exit["..x..","..y..";"..w..","..h..";"..name..";"..label.."]" - elseif element_type == "image_button_exit" then - local x = get_value(payload, "x", 1) - local y = get_value(payload, "y", 1) - local w = get_value(payload, "w", 1) - local h = get_value(payload, "h", 1) - local texture_name = get_value(payload, "texture_name", "creative_clear_icon.png") - local name = get_value(payload, "name", "image_button") - local label = get_value(payload, "label", "") - return "image_button_exit["..x..","..y..";"..w..","..h..";"..texture_name..";"..name..";"..label.."]" - elseif element_type == "box" then - local x = get_value(payload, "x", 1) - local y = get_value(payload, "y", 1) - local w = get_value(payload, "w", 2) - local h = get_value(payload, "h", 1) - local color = get_value(payload, "color", "") - return "box["..x..","..y..";"..w..","..h..";"..color.."]" - elseif element_type == "checkbox" then - local x = get_value(payload, "x", 1) - local y = get_value(payload, "y", 1) - local name = get_value(payload, "name", "checkbox") - local label = get_value(payload, "label", "") - local selected = get_value(payload, "selected", "false") - return "checkbox["..x..","..y..";"..name..";"..label..";"..selected.."]" - end + local element_type = payload.get("type") + if type(element_type) ~= "string" then + return + end + element_type = string.lower(element_type) + if element_type == "button" then + local x = get_value(payload, "x", 1) + local y = get_value(payload, "y", 1) + local w = get_value(payload, "w", 2) + local h = get_value(payload, "h", 1) + local name = get_value(payload, "name", "button") + local label = get_value(payload, "label", "Button") + return "button["..x..","..y..";"..w..","..h..";"..name..";"..label.."]" + elseif element_type == "label" then + local x = get_value(payload, "x", 1) + local y = get_value(payload, "y", 1) + local label = get_value(payload, "label", "Label") + return "label["..x..","..y..";"..label.."]" + elseif element_type == "image" then + local x = get_value(payload, "x", 1) + local y = get_value(payload, "y", 1) + local w = get_value(payload, "w", 1) + local h = get_value(payload, "h", 1) + local texture_name = get_value(payload, "texture_name", "default_apple.png") + return "image["..x..","..y..";"..w..","..h..";"..texture_name.."]" + elseif element_type == "animated_image" then + local x = get_value(payload, "x", 1) + local y = get_value(payload, "y", 1) + local w = get_value(payload, "w", 1) + local h = get_value(payload, "h", 1) + local name = get_value(payload, "name", "animated_image") + local texture_name = get_value(payload, "texture_name", "default_apple.png") + local frame_count = get_value(payload, "frame_count", 1) + local frame_duration = get_value(payload, "frame_duration", 1000) + local frame_start = get_value(payload, "frame_start", 1) + return "animated_image["..x..","..y..";"..w..","..h..";"..name..";"..texture_name..";"..frame_count..";"..frame_duration..";"..frame_start.."]" + elseif element_type == "item_image" then + local x = get_value(payload, "x", 1) + local y = get_value(payload, "y", 1) + local w = get_value(payload, "w", 1) + local h = get_value(payload, "h", 1) + local item_name = get_value(payload, "item_name", "default:apple") + return "item_image["..x..","..y..";"..w..","..h..";"..item_name.."]" + elseif element_type == "pwdfield" then + local x = get_value(payload, "x", 1) + local y = get_value(payload, "y", 1) + local w = get_value(payload, "w", 2) + local h = get_value(payload, "h", 1) + local name = get_value(payload, "name", "pwdfield") + local label = get_value(payload, "label", "Password") + return "pwdfield["..x..","..y..";"..w..","..h..";"..name..";"..label.."]" + elseif element_type == "field" then + local x = get_value(payload, "x", 1) + local y = get_value(payload, "y", 1) + local w = get_value(payload, "w", 2) + local h = get_value(payload, "h", 1) + local name = get_value(payload, "name", "field") + local label = get_value(payload, "label", "Input") + local default = get_value(payload, "default", ""):gsub("%${", "$ {") -- To prevent reading metadata + return "field["..x..","..y..";"..w..","..h..";"..name..";"..label..";"..default.."]" + elseif element_type == "field_close_on_enter" then + local name = get_value(payload, "name", "field") + local close_on_enter = get_value(payload, "close_on_enter", "false") + return "field_close_on_enter["..name..";"..close_on_enter"]" + elseif element_type == "textarea" then + local x = get_value(payload, "x", 1) + local y = get_value(payload, "y", 1) + local w = get_value(payload, "w", 2) + local h = get_value(payload, "h", 1) + local name = get_value(payload, "name", "") + local label = get_value(payload, "label", "Textarea") + local default = get_value(payload, "default", ""):gsub("%${", "$ {") -- To prevent reading metadata + return "textarea["..x..","..y..";"..w..","..h..";"..name..";"..label..";"..default.."]" + elseif element_type == "image_button" then + local x = get_value(payload, "x", 1) + local y = get_value(payload, "y", 1) + local w = get_value(payload, "w", 1) + local h = get_value(payload, "h", 1) + local texture_name = get_value(payload, "texture_name", "default_apple.png") + local name = get_value(payload, "name", "image_button") + local label = get_value(payload, "label", "") + return "image_button["..x..","..y..";"..w..","..h..";"..texture_name..";"..name..";"..label.."]" + elseif element_type == "item_image_button" then + local x = get_value(payload, "x", 1) + local y = get_value(payload, "y", 1) + local w = get_value(payload, "w", 1) + local h = get_value(payload, "h", 1) + local item_name = get_value(payload, "item_name", "default:apple") + local name = get_value(payload, "name", "item_image_button") + local label = get_value(payload, "label", "") + return "item_image_button["..x..","..y..";"..w..","..h..";"..item_name..";"..name..";"..label.."]" + elseif element_type == "button_exit" then + local x = get_value(payload, "x", 1) + local y = get_value(payload, "y", 1) + local w = get_value(payload, "w", 2) + local h = get_value(payload, "h", 1) + local name = get_value(payload, "name", "button_exit") + local label = get_value(payload, "label", "Exit Button") + return "button_exit["..x..","..y..";"..w..","..h..";"..name..";"..label.."]" + elseif element_type == "image_button_exit" then + local x = get_value(payload, "x", 1) + local y = get_value(payload, "y", 1) + local w = get_value(payload, "w", 1) + local h = get_value(payload, "h", 1) + local texture_name = get_value(payload, "texture_name", "creative_clear_icon.png") + local name = get_value(payload, "name", "image_button") + local label = get_value(payload, "label", "") + return "image_button_exit["..x..","..y..";"..w..","..h..";"..texture_name..";"..name..";"..label.."]" + elseif element_type == "box" then + local x = get_value(payload, "x", 1) + local y = get_value(payload, "y", 1) + local w = get_value(payload, "w", 2) + local h = get_value(payload, "h", 1) + local color = get_value(payload, "color", "") + return "box["..x..","..y..";"..w..","..h..";"..color.."]" + elseif element_type == "checkbox" then + local x = get_value(payload, "x", 1) + local y = get_value(payload, "y", 1) + local name = get_value(payload, "name", "checkbox") + local label = get_value(payload, "label", "") + local selected = get_value(payload, "selected", "false") + return "checkbox["..x..","..y..";"..name..";"..label..";"..selected.."]" + end end local function next_id(pos) - local nvm = N(pos) - local id = (nvm.element_id or 0) + 1 - nvm.element_id = id - return id + local nvm = N(pos) + local id = (nvm.element_id or 0) + 1 + nvm.element_id = id + return id end local function reset_id(pos) - N(pos).element_id = 0 + N(pos).element_id = 0 end local function get_elements(pos) - local nvm = N(pos) - nvm.elements = nvm.elements or {} - return nvm.elements + local nvm = N(pos) + nvm.elements = nvm.elements or {} + return nvm.elements end local function valid_payload(payload) - if not payload then return false end - if not type(payload) == "table" then return false end - if not payload.get then return false end - if not payload.next then return false end - return true + if not payload then return false end + if not type(payload) == "table" then return false end + if not payload.get then return false end + if not payload.next then return false end + return true end local function update_fs(pos) - local meta = M(pos) - local fs = "formspec_version[3]" - fs = fs .. "size[10,10]" - local elements = get_elements(pos) - for _,ele in ipairs(elements) do - fs = fs .. ele - end - meta:set_string("formspec", fs) + local meta = M(pos) + local fs = "formspec_version[3]" + fs = fs .. "size[10,10]" + local elements = get_elements(pos) + for _,ele in ipairs(elements) do + fs = fs .. ele + end + meta:set_string("formspec", fs) end local function add_content(pos, payload) - if not valid_payload(payload) then - return - end - local element = parse_payload(payload) - if not element then - return - end - local elements = get_elements(pos) - local id = next_id(pos) - elements[id] = element - update_fs(pos) - return id + if not valid_payload(payload) then + return + end + local element = parse_payload(payload) + if not element then + return + end + local elements = get_elements(pos) + local id = next_id(pos) + elements[id] = element + update_fs(pos) + return id end local function update_content(pos, payload) - if not valid_payload(payload) then - return false - end - local id = payload.get("id") - local elements = get_elements(pos) - if not id or not elements[id] then - return false - end - local element = parse_payload(payload) - if not element then - return false - end - elements[id] = element - update_fs(pos) - return true + if not valid_payload(payload) then + return false + end + local id = payload.get("id") + local elements = get_elements(pos) + if not id or not elements[id] then + return false + end + local element = parse_payload(payload) + if not element then + return false + end + elements[id] = element + update_fs(pos) + return true end local function remove_content(pos, payload) - if valid_payload(payload) then - local id = payload.get("id") - if id then - local elements = get_elements(pos) - if not elements[id] then - return false - end - elements[id] = nil - update_fs(pos) - return true - else - return false - end - end - local nvm = techage.get_nvm(pos) - nvm.elements = {} - nvm.element_id = nil - update_fs(pos) - return true + if valid_payload(payload) then + local id = payload.get("id") + if id then + local elements = get_elements(pos) + if not elements[id] then + return false + end + elements[id] = nil + update_fs(pos) + return true + else + return false + end + end + local nvm = techage.get_nvm(pos) + nvm.elements = {} + nvm.element_id = nil + update_fs(pos) + return true end minetest.register_node("ta4_addons:touchscreen", { - description = S("TA4 Display"), - inventory_image = "ta4_addons_touchscreen_inventory.png", - tiles = {"ta4_addons_touchscreen.png"}, - drawtype = "nodebox", - paramtype = "light", - sunlight_propagates = true, - paramtype2 = "wallmounted", - node_box = techage.display.lcd_box, - selection_box = techage.display.lcd_box, - light_source = 6, + description = S("TA4 Display"), + inventory_image = "ta4_addons_touchscreen_inventory.png", + tiles = {"ta4_addons_touchscreen.png"}, + drawtype = "nodebox", + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "wallmounted", + node_box = techage.display.lcd_box, + selection_box = techage.display.lcd_box, + light_source = 6, - display_entities = { - ["techage:display_entity"] = { - depth = 0.42, - on_display_update = techage.display.display_update - }, - }, + display_entities = { + ["techage:display_entity"] = { + depth = 0.42, + on_display_update = techage.display.display_update + }, + }, - after_place_node = function(pos, placer) - local number = techage.add_node(pos, "ta4_addons:touchscreen") - local meta = M(pos) - meta:set_string("node_number", number) - meta:set_string("infotext", S("Touchscreen no: ")..number) - update_fs(pos) - local nvm = techage.get_nvm(pos) - nvm.text = {"My", "Techage","TA4", "Touchscreen", "No: "..number} - lcdlib.update_entities(pos) - minetest.get_node_timer(pos):start(1) - end, + after_place_node = function(pos, placer) + local number = techage.add_node(pos, "ta4_addons:touchscreen") + local meta = M(pos) + meta:set_string("node_number", number) + meta:set_string("infotext", S("Touchscreen no: ")..number) + update_fs(pos) + local nvm = techage.get_nvm(pos) + nvm.text = {"My", "Techage","TA4", "Touchscreen", "No: "..number} + lcdlib.update_entities(pos) + minetest.get_node_timer(pos):start(1) + end, - after_dig_node = function(pos, oldnode, oldmetadata) - remove_content(pos) - techage.remove_node(pos, oldnode, oldmetadata) - end, - - on_rightclick = function(pos, node, clicker) - local meta = M(pos) - local ctrl = meta:get_string("ctrl") - if ctrl then - local own_num = meta:get_string("node_number") or "" - techage.send_single(own_num, ctrl, "msg", safer_lua.Store("_touchscreen_opened_by", clicker:get_player_name())) - end - end, + after_dig_node = function(pos, oldnode, oldmetadata) + remove_content(pos) + techage.remove_node(pos, oldnode, oldmetadata) + end, - on_receive_fields = function(pos, formname, fields, sender) - local meta = M(pos) - local player_name = sender:get_player_name() - if meta:get_string("public") ~= "true" and minetest.is_protected(pos, player_name) then - return - end - local fields_store = safer_lua.Store() - for k,v in pairs(fields) do - fields_store.set(k, v) - end - fields_store.set("_sent_by", player_name) - local ctrl = meta:get_string("ctrl") - if ctrl then - local own_num = meta:get_string("node_number") or "" - techage.send_single(own_num, ctrl, "msg", fields_store) - end - end, + on_rightclick = function(pos, node, clicker) + local meta = M(pos) + local ctrl = meta:get_string("ctrl") + if ctrl then + local own_num = meta:get_string("node_number") or "" + techage.send_single(own_num, ctrl, "msg", safer_lua.Store("_touchscreen_opened_by", clicker:get_player_name())) + end + end, - on_timer = techage.display.on_timer, - on_place = lcdlib.on_place, - on_construct = lcdlib.on_construct, - on_destruct = lcdlib.on_destruct, - on_rotate = lcdlib.on_rotate, - groups = {cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_glass_defaults(), + on_receive_fields = function(pos, formname, fields, sender) + local meta = M(pos) + local player_name = sender:get_player_name() + if meta:get_string("public") ~= "true" and minetest.is_protected(pos, player_name) then + return + end + local fields_store = safer_lua.Store() + for k,v in pairs(fields) do + fields_store.set(k, v) + end + fields_store.set("_sent_by", player_name) + local ctrl = meta:get_string("ctrl") + if ctrl then + local own_num = meta:get_string("node_number") or "" + techage.send_single(own_num, ctrl, "msg", fields_store) + end + end, + + on_timer = techage.display.on_timer, + on_place = lcdlib.on_place, + on_construct = lcdlib.on_construct, + on_destruct = lcdlib.on_destruct, + on_rotate = lcdlib.on_rotate, + groups = {cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_glass_defaults(), }) minetest.register_craft({ - output = "ta4_addons:touchscreen", - recipe = { - {"", "dye:blue", ""}, - {"default:copper_ingot", "techage:ta4_display", "default:copper_ingot"}, - {"", "default:mese_crystal_fragment", ""}, - }, + output = "ta4_addons:touchscreen", + recipe = { + {"", "dye:blue", ""}, + {"default:copper_ingot", "techage:ta4_display", "default:copper_ingot"}, + {"", "default:mese_crystal_fragment", ""}, + }, }) techage.register_node({"ta4_addons:touchscreen"}, { - on_recv_message = function(pos, src, topic, payload) - if topic == "add" then -- add one line and scroll if necessary - techage.display.add_line(pos, payload, 1) - elseif topic == "set" then -- overwrite the given row - techage.display.write_row(pos, payload, 1) - elseif topic == "clear" then -- clear the screen - techage.display.clear_screen(pos, 1) - elseif topic == "add_content" then - M(pos):set_string("ctrl", src) - return add_content(pos, payload) - elseif topic == "update_content" then - M(pos):set_string("ctrl", src) - return update_content(pos, payload) - elseif topic == "remove_content" then - M(pos):set_string("ctrl", src) - return remove_content(pos, payload) - elseif topic == "private" then - M(pos):set_string("public", "false") - elseif topic == "public" then - M(pos):set_string("public", "true") - end - end, + on_recv_message = function(pos, src, topic, payload) + if topic == "add" then -- add one line and scroll if necessary + techage.display.add_line(pos, payload, 1) + elseif topic == "set" then -- overwrite the given row + techage.display.write_row(pos, payload, 1) + elseif topic == "clear" then -- clear the screen + techage.display.clear_screen(pos, 1) + elseif topic == "add_content" then + M(pos):set_string("ctrl", src) + return add_content(pos, payload) + elseif topic == "update_content" then + M(pos):set_string("ctrl", src) + return update_content(pos, payload) + elseif topic == "remove_content" then + M(pos):set_string("ctrl", src) + return remove_content(pos, payload) + elseif topic == "private" then + M(pos):set_string("public", "false") + elseif topic == "public" then + M(pos):set_string("public", "true") + end + end, }) \ No newline at end of file diff --git a/unified_inventory/.github/workflows/check-release.yml b/unified_inventory/.github/workflows/check-release.yml new file mode 100644 index 0000000..47313ff --- /dev/null +++ b/unified_inventory/.github/workflows/check-release.yml @@ -0,0 +1,11 @@ +on: [push, pull_request] +name: Check & Release +jobs: + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@master + - name: lint + uses: Roang-zero1/factorio-mod-luacheck@master + with: + luacheckrc_url: https://raw.githubusercontent.com/minetest-mods/unified_inventory/master/.luacheckrc diff --git a/unified_inventory/.luacheckrc b/unified_inventory/.luacheckrc index 9fb6a7c..e6fec97 100644 --- a/unified_inventory/.luacheckrc +++ b/unified_inventory/.luacheckrc @@ -14,6 +14,7 @@ read_globals = { "ItemStack", "datastorage", "hb", + "doors", } files["callbacks.lua"].ignore = { "player", "draw_lite_mode" } diff --git a/unified_inventory/README.md b/unified_inventory/README.md index 8c917ec..5d23f79 100644 --- a/unified_inventory/README.md +++ b/unified_inventory/README.md @@ -15,7 +15,8 @@ Unified Inventory replaces the default survival and creative inventory. * Recipe search function by ingredients * Up to four bags with up to 24 slots each * Home function to teleport - * Trash slot + * Trash slot and refill slot for creative + * Waypoints to keep track of important locations * Lite mode: reduces the item browser width * `minetest.conf` setting `unified_inventory_lite = true` * Mod API for modders: see [mod_api.txt](doc/mod_api.txt) @@ -24,7 +25,11 @@ Unified Inventory replaces the default survival and creative inventory. ## Requirements - * Minetest 5.0.0+ + * Minetest 5.4.0+ + * Mod `default` for category filters (contained in Minetest Game) + * Mod `farming` for craftable bags (contained in Minetest Game) + * For waypoint migration: `datastorage` + # Licenses @@ -96,4 +101,4 @@ Other files from Wikimedia Commons: RealBadAngel: (CC-BY-4.0) - * Everything else. \ No newline at end of file + * Everything else. diff --git a/unified_inventory/api.lua b/unified_inventory/api.lua index 81dd8f3..8cc5532 100644 --- a/unified_inventory/api.lua +++ b/unified_inventory/api.lua @@ -1,5 +1,6 @@ local S = minetest.get_translator("unified_inventory") local F = minetest.formspec_escape +local ui = unified_inventory -- Create detached creative inventory after loading all mods minetest.after(0.01, function() @@ -8,12 +9,12 @@ minetest.after(0.01, function() if not rev_aliases[target] then rev_aliases[target] = {} end table.insert(rev_aliases[target], source) end - unified_inventory.items_list = {} + ui.items_list = {} for name, def in pairs(minetest.registered_items) do if (not def.groups.not_in_creative_inventory or def.groups.not_in_creative_inventory == 0) and def.description and def.description ~= "" then - table.insert(unified_inventory.items_list, name) + table.insert(ui.items_list, name) local all_names = rev_aliases[name] or {} table.insert(all_names, name) for _, player_name in ipairs(all_names) do @@ -26,30 +27,30 @@ minetest.after(0.01, function() for _,chk in pairs(recipe.items) do local groupchk = string.find(chk, "group:") if (not groupchk and not minetest.registered_items[chk]) - or (groupchk and not unified_inventory.get_group_item(string.gsub(chk, "group:", "")).item) + or (groupchk and not ui.get_group_item(string.gsub(chk, "group:", "")).item) or minetest.get_item_group(chk, "not_in_craft_guide") ~= 0 then unknowns = true end end if not unknowns then - unified_inventory.register_craft(recipe) + ui.register_craft(recipe) end end end end end end - table.sort(unified_inventory.items_list) - unified_inventory.items_list_size = #unified_inventory.items_list - print("Unified Inventory. inventory size: "..unified_inventory.items_list_size) - for _, name in ipairs(unified_inventory.items_list) do + table.sort(ui.items_list) + ui.items_list_size = #ui.items_list + print("Unified Inventory. inventory size: "..ui.items_list_size) + for _, name in ipairs(ui.items_list) do local def = minetest.registered_items[name] -- Simple drops if type(def.drop) == "string" then local dstack = ItemStack(def.drop) if not dstack:is_empty() and dstack:get_name() ~= name then - unified_inventory.register_craft({ + ui.register_craft({ type = "digging", items = {name}, output = def.drop, @@ -115,7 +116,7 @@ minetest.after(0.01, function() end end for itemstring, count in pairs(drop_guaranteed) do - unified_inventory.register_craft({ + ui.register_craft({ type = "digging", items = {name}, output = itemstring .. " " .. count, @@ -123,7 +124,7 @@ minetest.after(0.01, function() }) end for itemstring, count in pairs(drop_maybe) do - unified_inventory.register_craft({ + ui.register_craft({ type = "digging_chance", items = {name}, output = itemstring .. " " .. count, @@ -132,33 +133,37 @@ minetest.after(0.01, function() end end end - for _, recipes in pairs(unified_inventory.crafts_for.recipe) do + for _, recipes in pairs(ui.crafts_for.recipe) do for _, recipe in ipairs(recipes) do local ingredient_items = {} for _, spec in pairs(recipe.items) do - local matches_spec = unified_inventory.canonical_item_spec_matcher(spec) - for _, name in ipairs(unified_inventory.items_list) do + local matches_spec = ui.canonical_item_spec_matcher(spec) + for _, name in ipairs(ui.items_list) do if matches_spec(name) then ingredient_items[name] = true end end end for name, _ in pairs(ingredient_items) do - if unified_inventory.crafts_for.usage[name] == nil then - unified_inventory.crafts_for.usage[name] = {} + if ui.crafts_for.usage[name] == nil then + ui.crafts_for.usage[name] = {} end - table.insert(unified_inventory.crafts_for.usage[name], recipe) + table.insert(ui.crafts_for.usage[name], recipe) end end end + + for _, callback in ipairs(ui.initialized_callbacks) do + callback() + end end) -- load_home local function load_home() - local input = io.open(unified_inventory.home_filename, "r") + local input = io.open(ui.home_filename, "r") if not input then - unified_inventory.home_pos = {} + ui.home_pos = {} return end while true do @@ -167,25 +172,31 @@ local function load_home() local y = input:read("*n") local z = input:read("*n") local name = input:read("*l") - unified_inventory.home_pos[name:sub(2)] = {x = x, y = y, z = z} + ui.home_pos[name:sub(2)] = {x = x, y = y, z = z} end io.close(input) end load_home() -function unified_inventory.set_home(player, pos) +function ui.set_home(player, pos) local player_name = player:get_player_name() - unified_inventory.home_pos[player_name] = vector.round(pos) + ui.home_pos[player_name] = vector.round(pos) + -- save the home data from the table to the file - local output = io.open(unified_inventory.home_filename, "w") - for k, v in pairs(unified_inventory.home_pos) do + local output = io.open(ui.home_filename, "w") + if not output then + minetest.log("warning", "[unified_inventory] Failed to save file: " + .. ui.home_filename) + return + end + for k, v in pairs(ui.home_pos) do output:write(v.x.." "..v.y.." "..v.z.." "..k.."\n") end io.close(output) end -function unified_inventory.go_home(player) - local pos = unified_inventory.home_pos[player:get_player_name()] +function ui.go_home(player) + local pos = ui.home_pos[player:get_player_name()] if pos then player:set_pos(pos) return true @@ -194,7 +205,7 @@ function unified_inventory.go_home(player) end -- register_craft -function unified_inventory.register_craft(options) +function ui.register_craft(options) if not options.output then return end @@ -205,10 +216,15 @@ function unified_inventory.register_craft(options) if options.type == "normal" and options.width == 0 then options = { type = "shapeless", items = options.items, output = options.output, width = 0 } end - if not unified_inventory.crafts_for.recipe[itemstack:get_name()] then - unified_inventory.crafts_for.recipe[itemstack:get_name()] = {} + local item_name = itemstack:get_name() + if not ui.crafts_for.recipe[item_name] then + ui.crafts_for.recipe[item_name] = {} + end + table.insert(ui.crafts_for.recipe[item_name],options) + + for _, callback in ipairs(ui.craft_registered_callbacks) do + callback(item_name, options) end - table.insert(unified_inventory.crafts_for.recipe[itemstack:get_name()],options) end @@ -219,7 +235,7 @@ local craft_type_defaults = { } -function unified_inventory.craft_type_defaults(name, options) +function ui.craft_type_defaults(name, options) if not options.description then options.description = name end @@ -228,13 +244,13 @@ function unified_inventory.craft_type_defaults(name, options) end -function unified_inventory.register_craft_type(name, options) - unified_inventory.registered_craft_types[name] = - unified_inventory.craft_type_defaults(name, options) +function ui.register_craft_type(name, options) + ui.registered_craft_types[name] = + ui.craft_type_defaults(name, options) end -unified_inventory.register_craft_type("normal", { +ui.register_craft_type("normal", { description = F(S("Crafting")), icon = "ui_craftgrid_icon.png", width = 3, @@ -250,7 +266,7 @@ unified_inventory.register_craft_type("normal", { }) -unified_inventory.register_craft_type("shapeless", { +ui.register_craft_type("shapeless", { description = F(S("Mixing")), icon = "ui_craftgrid_icon.png", width = 3, @@ -265,7 +281,7 @@ unified_inventory.register_craft_type("shapeless", { }) -unified_inventory.register_craft_type("cooking", { +ui.register_craft_type("cooking", { description = F(S("Cooking")), icon = "default_furnace_front.png", width = 1, @@ -273,37 +289,86 @@ unified_inventory.register_craft_type("cooking", { }) -unified_inventory.register_craft_type("digging", { +ui.register_craft_type("digging", { description = F(S("Digging")), icon = "default_tool_steelpick.png", width = 1, height = 1, }) -unified_inventory.register_craft_type("digging_chance", { +ui.register_craft_type("digging_chance", { description = "Digging (by chance)", icon = "default_tool_steelpick.png^[transformFY.png", width = 1, height = 1, }) -function unified_inventory.register_page(name, def) - unified_inventory.pages[name] = def +function ui.register_page(name, def) + ui.pages[name] = def end -function unified_inventory.register_button(name, def) +function ui.register_button(name, def) if not def.action then def.action = function(player) - unified_inventory.set_inventory_formspec(player, name) + ui.set_inventory_formspec(player, name) end end def.name = name - table.insert(unified_inventory.buttons, def) + table.insert(ui.buttons, def) end +function ui.register_on_initialized(callback) + if type(callback) ~= "function" then + error(("Initialized callback must be a function, %s given."):format(type(callback))) + end + table.insert(ui.initialized_callbacks, callback) +end -function unified_inventory.is_creative(playername) +function ui.register_on_craft_registered(callback) + if type(callback) ~= "function" then + error(("Craft registered callback must be a function, %s given."):format(type(callback))) + end + table.insert(ui.craft_registered_callbacks, callback) +end + +function ui.get_recipe_list(output) + return ui.crafts_for.recipe[output] +end + +function ui.get_registered_outputs() + local outputs = {} + for item_name, _ in pairs(ui.crafts_for.recipe) do + table.insert(outputs, item_name) + end + return outputs +end + +function ui.is_creative(playername) return minetest.check_player_privs(playername, {creative=true}) or minetest.settings:get_bool("creative_mode") end + +function ui.single_slot(xpos, ypos, bright) + return string.format("background9[%f,%f;%f,%f;ui_single_slot%s.png;false;16]", + xpos, ypos, ui.imgscale, ui.imgscale, (bright and "_bright" or "") ) +end + +function ui.make_trash_slot(xpos, ypos) + return + ui.single_slot(xpos, ypos).. + "image["..xpos..","..ypos..";1.25,1.25;ui_trash_slot_icon.png]".. + "list[detached:trash;main;"..(xpos + ui.list_img_offset)..","..(ypos + ui.list_img_offset)..";1,1;]" +end + +function ui.make_inv_img_grid(xpos, ypos, width, height, bright) + local tiled = {} + local n=1 + for y = 0, (height - 1) do + for x = 0, (width -1) do + tiled[n] = ui.single_slot(xpos + (ui.imgscale * x), ypos + (ui.imgscale * y), bright) + n = n + 1 + end + end + return table.concat(tiled) +end diff --git a/unified_inventory/bags.lua b/unified_inventory/bags.lua index 1bb2b5c..14ac875 100644 --- a/unified_inventory/bags.lua +++ b/unified_inventory/bags.lua @@ -7,29 +7,32 @@ License: GPLv3 local S = minetest.get_translator("unified_inventory") local F = minetest.formspec_escape -local bags_inv_bg_prefix = "image[-0.1,1.0;10.05," +local ui = unified_inventory -unified_inventory.register_page("bags", { +ui.register_page("bags", { get_formspec = function(player) local player_name = player:get_player_name() return { formspec = table.concat({ - string.gsub(unified_inventory.standard_inv_bg, "YYY", "4.4"), - bags_inv_bg_prefix.."1.175;ui_bags_header.png]", - "label[0,0;" .. F(S("Bags")) .. "]", - "button[0,2.2;2,0.5;bag1;" .. F(S("Bag @1", 1)) .. "]", - "button[2,2.2;2,0.5;bag2;" .. F(S("Bag @1", 2)) .. "]", - "button[4,2.2;2,0.5;bag3;" .. F(S("Bag @1", 3)) .. "]", - "button[6,2.2;2,0.5;bag4;" .. F(S("Bag @1", 4)) .. "]", + ui.style_full.standard_inv_bg, + ui.single_slot(0.925, 1.5), + ui.single_slot(3.425, 1.5), + ui.single_slot(5.925, 1.5), + ui.single_slot(8.425, 1.5), + "label["..ui.style_full.form_header_x..","..ui.style_full.form_header_y..";" .. F(S("Bags")) .. "]", + "button[0.6125,2.75;1.875,0.75;bag1;" .. F(S("Bag @1", 1)) .. "]", + "button[3.1125,2.75;1.875,0.75;bag2;" .. F(S("Bag @1", 2)) .. "]", + "button[5.6125,2.75;1.875,0.75;bag3;" .. F(S("Bag @1", 3)) .. "]", + "button[8.1125,2.75;1.875,0.75;bag4;" .. F(S("Bag @1", 4)) .. "]", "listcolors[#00000000;#00000000]", - "list[detached:" .. F(player_name) .. "_bags;bag1;0.5,1.1;1,1;]", - "list[detached:" .. F(player_name) .. "_bags;bag2;2.5,1.1;1,1;]", - "list[detached:" .. F(player_name) .. "_bags;bag3;4.5,1.1;1,1;]", - "list[detached:" .. F(player_name) .. "_bags;bag4;6.5,1.1;1,1;]" + "list[detached:" .. F(player_name) .. "_bags;bag1;1.075,1.65;1,1;]", + "list[detached:" .. F(player_name) .. "_bags;bag2;3.575,1.65;1,1;]", + "list[detached:" .. F(player_name) .. "_bags;bag3;6.075,1.65;1,1;]", + "list[detached:" .. F(player_name) .. "_bags;bag4;8.575,1.65;1,1;]" }) } end, }) -unified_inventory.register_button("bags", { +ui.register_button("bags", { type = "image", image = "ui_bags_icon.png", tooltip = S("Bags"), @@ -44,33 +47,31 @@ local function get_player_bag_stack(player, i) end for bag_i = 1, 4 do - unified_inventory.register_page("bag" .. bag_i, { + ui.register_page("bag" .. bag_i, { get_formspec = function(player) local stack = get_player_bag_stack(player, bag_i) local image = stack:get_definition().inventory_image - local fs = { - string.gsub(unified_inventory.standard_inv_bg, "YYY", "4.4"), - "image[7,0;1,1;" .. image .. "]", - "label[0,0;" .. F(S("Bag @1", bag_i)) .. "]", - "listcolors[#00000000;#00000000]", - "list[current_player;bag" .. bag_i .. "contents;0,1.1;8,3;]", - "listring[current_name;bag" .. bag_i .. "contents]", - "listring[current_player;main]", - } local slots = stack:get_definition().groups.bagslots - if slots == 8 then - fs[#fs + 1] = bags_inv_bg_prefix.."1.175;ui_bags_inv_small.png]" - elseif slots == 16 then - fs[#fs + 1] = bags_inv_bg_prefix.."2.35;ui_bags_inv_medium.png]" - elseif slots == 24 then - fs[#fs + 1] = bags_inv_bg_prefix.."3.525;ui_bags_inv_large.png]" - end + + local formspec = { + ui.style_full.standard_inv_bg, + ui.make_inv_img_grid(0.3, 1.5, 8, slots/8), + "image[9.2,0.4;1,1;" .. image .. "]", + "label[0.3,0.65;" .. F(S("Bag @1", bag_i)) .. "]", + "listcolors[#00000000;#00000000]", + "listring[current_player;main]", + string.format("list[current_player;bag%icontents;%f,%f;8,3;]", + bag_i, 0.3 + ui.list_img_offset, 1.5 + ui.list_img_offset), + "listring[current_name;bag" .. bag_i .. "contents]", + } + local n = #formspec + 1 + local player_name = player:get_player_name() -- For if statement. - if unified_inventory.trash_enabled - or unified_inventory.is_creative(player_name) - or minetest.get_player_privs(player_name).give then - fs[#fs + 1] = "image[5.91,-0.06;1.21,1.15;ui_bags_trash.png]" - .. "list[detached:trash;main;6,0.1;1,1;]" + if ui.trash_enabled + or ui.is_creative(player_name) + or minetest.get_player_privs(player_name).give then + formspec[n] = ui.make_trash_slot(7.8, 0.25) + n = n + 1 end local inv = player:get_inventory() for i = 1, 4 do @@ -87,11 +88,12 @@ for bag_i = 1, 4 do end local img = def.inventory_image local label = F(S("Bag @1", i)) .. "\n" .. used .. "/" .. size - fs[#fs + 1] = string.format("image_button[%i,0;1,1;%s;bag%i;%s]", - i + 1, img, i, label) + formspec[n] = string.format("image_button[%f,0.4;1,1;%s;bag%i;%s]", + (i + 1.35)*1.25, img, i, label) + n = n + 1 end end - return { formspec = table.concat(fs) } + return { formspec = table.concat(formspec) } end, }) end @@ -106,7 +108,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) if not stack:get_definition().groups.bagslots then return end - unified_inventory.set_inventory_formspec(player, "bag" .. i) + ui.set_inventory_formspec(player, "bag" .. i) return end end diff --git a/unified_inventory/callbacks.lua b/unified_inventory/callbacks.lua index bc90237..5874a0f 100644 --- a/unified_inventory/callbacks.lua +++ b/unified_inventory/callbacks.lua @@ -19,11 +19,12 @@ minetest.register_on_joinplayer(function(player) unified_inventory.active_search_direction[player_name] = "nochange" unified_inventory.apply_filter(player, "", "nochange") unified_inventory.current_searchbox[player_name] = "" + unified_inventory.current_category[player_name] = "all" + unified_inventory.current_category_scroll[player_name] = 0 unified_inventory.alternate[player_name] = 1 unified_inventory.current_item[player_name] = nil unified_inventory.current_craft_direction[player_name] = "recipe" - unified_inventory.set_inventory_formspec(player, - unified_inventory.default) + unified_inventory.set_inventory_formspec(player, unified_inventory.default) -- Refill slot local refill = minetest.create_detached_inventory(player_name.."refill", { @@ -69,6 +70,41 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) unified_inventory.current_searchbox[player_name] = fields.searchbox end + + local clicked_category + for name, value in pairs(fields) do + local category_name = string.match(name, "^category_(.+)$") + if category_name then + clicked_category = category_name + break + end + end + + if clicked_category + and clicked_category ~= unified_inventory.current_category[player_name] then + unified_inventory.current_category[player_name] = clicked_category + unified_inventory.apply_filter(player, unified_inventory.current_searchbox[player_name], "nochange") + unified_inventory.set_inventory_formspec(player, + unified_inventory.current_page[player_name]) + end + + if fields.next_category then + local scroll = math.min(#unified_inventory.category_list-ui_peruser.pagecols, unified_inventory.current_category_scroll[player_name] + 1) + if scroll ~= unified_inventory.current_category_scroll[player_name] then + unified_inventory.current_category_scroll[player_name] = scroll + unified_inventory.set_inventory_formspec(player, + unified_inventory.current_page[player_name]) + end + end + if fields.prev_category then + local scroll = math.max(0, unified_inventory.current_category_scroll[player_name] - 1) + if scroll ~= unified_inventory.current_category_scroll[player_name] then + unified_inventory.current_category_scroll[player_name] = scroll + unified_inventory.set_inventory_formspec(player, + unified_inventory.current_page[player_name]) + end + end + for i, def in pairs(unified_inventory.buttons) do if fields[def.name] then def.action(player) @@ -121,11 +157,12 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) -- Check clicked item image button local clicked_item for name, value in pairs(fields) do - local new_dir, mangled_item = string.match(name, "^item_button_([a-z]+)_(.*)$") + local new_dir, mangled_item = string.match(name, "^[0-9]*_?item_button_([a-z]+)_(.*)$") if new_dir and mangled_item then clicked_item = unified_inventory.demangle_for_formspec(mangled_item) if string.sub(clicked_item, 1, 6) == "group:" then -- Change search filter to this group + unified_inventory.current_category[player_name] = "all" apply_new_filter(player, clicked_item, new_dir) return end diff --git a/unified_inventory/category.lua b/unified_inventory/category.lua new file mode 100644 index 0000000..d0fee5e --- /dev/null +++ b/unified_inventory/category.lua @@ -0,0 +1,150 @@ +local S = minetest.get_translator("unified_inventory") + +unified_inventory.registered_categories = {} +unified_inventory.registered_category_items = {} +unified_inventory.category_list = {} + +local function char_to_sort_index(char_code) + if char_code <= 32 then + -- Command codes, no thanks + return 0 + end + if char_code <= 64 then + -- Sorts numbers, and some punctuation, after letters + return char_code + end + if char_code >= 158 then + -- Out of sortable range + return 0 + end + if char_code > 122 then + -- Avoids overlap with {, |, } and ~ + return char_code - 58 + end + if char_code > 96 then + -- Normalises lowercase with uppercase + return char_code - 96 + end + return char_code - 64 +end + +local function string_to_sort_index(str) + local max_chars = 5 + local power = 100 + local index = 0 + for i=1,math.min(#str, max_chars) do + index = index + (char_to_sort_index(string.byte(str, i))/(power^i)) + end + return index +end + +function update_category_list() + local category_list = {} + table.insert(category_list, { + name = "all", + label = S("All Items"), + symbol = "ui_category_all.png", + index = -2, + }) + table.insert(category_list, { + name = "uncategorized", + label = S("Misc. Items"), + symbol = "ui_category_none.png", + index = -1, + }) + for category, def in pairs(unified_inventory.registered_categories) do + table.insert(category_list, { + name = category, + label = def.label or category, + symbol = def.symbol, + index = def.index or -- sortby defined order + string_to_sort_index(category) -- or do a rudimentary alphabetical sort + }) + end + table.sort(category_list, function (a,b) + return a.index < b.index + end) + unified_inventory.category_list = category_list +end + +local function ensure_category_exists(category_name) + if not unified_inventory.registered_categories[category_name] then + unified_inventory.registered_categories[category_name] = { + symbol = "unknown_item.png", + label = category_name + } + end + if not unified_inventory.registered_category_items[category_name] then + unified_inventory.registered_category_items[category_name] = {} + end +end + +function unified_inventory.register_category(category_name, config) + ensure_category_exists(category_name) + config = config or {} + if config.symbol then + unified_inventory.set_category_symbol(category_name, config.symbol) + end + if config.label then + unified_inventory.set_category_label(category_name, config.label) + end + if config.index then + unified_inventory.set_category_index(category_name, config.index) + end + if config.items then + unified_inventory.add_category_items(category_name, config.items) + end + update_category_list() +end +function unified_inventory.set_category_symbol(category_name, symbol) + ensure_category_exists(category_name) + unified_inventory.registered_categories[category_name].symbol = symbol + update_category_list() +end +function unified_inventory.set_category_label(category_name, label) + ensure_category_exists(category_name) + unified_inventory.registered_categories[category_name].label = label + update_category_list() +end +function unified_inventory.set_category_index(category_name, index) + ensure_category_exists(category_name) + unified_inventory.registered_categories[category_name].index = index + update_category_list() +end +function unified_inventory.add_category_item(category_name, item) + ensure_category_exists(category_name) + unified_inventory.registered_category_items[category_name][item] = true +end +function unified_inventory.add_category_items(category_name, items) + for _,item in ipairs(items) do + unified_inventory.add_category_item(category_name, item) + end +end + +function unified_inventory.remove_category_item(category_name, item) + unified_inventory.registered_category_items[category_name][item] = nil +end +function unified_inventory.remove_category(category_name) + unified_inventory.registered_categories[category_name] = nil + unified_inventory.registered_category_items[category_name] = nil + update_category_list() +end + +function unified_inventory.find_category(item) + -- Returns the first category the item exists in + -- Best for checking if an item has any category at all + for category, items in pairs(unified_inventory.registered_category_items) do + if items[item] then return category end + end +end +function unified_inventory.find_categories(item) + -- Returns all the categories the item exists in + -- Best for listing all categories + local categories = {} + for category, items in pairs(unified_inventory.registered_category_items) do + if items[item] then + table.insert(categories, category) + end + end + return categories +end diff --git a/unified_inventory/default-categories.lua b/unified_inventory/default-categories.lua new file mode 100644 index 0000000..57d3e88 --- /dev/null +++ b/unified_inventory/default-categories.lua @@ -0,0 +1,704 @@ +local S = minetest.get_translator("unified_inventory") + +unified_inventory.register_category('plants', { + symbol = "flowers:tulip", + label = S("Plant Life") +}) +unified_inventory.register_category('building', { + symbol = "default:brick", + label = S("Building Materials") +}) +unified_inventory.register_category('tools', { + symbol = "default:pick_diamond", + label = S("Tools") +}) +unified_inventory.register_category('minerals', { + symbol = "default:iron_lump", + label = S("Minerals and Metals") +}) +unified_inventory.register_category('environment', { + symbol = "default:dirt_with_grass", + label = S("Environment and Worldgen") +}) +unified_inventory.register_category('lighting', { + symbol = "default:torch", + label = S("Lighting") +}) + + +if unified_inventory.automatic_categorization then + minetest.register_on_mods_loaded(function() + + -- Add biome nodes to environment category + for _,def in pairs(minetest.registered_biomes) do + local env_nodes = { + def.node_riverbed, def.node_top, def.node_filler, def.node_dust, + } + for i,node in pairs(env_nodes) do + if node then + unified_inventory.add_category_item('environment', node) + end + end + end + + -- Add minable ores to minerals and everything else (pockets of stone & sand variations) to environment + for _,item in pairs(minetest.registered_ores) do + if item.ore_type == "scatter" then + local drop = minetest.registered_nodes[item.ore].drop + if drop and drop ~= "" then + unified_inventory.add_category_item('minerals', item.ore) + unified_inventory.add_category_item('minerals', drop) + else + unified_inventory.add_category_item('environment', item.ore) + end + else + unified_inventory.add_category_item('environment', item.ore) + end + end + + -- Add items by item definition + for name, def in pairs(minetest.registered_items) do + local group = def.groups or {} + if not group.not_in_creative_inventory then + if group.stair or + group.slab or + group.wall or + group.fence then + unified_inventory.add_category_item('building', name) + elseif group.flora or + group.flower or + group.seed or + group.leaves or + group.sapling or + group.tree then + unified_inventory.add_category_item('plants', name) + elseif def.type == 'tool' then + unified_inventory.add_category_item('tools', name) + elseif def.liquidtype == 'source' then + unified_inventory.add_category_item('environment', name) + elseif def.light_source and def.light_source > 0 then + unified_inventory.add_category_item('lighting', name) + elseif group.door or + minetest.global_exists("doors") and ( + doors.registered_doors and doors.registered_doors[name..'_a'] or + doors.registered_trapdoors and doors.registered_trapdoors[name] + ) then + unified_inventory.add_category_item('building', name) + end + end + end + end) +end + +-- [[ +unified_inventory.add_category_items('plants', { + "default:dry_grass_5", + "default:acacia_sapling", + "default:blueberry_bush_sapling", + "default:grass_2", + "default:pine_bush_stem", + "default:leaves", + "default:pine_needles", + "default:cactus", + "default:junglegrass", + "default:pine_sapling", + "default:sapling", + "default:bush_stem", + "default:dry_grass_2", + "default:fern_1", + "default:grass_3", + "default:marram_grass_1", + "default:pine_tree", + "default:dry_grass_3", + "default:dry_shrub", + "default:grass_4", + "default:marram_grass_2", + "default:jungleleaves", + "default:apple", + "default:tree", + "default:aspen_tree", + "default:bush_sapling", + "default:grass_5", + "default:blueberry_bush_leaves_with_berries", + "default:acacia_bush_sapling", + "default:grass_1", + "default:aspen_leaves", + "default:marram_grass_3", + "default:large_cactus_seedling", + "default:junglesapling", + "default:dry_grass_4", + "default:acacia_bush_stem", + "default:papyrus", + "default:pine_bush_needles", + "default:bush_leaves", + "default:fern_3", + "default:aspen_sapling", + "default:acacia_tree", + "default:apple_mark", + "default:acacia_leaves", + "default:jungletree", + "default:dry_grass_1", + "default:acacia_bush_leaves", + "default:emergent_jungle_sapling", + "default:fern_2", + "default:blueberries", + "default:sand_with_kelp", + "default:blueberry_bush_leaves", + "default:pine_bush_sapling", + + "farming:cotton", + "farming:cotton_1", + "farming:cotton_2", + "farming:cotton_3", + "farming:cotton_4", + "farming:cotton_5", + "farming:cotton_6", + "farming:cotton_7", + "farming:cotton_8", + "farming:cotton_wild", + "farming:seed_cotton", + "farming:seed_wheat", + "farming:straw", + "farming:wheat", + "farming:wheat_1", + "farming:wheat_2", + "farming:wheat_3", + "farming:wheat_4", + "farming:wheat_5", + "farming:wheat_6", + "farming:wheat_7", + "farming:wheat_8", + + "flowers:chrysanthemum_green", + "flowers:dandelion_white", + "flowers:dandelion_yellow", + "flowers:geranium", + "flowers:mushroom_brown", + "flowers:mushroom_red", + "flowers:rose", + "flowers:tulip", + "flowers:tulip_black", + "flowers:viola", + "flowers:waterlily", + "flowers:waterlily_waving", +}) + +unified_inventory.add_category_items('tools', { + "default:sword_diamond", + "default:axe_diamond", + "default:shovel_diamond", + "default:axe_steel", + "default:shovel_mese", + "default:sword_wood", + "default:pick_bronze", + "default:axe_stone", + "default:sword_stone", + "default:pick_stone", + "default:shovel_stone", + "default:sword_mese", + "default:shovel_bronze", + "default:sword_bronze", + "default:axe_bronze", + "default:shovel_steel", + "default:sword_steel", + "default:axe_mese", + "default:shovel_wood", + "default:pick_mese", + "default:axe_wood", + "default:pick_diamond", + "default:pick_wood", + "default:pick_steel", + + "farming:hoe_bronze", + "farming:hoe_diamond", + "farming:hoe_mese", + "farming:hoe_steel", + "farming:hoe_stone", + "farming:hoe_wood", + + "fire:flint_and_steel", + "map:mapping_kit", + "screwdriver:screwdriver", + + "fireflies:bug_net", + "bucket:bucket_empty", + + "binoculars:binoculars", + "default:skeleton_key", +}) + +unified_inventory.add_category_items('minerals', { + "default:stone_with_copper", + "default:stone_with_gold", + "default:stone_with_iron", + "default:copper_ingot", + "default:copper_lump", + "default:gold_lump", + "default:diamondblock", + "default:stone_with_diamond", + "default:stone_with_mese", + "default:steel_ingot", + "default:gold_ingot", + "default:iron_lump", + "default:tinblock", + "default:tin_lump", + "default:stone_with_tin", + "default:mese_crystal", + "default:diamond", + "default:bronze_ingot", + "default:mese", + "default:mese_crystal_fragment", + "default:copperblock", + "default:stone_with_coal", + "default:steelblock", + "default:tin_ingot", + "default:coalblock", + "default:coal_lump", + "default:bronzeblock", + "default:goldblock", + + "stairs:slab_bronzeblock", + "stairs:slab_copperblock", + "stairs:slab_steelblock", + "stairs:slab_tinblock", + "stairs:stair_bronzeblock", + "stairs:stair_copperblock", + "stairs:stair_inner_bronzeblock", + "stairs:stair_inner_copperblock", + "stairs:stair_inner_steelblock", + "stairs:stair_inner_tinblock", + "stairs:stair_outer_bronzeblock", + "stairs:stair_outer_copperblock", + "stairs:stair_outer_steelblock", + "stairs:stair_outer_tinblock", + "stairs:stair_steelblock", + "stairs:stair_tinblock", +}) + +unified_inventory.add_category_items('building', { + "default:fence_rail_aspen_wood", + "default:fence_rail_acacia_wood", + "default:fence_junglewood", + "default:fence_rail_junglewood", + "default:fence_aspen_wood", + "default:fence_pine_wood", + "default:fence_rail_wood", + "default:fence_rail_pine_wood", + "default:fence_acacia_wood", + "default:junglewood", + "default:acacia_wood", + "default:aspen_wood", + "default:fence_wood", + "default:pine_wood", + "default:silver_sandstone", + "default:desert_sandstone", + "default:sandstone_block", + "default:desert_sandstone_brick", + "default:stone_block", + "default:stonebrick", + "default:obsidian_glass", + "default:desert_sandstone_block", + "default:silver_sandstone_brick", + "default:brick", + "default:obsidianbrick", + "default:sandstonebrick", + "default:sandstone", + "default:desert_stone_block", + "default:silver_sandstone_block", + "default:wood", + "default:obsidian_block", + "default:glass", + "default:clay_brick", + "default:desert_stonebrick", + "default:desert_cobble", + "default:cobble", + "default:mossycobble", + + "doors:door_glass", + "doors:door_glass_a", + "doors:door_glass_b", + "doors:door_glass_c", + "doors:door_glass_d", + "doors:door_obsidian_glass", + "doors:door_obsidian_glass_a", + "doors:door_obsidian_glass_b", + "doors:door_obsidian_glass_c", + "doors:door_obsidian_glass_d", + "doors:door_steel", + "doors:door_steel_a", + "doors:door_steel_b", + "doors:door_steel_c", + "doors:door_steel_d", + "doors:door_wood", + "doors:door_wood_a", + "doors:door_wood_b", + "doors:door_wood_c", + "doors:door_wood_d", + "doors:gate_acacia_wood_closed", + "doors:gate_acacia_wood_open", + "doors:gate_aspen_wood_closed", + "doors:gate_aspen_wood_open", + "doors:gate_junglewood_closed", + "doors:gate_junglewood_open", + "doors:gate_pine_wood_closed", + "doors:gate_pine_wood_open", + "doors:gate_wood_closed", + "doors:gate_wood_open", + "doors:hidden", + "doors:trapdoor", + "doors:trapdoor_open", + "doors:trapdoor_steel", + "doors:trapdoor_steel_open", + + "stairs:slab_bronzeblock", + "stairs:slab_copperblock", + "stairs:slab_steelblock", + "stairs:slab_tinblock", + "stairs:stair_bronzeblock", + "stairs:stair_copperblock", + "stairs:stair_inner_bronzeblock", + "stairs:stair_inner_copperblock", + "stairs:stair_inner_steelblock", + "stairs:stair_inner_tinblock", + "stairs:stair_outer_bronzeblock", + "stairs:stair_outer_copperblock", + "stairs:stair_outer_steelblock", + "stairs:stair_outer_tinblock", + "stairs:stair_steelblock", + "stairs:stair_tinblock", + + "stairs:slab_acacia_wood", + "stairs:slab_aspen_wood", + "stairs:slab_brick", + "stairs:slab_cobble", + "stairs:slab_desert_cobble", + "stairs:slab_desert_sandstone", + "stairs:slab_desert_sandstone_block", + "stairs:slab_desert_sandstone_brick", + "stairs:slab_desert_stone", + "stairs:slab_desert_stone_block", + "stairs:slab_desert_stonebrick", + "stairs:slab_glass", + "stairs:slab_goldblock", + "stairs:slab_ice", + "stairs:slab_junglewood", + "stairs:slab_mossycobble", + "stairs:slab_obsidian", + "stairs:slab_obsidian_block", + "stairs:slab_obsidian_glass", + "stairs:slab_obsidianbrick", + "stairs:slab_pine_wood", + "stairs:slab_sandstone", + "stairs:slab_sandstone_block", + "stairs:slab_sandstonebrick", + "stairs:slab_silver_sandstone", + "stairs:slab_silver_sandstone_block", + "stairs:slab_silver_sandstone_brick", + "stairs:slab_snowblock", + "stairs:slab_stone", + "stairs:slab_stone_block", + "stairs:slab_stonebrick", + "stairs:slab_straw", + "stairs:slab_wood", + "stairs:stair_acacia_wood", + "stairs:stair_aspen_wood", + "stairs:stair_brick", + "stairs:stair_cobble", + "stairs:stair_desert_cobble", + "stairs:stair_desert_sandstone", + "stairs:stair_desert_sandstone_block", + "stairs:stair_desert_sandstone_brick", + "stairs:stair_desert_stone", + "stairs:stair_desert_stone_block", + "stairs:stair_desert_stonebrick", + "stairs:stair_glass", + "stairs:stair_goldblock", + "stairs:stair_ice", + "stairs:stair_inner_acacia_wood", + "stairs:stair_inner_aspen_wood", + "stairs:stair_inner_brick", + "stairs:stair_inner_cobble", + "stairs:stair_inner_desert_cobble", + "stairs:stair_inner_desert_sandstone", + "stairs:stair_inner_desert_sandstone_block", + "stairs:stair_inner_desert_sandstone_brick", + "stairs:stair_inner_desert_stone", + "stairs:stair_inner_desert_stone_block", + "stairs:stair_inner_desert_stonebrick", + "stairs:stair_inner_glass", + "stairs:stair_inner_goldblock", + "stairs:stair_inner_ice", + "stairs:stair_inner_junglewood", + "stairs:stair_inner_mossycobble", + "stairs:stair_inner_obsidian", + "stairs:stair_inner_obsidian_block", + "stairs:stair_inner_obsidian_glass", + "stairs:stair_inner_obsidianbrick", + "stairs:stair_inner_pine_wood", + "stairs:stair_inner_sandstone", + "stairs:stair_inner_sandstone_block", + "stairs:stair_inner_sandstonebrick", + "stairs:stair_inner_silver_sandstone", + "stairs:stair_inner_silver_sandstone_block", + "stairs:stair_inner_silver_sandstone_brick", + "stairs:stair_inner_snowblock", + "stairs:stair_inner_stone", + "stairs:stair_inner_stone_block", + "stairs:stair_inner_stonebrick", + "stairs:stair_inner_straw", + "stairs:stair_inner_wood", + "stairs:stair_junglewood", + "stairs:stair_mossycobble", + "stairs:stair_obsidian", + "stairs:stair_obsidian_block", + "stairs:stair_obsidian_glass", + "stairs:stair_obsidianbrick", + "stairs:stair_outer_acacia_wood", + "stairs:stair_outer_aspen_wood", + "stairs:stair_outer_brick", + "stairs:stair_outer_cobble", + "stairs:stair_outer_desert_cobble", + "stairs:stair_outer_desert_sandstone", + "stairs:stair_outer_desert_sandstone_block", + "stairs:stair_outer_desert_sandstone_brick", + "stairs:stair_outer_desert_stone", + "stairs:stair_outer_desert_stone_block", + "stairs:stair_outer_desert_stonebrick", + "stairs:stair_outer_glass", + "stairs:stair_outer_goldblock", + "stairs:stair_outer_ice", + "stairs:stair_outer_junglewood", + "stairs:stair_outer_mossycobble", + "stairs:stair_outer_obsidian", + "stairs:stair_outer_obsidian_block", + "stairs:stair_outer_obsidian_glass", + "stairs:stair_outer_obsidianbrick", + "stairs:stair_outer_pine_wood", + "stairs:stair_outer_sandstone", + "stairs:stair_outer_sandstone_block", + "stairs:stair_outer_sandstonebrick", + "stairs:stair_outer_silver_sandstone", + "stairs:stair_outer_silver_sandstone_block", + "stairs:stair_outer_silver_sandstone_brick", + "stairs:stair_outer_snowblock", + "stairs:stair_outer_stone", + "stairs:stair_outer_stone_block", + "stairs:stair_outer_stonebrick", + "stairs:stair_outer_straw", + "stairs:stair_outer_wood", + "stairs:stair_pine_wood", + "stairs:stair_sandstone", + "stairs:stair_sandstone_block", + "stairs:stair_sandstonebrick", + "stairs:stair_silver_sandstone", + "stairs:stair_silver_sandstone_block", + "stairs:stair_silver_sandstone_brick", + "stairs:stair_snowblock", + "stairs:stair_stone", + "stairs:stair_stone_block", + "stairs:stair_stonebrick", + "stairs:stair_straw", + "stairs:stair_wood", + + "xpanes:bar", + "xpanes:bar_flat", + "xpanes:door_steel_bar", + "xpanes:door_steel_bar_a", + "xpanes:door_steel_bar_b", + "xpanes:door_steel_bar_c", + "xpanes:door_steel_bar_d", + "xpanes:obsidian_pane", + "xpanes:obsidian_pane_flat", + "xpanes:pane", + "xpanes:pane_flat", + "xpanes:trapdoor_steel_bar", + "xpanes:trapdoor_steel_bar_open", + + "walls:cobble", + "walls:desertcobble", + "walls:mossycobble", +}) + +unified_inventory.add_category_items('environment', { + "air", + "default:cave_ice", + "default:dirt_with_rainforest_litter", + "default:gravel", + "default:dry_dirt_with_dry_grass", + "default:permafrost", + "default:desert_stone", + "default:ice", + "default:dry_dirt", + "default:obsidian", + "default:sand", + "default:river_water_source", + "default:dirt_with_snow", + "default:dirt_with_grass", + "default:water_flowing", + "default:dirt", + "default:desert_sand", + "default:permafrost_with_moss", + "default:dirt_with_coniferous_litter", + "default:water_source", + "default:dirt_with_dry_grass", + "default:river_water_flowing", + "default:stone", + "default:snow", + "default:lava_flowing", + "default:lava_source", + "default:permafrost_with_stones", + "default:dirt_with_grass_footsteps", + "default:silver_sand", + "default:snowblock", + "default:clay", + + "farming:desert_sand_soil", + "farming:desert_sand_soil_wet", + "farming:dry_soil", + "farming:dry_soil_wet", + "farming:soil", + "farming:soil_wet", +}) + +unified_inventory.add_category_items('lighting', { + "default:mese_post_light_junglewood", + "default:torch_ceiling", + "default:meselamp", + "default:torch", + "default:mese_post_light_acacia_wood", + "default:mese_post_light", + "default:torch_wall", + "default:mese_post_light_pine_wood", + "default:mese_post_light_aspen_wood" +}) +--]] + + +--[[ UNCATEGORISED + + "farming:string", + + "beds:bed_bottom", + "beds:bed_top", + "beds:fancy_bed_bottom", + "beds:fancy_bed_top", + "boats:boat", + "bones:bones", + + "bucket:bucket_lava", + "bucket:bucket_river_water", + "bucket:bucket_water", + + "butterflies:butterfly_red", + "butterflies:butterfly_violet", + "butterflies:butterfly_white", + "butterflies:hidden_butterfly_red", + "butterflies:hidden_butterfly_violet", + "butterflies:hidden_butterfly_white", + + "carts:brakerail", + "carts:cart", + "carts:powerrail", + "carts:rail", + + "default:book", + "default:book_written", + "default:bookshelf", + "default:chest", + "default:chest_locked", + "default:chest_locked_open", + "default:chest_open", + "default:clay_lump", + "default:cloud", + "default:coral_brown", + "default:coral_cyan", + "default:coral_green", + "default:coral_orange", + "default:coral_pink", + "default:coral_skeleton", + "default:flint", + "default:furnace", + "default:furnace_active", + "default:key", + "default:ladder_steel", + "default:ladder_wood", + "default:obsidian_shard", + "default:paper", + "default:sign_wall_steel", + "default:sign_wall_wood", + "default:stick", + + "fire:basic_flame", + "fire:permanent_flame", + "fireflies:firefly", + "fireflies:firefly_bottle", + "fireflies:hidden_firefly", + + "ignore", + "unknown", + + "tnt:boom", + "tnt:gunpowder", + "tnt:gunpowder_burning", + "tnt:tnt", + "tnt:tnt_burning", + "tnt:tnt_stick", + + "vessels:drinking_glass", + "vessels:glass_bottle", + "vessels:glass_fragments", + "vessels:shelf", + "vessels:steel_bottle", + + "dye:black", + "dye:blue", + "dye:brown", + "dye:cyan", + "dye:dark_green", + "dye:dark_grey", + "dye:green", + "dye:grey", + "dye:magenta", + "dye:orange", + "dye:pink", + "dye:red", + "dye:violet", + "dye:white", + "dye:yellow", + + "wool:black", + "wool:blue", + "wool:brown", + "wool:cyan", + "wool:dark_green", + "wool:dark_grey", + "wool:green", + "wool:grey", + "wool:magenta", + "wool:orange", + "wool:pink", + "wool:red", + "wool:violet", + "wool:white", + "wool:yellow", + + "unified_inventory:bag_large", + "unified_inventory:bag_medium", + "unified_inventory:bag_small", +--]] + +--[[ LIST UNCATEGORIZED AFTER LOAD +minetest.register_on_mods_loaded(function() + minetest.after(1, function ( ) + local l = {} + for name,_ in pairs(minetest.registered_items) do + if not unified_inventory.find_category(name) then + -- minetest.log("error", minetest.serialize(minetest.registered_items[name])) + table.insert(l, name) + end + end + table.sort(l) + minetest.log(table.concat(l, '",'.."\n"..'"')) + end) +end) +--]] \ No newline at end of file diff --git a/unified_inventory/doc/mod_api.txt b/unified_inventory/doc/mod_api.txt index c0be129..ef87697 100644 --- a/unified_inventory/doc/mod_api.txt +++ b/unified_inventory/doc/mod_api.txt @@ -3,6 +3,14 @@ unified_inventory API This file provides information about the API of unified_inventory. +API revisions within unified_inventory can be checked using: + + (unified_inventory.version or 1) + +**Revision history** + +* Version `1`: Classic formspec layout (no real_coordinates) +* Version `2`: Force formspec version 4 (includes real_coordinates) Misc functions -------------- @@ -12,6 +20,64 @@ Grouped by use-case, afterwards sorted alphabetically. * Checks whether creative is enabled or the player has `creative` +Callbacks +--------- + +Register a callback that will be run whenever a craft is registered via unified_inventory.register_craft: + + unified_inventory.register_on_craft_registered( + function (item_name, options) + -- item_name (string): name of the output item, equivalent to `ItemStack:get_name()` + -- options (table): definition table of crafts registered by `unified_inventory.register_craft` + end + ) + +Register a callback that will be run after all mods have loaded and after the unified_inventory mod has initialised all its internal structures: + + unified_inventory.register_on_initialized(callback) + -- The callback is passed no arguments + + +Accessing Data +-------------- + +These methods should be used instead of accessing the unified_inventory data structures directly - this will ensure your code survives any potential restructuring of the mod. + +Get a list of recipes for a particular output item: + + unified_inventory.get_recipe_list(output_item) + + Returns a list of tables, each holding a recipe definition, like: + { + { + type = "normal", + items = { "default:stick", "default:stick", "default:stick", "default:stick" }, + output = "default:wood", + width = 2 + }, + { + type = "shapeless", + items = { "default:tree" }, + output = "default:wood 4", + width = 0 + }, + ... + } + +Get a list of all the output items crafts have been registered for: + + unified_inventory.get_registered_outputs() + + Returns a list of item names, like: + { + "default:stone", + "default:chest", + "default:brick", + "doors:door_wood", + ... + } + + Pages ----- @@ -93,3 +159,72 @@ Register a non-standard craft recipe: -- ^ Same as `minetest.register_recipe` }) + +Categories +---------- + +Register a new category: + The config table (second argument) is optional, and all its members are optional + See the unified_inventory.set_category_* functions for more details on the members of the config table + + unified_inventory.register_category("category_name", { + symbol = "mod_name:item_name" or "texture.png", + label = "Human Readable Label", + index = 5, + items = { + "mod_name:item_name", + "another_mod:different_item" + } + }) + +Add / override the symbol for a category: + The category does not need to exist first + The symbol can be an item name or a texture image + If unset this will default to "default:stick" + + unified_inventory.set_category_symbol("category_name", "mod_name:item_name" or "texture.png") + +Add / override the human readable label for a category: + If unset this will default to the category name + + unified_inventory.set_category_label("category_name", "Human Readable Label") + +Add / override the sorting index of the category: + Must be a number, can also be negative (-5) or fractional (2.345) + This determines the position the category appears in the list of categories + The "all" meta-category has index -2, the "misc"/"uncategorized" meta-category has index -1, use a negative number smaller than these to make a category appear before these in the list + By default categories are sorted alphabetically with an index between 0.0101(AA) and 0.2626(ZZ) + + unified_inventory.set_category_index("category_name", 5) + +Add a single item to a category: + + unified_inventory.add_category_item("category_name", "mod_name:item_name") + +Add multiple items to a category: + + unified_inventory.add_category_items("category_name", { + "mod_name:item_name", + "another_mod:different_item" + }) + +Remove an item from a category: + + unified_inventory.remove_category_item("category_name", "mod_name:item_name") + +Remove a category entirely: + + unified_inventory.remove_category("category_name") + +Finding existing items in categories: + This will find the first category an item exists in + It should be used for checking if an item is catgorised + Returns "category_name" or nil + + unified_inventory.find_category("mod_name:item_name") + + + This will find all the categories an item exists in + Returns a number indexed table (list) of category names + + unified_inventory.find_categories("mod_name:item_name") diff --git a/unified_inventory/init.lua b/unified_inventory/init.lua index 7be101c..98ee2e5 100644 --- a/unified_inventory/init.lua +++ b/unified_inventory/init.lua @@ -1,4 +1,4 @@ --- Unified Inventory for Minetest >= 0.4.16 +-- Unified Inventory local modpath = minetest.get_modpath(minetest.get_current_modname()) local worldpath = minetest.get_worldpath() @@ -10,6 +10,8 @@ unified_inventory = { alternate = {}, current_page = {}, current_searchbox = {}, + current_category = {}, + current_category_scroll = {}, current_index = {}, current_item = {}, current_craft_direction = {}, @@ -22,6 +24,8 @@ unified_inventory = { filtered_items_list = {}, pages = {}, buttons = {}, + initialized_callbacks = {}, + craft_registered_callbacks = {}, -- Homepos stuff home_pos = {}, @@ -33,23 +37,111 @@ unified_inventory = { -- "Lite" mode lite_mode = minetest.settings:get_bool("unified_inventory_lite"), + -- Items automatically added to categories based on item definitions + automatic_categorization = (minetest.settings:get_bool("unified_inventory_automatic_categorization") ~= false), + -- Trash enabled trash_enabled = (minetest.settings:get_bool("unified_inventory_trash") ~= false), + imgscale = 1.25, + list_img_offset = 0.13, + standard_background = "background9[0,0;1,1;ui_formbg_9_sliced.png;true;16]", - pagecols = 8, - pagerows = 10, - page_y = 0, - formspec_y = 1, - main_button_x = 0, - main_button_y = 9, - craft_result_x = 0.3, - craft_result_y = 0.5, - form_header_y = 0, - standard_background = "background[-0.2,-0.2;1,1;ui_form_bg.png;true]", -- the 'true' scales to fill, overrides the 1,1 - standard_inv = "list[current_player;main;0,YYY;8,4;]", -- the YYY's are placeholders which get - standard_inv_bg = "image[-0.1,YYY;10.05,4.70;ui_main_inventory.png]", -- replaced later by string.gsub() + version = 3 } +local ui = unified_inventory + +-- These tables establish position and layout for the two UI styles. +-- UI doesn't use formspec_[xy] anymore, but other mods may need them. + +ui.style_full = { + formspec_x = 1, + formspec_y = 1, + formw = 17.75, + formh = 12.25, + pagecols = 8, + pagerows = 9, + page_x = 10.75, + page_y = 2.30, + craft_x = 2.8, + craft_y = 1.15, + craftresult_x = 7.8, + craft_arrow_x = 6.55, + craft_guide_x = 3.3, + craft_guide_y = 1.15, + craft_guide_arrow_x = 7.05, + craft_guide_result_x = 8.3, + craft_guide_resultstr_x = 0.3, + craft_guide_resultstr_y = 0.6, + give_btn_x = 0.25, + main_button_x = 0.4, + main_button_y = 11.0, + page_buttons_x = 11.60, + page_buttons_y = 10.15, + searchwidth = 3.4, + form_header_x = 0.4, + form_header_y = 0.4, + btn_spc = 0.85, + btn_size = 0.75, + std_inv_x = 0.3, + std_inv_y = 5.75, +} + +ui.style_lite = { + formspec_x = 0.6, + formspec_y = 0.6, + formw = 14, + formh = 9.75, + pagecols = 4, + pagerows = 5, + page_x = 10.5, + page_y = 2.15, + craft_x = 2.6, + craft_y = 0.75, + craftresult_x = 5.75, + craft_arrow_x = 6.35, + craft_guide_x = 3.1, + craft_guide_y = 0.75, + craft_guide_arrow_x = 7.05, + craft_guide_result_x = 8.3, + craft_guide_resultstr_x = 0.15, + craft_guide_resultstr_y = 0.35, + give_btn_x = 0.15, + main_button_x = 10.5, + main_button_y = 8.15, + page_buttons_x = 10.5, + page_buttons_y = 6.15, + searchwidth = 1.6, + form_header_x = 0.2, + form_header_y = 0.2, + btn_spc = 0.8, + btn_size = 0.7, + std_inv_x = 0.1, + std_inv_y = 4.6, +} + +dofile(modpath.."/api.lua") + +for _, style in ipairs({ui.style_full, ui.style_lite}) do + style.items_per_page = style.pagecols * style.pagerows + style.standard_inv = string.format("list[current_player;main;%f,%f;8,4;]", + style.std_inv_x + ui.list_img_offset, style.std_inv_y + ui.list_img_offset) + + style.standard_inv_bg = ui.make_inv_img_grid(style.std_inv_x, style.std_inv_y, 8, 1, true).. + ui.make_inv_img_grid(style.std_inv_x, style.std_inv_y + ui.imgscale, 8, 3) + + style.craft_grid = table.concat({ + ui.make_inv_img_grid(style.craft_x, style.craft_y, 3, 3), + ui.single_slot(style.craft_x + ui.imgscale*4, style.craft_y), -- the craft result slot + string.format("image[%f,%f;%f,%f;ui_crafting_arrow.png]", + style.craft_arrow_x, style.craft_y, ui.imgscale, ui.imgscale), + string.format("list[current_player;craft;%f,%f;3,3;]", + style.craft_x + ui.list_img_offset, style.craft_y + ui.list_img_offset), + string.format("list[current_player;craftpreview;%f,%f;1,1;]", + style.craftresult_x + ui.list_img_offset, style.craft_y + ui.list_img_offset) + }) +end + -- Disable default creative inventory local creative = rawget(_G, "creative") or rawget(_G, "creative_inventory") if creative then @@ -65,7 +157,8 @@ if sfinv then end dofile(modpath.."/group.lua") -dofile(modpath.."/api.lua") +dofile(modpath.."/category.lua") +dofile(modpath.."/default-categories.lua") dofile(modpath.."/internal.lua") dofile(modpath.."/callbacks.lua") dofile(modpath.."/match_craft.lua") @@ -76,7 +169,4 @@ if minetest.settings:get_bool("unified_inventory_bags") ~= false then end dofile(modpath.."/item_names.lua") - -if minetest.get_modpath("datastorage") then - dofile(modpath.."/waypoints.lua") -end +dofile(modpath.."/waypoints.lua") diff --git a/unified_inventory/internal.lua b/unified_inventory/internal.lua index 78cba2a..b49906e 100644 --- a/unified_inventory/internal.lua +++ b/unified_inventory/internal.lua @@ -1,5 +1,6 @@ local S = minetest.get_translator("unified_inventory") local F = minetest.formspec_escape +local ui = unified_inventory -- This pair of encoding functions is used where variable text must go in -- button names, where the text might contain formspec metacharacters. @@ -9,269 +10,310 @@ local F = minetest.formspec_escape -- This is a game engine bug, and in the anticipation that it might be -- fixed some day we don't want to rely on it. So for safety we apply -- an encoding that avoids all formspec metacharacters. -function unified_inventory.mangle_for_formspec(str) + +function ui.mangle_for_formspec(str) return string.gsub(str, "([^A-Za-z0-9])", function (c) return string.format("_%d_", string.byte(c)) end) end -function unified_inventory.demangle_for_formspec(str) +function ui.demangle_for_formspec(str) return string.gsub(str, "_([0-9]+)_", function (v) return string.char(v) end) end -function unified_inventory.get_per_player_formspec(player_name) - local lite = unified_inventory.lite_mode and not minetest.check_player_privs(player_name, {ui_full=true}) - local ui = {} - ui.pagecols = unified_inventory.pagecols - ui.pagerows = unified_inventory.pagerows - ui.page_y = unified_inventory.page_y - ui.formspec_y = unified_inventory.formspec_y - ui.main_button_x = unified_inventory.main_button_x - ui.main_button_y = unified_inventory.main_button_y - ui.craft_result_x = unified_inventory.craft_result_x - ui.craft_result_y = unified_inventory.craft_result_y - ui.form_header_y = unified_inventory.form_header_y +function ui.get_per_player_formspec(player_name) + local draw_lite_mode = ui.lite_mode and not minetest.check_player_privs(player_name, {ui_full=true}) - if lite then - ui.pagecols = 4 - ui.pagerows = 6 - ui.page_y = 0.25 - ui.formspec_y = 0.47 - ui.main_button_x = 8.2 - ui.main_button_y = 6.5 - ui.craft_result_x = 2.8 - ui.craft_result_y = 3.4 - ui.form_header_y = -0.1 - end - - ui.items_per_page = ui.pagecols * ui.pagerows - return ui, lite + local style = table.copy(draw_lite_mode and ui.style_lite or ui.style_full) + style.is_lite_mode = draw_lite_mode + return style end -function unified_inventory.get_formspec(player, page) +local function formspec_button(ui_peruser, name, image, offset, pos, scale, label) + local element = 'image_button' + if minetest.registered_items[image] then + element = 'item_image_button' + elseif image:find(":", 1, true) then + image = "unknown_item.png" + end + local spc = (1-scale)*ui_peruser.btn_size/2 + local size = ui_peruser.btn_size*scale + return string.format("%s[%f,%f;%f,%f;%s;%s;]", element, + (offset.x or offset[1]) + ( ui_peruser.btn_spc * (pos.x or pos[1]) ) + spc, + (offset.y or offset[2]) + ( ui_peruser.btn_spc * (pos.y or pos[2]) ) + spc, + size, size, image, name) .. + string.format("tooltip[%s;%s]", name, F(label or name)) +end + +local function formspec_add_filters(player, formspec, style) + local button_row = 0 + local button_col = 0 + local n = #formspec + 1 + + -- Main buttons + + local filtered_inv_buttons = {} + + for i, def in pairs(ui.buttons) do + if not (style.is_lite_mode and def.hide_lite) then + table.insert(filtered_inv_buttons, def) + end + end + + for i, def in pairs(filtered_inv_buttons) do + if style.is_lite_mode and i > 4 then + button_row = 1 + button_col = 1 + end + + if def.type == "image" then + local pos_x = style.main_button_x + style.btn_spc * (i - 1) - button_col * style.btn_spc * 4 + local pos_y = style.main_button_y + button_row * style.btn_spc + if (def.condition == nil or def.condition(player) == true) then + formspec[n] = string.format("image_button[%f,%f;%f,%f;%s;%s;]", + pos_x, pos_y, style.btn_size, style.btn_size, + F(def.image), + F(def.name)) + formspec[n+1] = "tooltip["..F(def.name)..";"..(def.tooltip or "").."]" + n = n+2 + else + formspec[n] = string.format("image[%f,%f;%f,%f;%s^[colorize:#808080:alpha]", + pos_x, pos_y, style.btn_size, style.btn_size, + def.image) + n = n+1 + end + end + end +end + +local function formspec_add_categories(player, formspec, ui_peruser) + local player_name = player:get_player_name() + local n = #formspec + 1 + + local categories_pos = { + ui_peruser.page_x, + ui_peruser.page_y-ui_peruser.btn_spc-0.5 + } + local categories_scroll_pos = { + ui_peruser.page_x, + ui_peruser.form_header_y - (ui_peruser.is_lite_mode and 0 or 0.2) + } + + formspec[n] = string.format("background9[%f,%f;%f,%f;%s;false;3]", + ui_peruser.page_x-0.1, categories_scroll_pos[2], + (ui_peruser.btn_spc * ui_peruser.pagecols) + 0.13, 1.4 + (ui_peruser.is_lite_mode and 0 or 0.2), + "ui_smallbg_9_sliced.png") + n = n + 1 + + formspec[n] = string.format("label[%f,%f;%s]", + ui_peruser.page_x, + ui_peruser.form_header_y + (ui_peruser.is_lite_mode and 0.3 or 0.2), F(S("Category:"))) + n = n + 1 + + local scroll_offset = 0 + local category_count = #ui.category_list + if category_count > ui_peruser.pagecols then + scroll_offset = ui.current_category_scroll[player_name] + end + + for index, category in ipairs(ui.category_list) do + local column = index - scroll_offset + if column > 0 and column <= ui_peruser.pagecols then + local scale = 0.8 + if ui.current_category[player_name] == category.name then + scale = 1 + end + formspec[n] = formspec_button(ui_peruser, "category_"..category.name, category.symbol, categories_pos, {column-1, 0}, scale, category.label) + n = n + 1 + end + end + if category_count > ui_peruser.pagecols and scroll_offset > 0 then + -- prev + formspec[n] = formspec_button(ui_peruser, "prev_category", "ui_left_icon.png", categories_scroll_pos, {ui_peruser.pagecols - 2, 0}, 0.8, S("Scroll categories left")) + n = n + 1 + end + if category_count > ui_peruser.pagecols and category_count - scroll_offset > ui_peruser.pagecols then + -- next + formspec[n] = formspec_button(ui_peruser, "next_category", "ui_right_icon.png", categories_scroll_pos, {ui_peruser.pagecols - 1, 0}, 0.8, S("Scroll categories right")) + end +end + +local function formspec_add_search_box(player, formspec, ui_peruser) + local player_name = player:get_player_name() + local n = #formspec + 1 + + formspec[n] = "field_close_on_enter[searchbox;false]" + + formspec[n+1] = string.format("field[%f,%f;%f,%f;searchbox;;%s]", + ui_peruser.page_buttons_x, ui_peruser.page_buttons_y, + ui_peruser.searchwidth - 0.1, ui_peruser.btn_size, + F(ui.current_searchbox[player_name])) + formspec[n+2] = string.format("image_button[%f,%f;%f,%f;ui_search_icon.png;searchbutton;]", + ui_peruser.page_buttons_x + ui_peruser.searchwidth, ui_peruser.page_buttons_y, + ui_peruser.btn_size,ui_peruser.btn_size) + formspec[n+3] = "tooltip[searchbutton;" ..F(S("Search")) .. "]" + formspec[n+4] = string.format("image_button[%f,%f;%f,%f;ui_reset_icon.png;searchresetbutton;]", + ui_peruser.page_buttons_x + ui_peruser.searchwidth + ui_peruser.btn_spc, + ui_peruser.page_buttons_y, + ui_peruser.btn_size, ui_peruser.btn_size) + formspec[n+5] = "tooltip[searchresetbutton;"..F(S("Reset search and display everything")).."]" + + if ui.activefilter[player_name] ~= "" then + formspec[n+6] = string.format("label[%f,%f;%s: %s]", + ui_peruser.page_x, ui_peruser.page_y - 0.25, + F(S("Filter")), F(ui.activefilter[player_name])) + end +end + +local function formspec_add_item_browser(player, formspec, ui_peruser) + local player_name = player:get_player_name() + local n = #formspec + 1 + + -- Controls to flip items pages + + local btnlist = { + { "ui_skip_backward_icon.png", "start_list", S("First page") }, + { "ui_doubleleft_icon.png", "rewind3", S("Back three pages") }, + { "ui_left_icon.png", "rewind1", S("Back one page") }, + { "ui_right_icon.png", "forward1", S("Forward one page") }, + { "ui_doubleright_icon.png", "forward3", S("Forward three pages") }, + { "ui_skip_forward_icon.png", "end_list", S("Last page") }, + } + + if ui_peruser.is_lite_mode then + btnlist[2] = nil + btnlist[5] = nil + end + + local bn = 0 + for _, b in pairs(btnlist) do + formspec[n] = string.format("image_button[%f,%f;%f,%f;%s;%s;]", + ui_peruser.page_buttons_x + ui_peruser.btn_spc*bn, + ui_peruser.page_buttons_y + ui_peruser.btn_spc, + ui_peruser.btn_size, ui_peruser.btn_size, + b[1],b[2]) + formspec[n+1] = "tooltip["..b[2]..";"..F(b[3]).."]" + bn = bn + 1 + n = n + 2 + end + + -- Items list + if #ui.filtered_items_list[player_name] == 0 then + local no_matches = S("No matching items") + if ui_peruser.is_lite_mode then + no_matches = S("No matches.") + end + + formspec[n] = "label["..ui_peruser.page_x..","..(ui_peruser.page_y+0.15)..";" .. F(no_matches) .. "]" + return + end + + local dir = ui.active_search_direction[player_name] + local list_index = ui.current_index[player_name] + local page2 = math.floor(list_index / (ui_peruser.items_per_page) + 1) + local pagemax = math.floor( + (#ui.filtered_items_list[player_name] - 1) + / (ui_peruser.items_per_page) + 1) + for y = 0, ui_peruser.pagerows - 1 do + for x = 0, ui_peruser.pagecols - 1 do + local name = ui.filtered_items_list[player_name][list_index] + local item = minetest.registered_items[name] + if item then + -- Clicked on current item: Flip crafting direction + if name == ui.current_item[player_name] then + local cdir = ui.current_craft_direction[player_name] + if cdir == "recipe" then + dir = "usage" + elseif cdir == "usage" then + dir = "recipe" + end + else + -- Default: use active search direction by default + dir = ui.active_search_direction[player_name] + end + + local button_name = "item_button_" .. dir .. "_" + .. ui.mangle_for_formspec(name) + formspec[n] = ("item_image_button[%f,%f;%f,%f;%s;%s;]"):format( + ui_peruser.page_x + x * ui_peruser.btn_spc, + ui_peruser.page_y + y * ui_peruser.btn_spc, + ui_peruser.btn_size, ui_peruser.btn_size, + name, button_name + ) + formspec[n + 1] = ("tooltip[%s;%s]"):format( + button_name, minetest.formspec_escape(item.description) + ) + n = n + 2 + list_index = list_index + 1 + end + end + end + formspec[n] = string.format("label[%f,%f;%s: %s]", + ui_peruser.page_buttons_x + ui_peruser.btn_spc * (ui_peruser.is_lite_mode and 1 or 2), + ui_peruser.page_buttons_y + 0.1 + ui_peruser.btn_spc * 2, + F(S("Page")), S("@1 of @2",page2,pagemax)) +end + +function ui.get_formspec(player, page) if not player then return "" end local player_name = player:get_player_name() - local ui_peruser,draw_lite_mode = unified_inventory.get_per_player_formspec(player_name) + local ui_peruser = ui.get_per_player_formspec(player_name) - unified_inventory.current_page[player_name] = page - local pagedef = unified_inventory.pages[page] + ui.current_page[player_name] = page + local pagedef = ui.pages[page] if not pagedef then return "" -- Invalid page name end - local formspec = { - "size[14,10]", + local fs = { + "formspec_version[4]", + "size["..ui_peruser.formw..","..ui_peruser.formh.."]", pagedef.formspec_prepend and "" or "no_prepend[]", - unified_inventory.standard_background -- Background + ui.standard_background } - local n = 4 - if draw_lite_mode then - formspec[1] = "size[11,7.7]" - formspec[3] = unified_inventory.standard_background - end - - if unified_inventory.is_creative(player_name) - and page == "craft" then - formspec[n] = "background[0,"..(ui_peruser.formspec_y + 2)..";1,1;ui_single_slot.png]" - n = n+1 - end - - local perplayer_formspec = unified_inventory.get_per_player_formspec(player_name) + local perplayer_formspec = ui.get_per_player_formspec(player_name) local fsdata = pagedef.get_formspec(player, perplayer_formspec) - formspec[n] = fsdata.formspec - n = n+1 + fs[#fs + 1] = fsdata.formspec - local button_row = 0 - local button_col = 0 - - -- Main buttons - - local filtered_inv_buttons = {} - - for i, def in pairs(unified_inventory.buttons) do - if not (draw_lite_mode and def.hide_lite) then - table.insert(filtered_inv_buttons, def) - end - end - - for i, def in pairs(filtered_inv_buttons) do - - if draw_lite_mode and i > 4 then - button_row = 1 - button_col = 1 - end - - if def.type == "image" then - if (def.condition == nil or def.condition(player) == true) then - formspec[n] = "image_button[" - formspec[n+1] = ( ui_peruser.main_button_x + 0.65 * (i - 1) - button_col * 0.65 * 4) - formspec[n+2] = ","..(ui_peruser.main_button_y + button_row * 0.7)..";0.8,0.8;" - formspec[n+3] = F(def.image)..";" - formspec[n+4] = F(def.name)..";]" - formspec[n+5] = "tooltip["..F(def.name) - formspec[n+6] = ";"..(def.tooltip or "").."]" - n = n+7 - else - formspec[n] = "image[" - formspec[n+1] = ( ui_peruser.main_button_x + 0.65 * (i - 1) - button_col * 0.65 * 4) - formspec[n+2] = ","..(ui_peruser.main_button_y + button_row * 0.7)..";0.8,0.8;" - formspec[n+3] = F(def.image).."^[colorize:#808080:alpha]" - n = n+4 - - end - end - end + formspec_add_filters(player, fs, ui_peruser) if fsdata.draw_inventory ~= false then -- Player inventory - formspec[n] = "listcolors[#00000000;#00000000]" - formspec[n+1] = string.gsub(unified_inventory.standard_inv, "YYY", ui_peruser.formspec_y + 3.5) - n = n+2 + fs[#fs + 1] = "listcolors[#00000000;#00000000]" + fs[#fs + 1] = ui_peruser.standard_inv end if fsdata.draw_item_list == false then - return table.concat(formspec, "") + return table.concat(fs, "") end - -- Controls to flip items pages - local start_x = 9.2 + formspec_add_categories(player, fs, ui_peruser) + formspec_add_search_box(player, fs, ui_peruser) + formspec_add_item_browser(player, fs, ui_peruser) - if not draw_lite_mode then - formspec[n] = - "image_button[" .. (start_x + 0.6 * 0) - .. ",9;.8,.8;ui_skip_backward_icon.png;start_list;]" - .. "tooltip[start_list;" .. F(S("First page")) .. "]" - - .. "image_button[" .. (start_x + 0.6 * 1) - .. ",9;.8,.8;ui_doubleleft_icon.png;rewind3;]" - .. "tooltip[rewind3;" .. F(S("Back three pages")) .. "]" - .. "image_button[" .. (start_x + 0.6 * 2) - .. ",9;.8,.8;ui_left_icon.png;rewind1;]" - .. "tooltip[rewind1;" .. F(S("Back one page")) .. "]" - - .. "image_button[" .. (start_x + 0.6 * 3) - .. ",9;.8,.8;ui_right_icon.png;forward1;]" - .. "tooltip[forward1;" .. F(S("Forward one page")) .. "]" - .. "image_button[" .. (start_x + 0.6 * 4) - .. ",9;.8,.8;ui_doubleright_icon.png;forward3;]" - .. "tooltip[forward3;" .. F(S("Forward three pages")) .. "]" - - .. "image_button[" .. (start_x + 0.6 * 5) - .. ",9;.8,.8;ui_skip_forward_icon.png;end_list;]" - .. "tooltip[end_list;" .. F(S("Last page")) .. "]" - else - formspec[n] = - "image_button[" .. (8.2 + 0.65 * 0) - .. ",5.8;.8,.8;ui_skip_backward_icon.png;start_list;]" - .. "tooltip[start_list;" .. F(S("First page")) .. "]" - .. "image_button[" .. (8.2 + 0.65 * 1) - .. ",5.8;.8,.8;ui_left_icon.png;rewind1;]" - .. "tooltip[rewind1;" .. F(S("Back one page")) .. "]" - .. "image_button[" .. (8.2 + 0.65 * 2) - .. ",5.8;.8,.8;ui_right_icon.png;forward1;]" - .. "tooltip[forward1;" .. F(S("Forward one page")) .. "]" - .. "image_button[" .. (8.2 + 0.65 * 3) - .. ",5.8;.8,.8;ui_skip_forward_icon.png;end_list;]" - .. "tooltip[end_list;" .. F(S("Last page")) .. "]" - end - n = n+1 - - -- Search box - formspec[n] = "field_close_on_enter[searchbox;false]" - n = n+1 - - if not draw_lite_mode then - formspec[n] = "field[9.5,8.325;3,1;searchbox;;" - .. F(unified_inventory.current_searchbox[player_name]) .. "]" - formspec[n+1] = "image_button[12.2,8.1;.8,.8;ui_search_icon.png;searchbutton;]" - .. "tooltip[searchbutton;" ..F(S("Search")) .. "]" - formspec[n+2] = "image_button[12.9,8.1;.8,.8;ui_reset_icon.png;searchresetbutton;]" - .. "tooltip[searchbutton;" ..F(S("Search")) .. "]" - .. "tooltip[searchresetbutton;" ..F(S("Reset search and display everything")) .. "]" - else - formspec[n] = "field[8.5,5.225;2.2,1;searchbox;;" - .. F(unified_inventory.current_searchbox[player_name]) .. "]" - formspec[n+1] = "image_button[10.3,5;.8,.8;ui_search_icon.png;searchbutton;]" - .. "tooltip[searchbutton;" ..F(S("Search")) .. "]" - formspec[n+2] = "image_button[11,5;.8,.8;ui_reset_icon.png;searchresetbutton;]" - .. "tooltip[searchbutton;" ..F(S("Search")) .. "]" - .. "tooltip[searchresetbutton;" ..F(S("Reset search and display everything")) .. "]" - end - n = n+3 - - local no_matches = S("No matching items") - if draw_lite_mode then - no_matches = S("No matches.") - end - - -- Items list - if #unified_inventory.filtered_items_list[player_name] == 0 then - formspec[n] = "label[8.2,"..ui_peruser.form_header_y..";" .. F(no_matches) .. "]" - else - local dir = unified_inventory.active_search_direction[player_name] - local list_index = unified_inventory.current_index[player_name] - local page2 = math.floor(list_index / (ui_peruser.items_per_page) + 1) - local pagemax = math.floor( - (#unified_inventory.filtered_items_list[player_name] - 1) - / (ui_peruser.items_per_page) + 1) - for y = 0, ui_peruser.pagerows - 1 do - for x = 0, ui_peruser.pagecols - 1 do - local name = unified_inventory.filtered_items_list[player_name][list_index] - local item = minetest.registered_items[name] - if item then - -- Clicked on current item: Flip crafting direction - if name == unified_inventory.current_item[player_name] then - local cdir = unified_inventory.current_craft_direction[player_name] - if cdir == "recipe" then - dir = "usage" - elseif cdir == "usage" then - dir = "recipe" - end - else - -- Default: use active search direction by default - dir = unified_inventory.active_search_direction[player_name] - end - - local button_name = "item_button_" .. dir .. "_" - .. unified_inventory.mangle_for_formspec(name) - formspec[n] = ("item_image_button[%f,%f;.81,.81;%s;%s;]"):format( - 8.2 + x * 0.7, ui_peruser.formspec_y + ui_peruser.page_y + y * 0.7, - name, button_name - ) - formspec[n + 1] = ("tooltip[%s;%s \\[%s\\]]"):format( - button_name, minetest.formspec_escape(item.description), - item.mod_origin or "??" - ) - n = n + 2 - list_index = list_index + 1 - end - end - end - formspec[n] = "label[8.2,"..ui_peruser.form_header_y..";"..F(S("Page")) .. ": " - .. S("@1 of @2",page2,pagemax).."]" - end - n= n+1 - - if unified_inventory.activefilter[player_name] ~= "" then - formspec[n] = "label[8.2,"..(ui_peruser.form_header_y + 0.4)..";" .. F(S("Filter")) .. ":]" - formspec[n+1] = "label[9.1,"..(ui_peruser.form_header_y + 0.4)..";"..F(unified_inventory.activefilter[player_name]).."]" - end - return table.concat(formspec, "") + return table.concat(fs) end -function unified_inventory.set_inventory_formspec(player, page) +function ui.set_inventory_formspec(player, page) if player then - player:set_inventory_formspec(unified_inventory.get_formspec(player, page)) + player:set_inventory_formspec(ui.get_formspec(player, page)) end end +local function valid_def(def) + return (not def.groups.not_in_creative_inventory + or def.groups.not_in_creative_inventory == 0) + and def.description + and def.description ~= "" +end + --apply filter to the inventory list (create filtered copy of full one) -function unified_inventory.apply_filter(player, filter, search_dir) +function ui.apply_filter(player, filter, search_dir) if not player then return false end @@ -290,7 +332,9 @@ function unified_inventory.apply_filter(player, filter, search_dir) return true end else - local lang = minetest.get_player_information(player_name).lang_code + local player_info = minetest.get_player_information(player_name) + local lang = player_info and player_info.lang_code or "" + ffilter = function(name, def) local lname = string.lower(name) local ldesc = string.lower(def.description) @@ -300,78 +344,37 @@ function unified_inventory.apply_filter(player, filter, search_dir) or llocaldesc and string.find(llocaldesc, lfilter, 1, true) end end - unified_inventory.filtered_items_list[player_name]={} - for name, def in pairs(minetest.registered_items) do - if (not def.groups.not_in_creative_inventory - or def.groups.not_in_creative_inventory == 0) - and def.description - and def.description ~= "" - and ffilter(name, def) then - table.insert(unified_inventory.filtered_items_list[player_name], name) + ui.filtered_items_list[player_name]={} + local category = ui.current_category[player_name] or 'all' + if category == 'all' then + for name, def in pairs(minetest.registered_items) do + if valid_def(def) + and ffilter(name, def) then + table.insert(ui.filtered_items_list[player_name], name) + end end - end - table.sort(unified_inventory.filtered_items_list[player_name]) - unified_inventory.filtered_items_list_size[player_name] = #unified_inventory.filtered_items_list[player_name] - unified_inventory.current_index[player_name] = 1 - unified_inventory.activefilter[player_name] = filter - unified_inventory.active_search_direction[player_name] = search_dir - unified_inventory.set_inventory_formspec(player, - unified_inventory.current_page[player_name]) -end - -function unified_inventory.items_in_group(groups) - local items = {} - for name, item in pairs(minetest.registered_items) do - for _, group in pairs(groups:split(',')) do - if item.groups[group] then - table.insert(items, name) + elseif category == 'uncategorized' then + for name, def in pairs(minetest.registered_items) do + if (not ui.find_category(name)) + and valid_def(def) + and ffilter(name, def) then + table.insert(ui.filtered_items_list[player_name], name) + end + end + else + for name,exists in pairs(ui.registered_category_items[category]) do + local def = minetest.registered_items[name] + if exists and def + and valid_def(def) + and ffilter(name, def) then + table.insert(ui.filtered_items_list[player_name], name) end end end - return items -end - -function unified_inventory.sort_inventory(inv) - local inlist = inv:get_list("main") - local typecnt = {} - local typekeys = {} - for _, st in ipairs(inlist) do - if not st:is_empty() then - local n = st:get_name() - local w = st:get_wear() - local m = st:get_metadata() - local k = string.format("%s %05d %s", n, w, m) - if not typecnt[k] then - typecnt[k] = { - name = n, - wear = w, - metadata = m, - stack_max = st:get_stack_max(), - count = 0, - } - table.insert(typekeys, k) - end - typecnt[k].count = typecnt[k].count + st:get_count() - end - end - table.sort(typekeys) - local outlist = {} - for _, k in ipairs(typekeys) do - local tc = typecnt[k] - while tc.count > 0 do - local c = math.min(tc.count, tc.stack_max) - table.insert(outlist, ItemStack({ - name = tc.name, - wear = tc.wear, - metadata = tc.metadata, - count = c, - })) - tc.count = tc.count - c - end - end - if #outlist > #inlist then return end - while #outlist < #inlist do - table.insert(outlist, ItemStack(nil)) - end - inv:set_list("main", outlist) + table.sort(ui.filtered_items_list[player_name]) + ui.filtered_items_list_size[player_name] = #ui.filtered_items_list[player_name] + ui.current_index[player_name] = 1 + ui.activefilter[player_name] = filter + ui.active_search_direction[player_name] = search_dir + ui.set_inventory_formspec(player, ui.current_page[player_name]) end diff --git a/unified_inventory/locale/unified_inventory.template.tr b/unified_inventory/locale/template.txt similarity index 73% rename from unified_inventory/locale/unified_inventory.template.tr rename to unified_inventory/locale/template.txt index 2ea4fca..fd931d8 100644 --- a/unified_inventory/locale/unified_inventory.template.tr +++ b/unified_inventory/locale/template.txt @@ -1,54 +1,52 @@ # textdomain: unified_inventory - -# waypoints.lua - -White= -Yellow= -Red= -Green= -Blue= -Waypoints= -Select Waypoint #@1= -Waypoint @1= -Set waypoint to current location= -Make waypoint @1= -invisible= -visible= -@1 display of waypoint coordinates= -Disable= -Enable= -Change color of waypoint display= -Edit waypoint name= -Waypoint active= -Waypoint inactive= -Finish editing= -World position= -Name= -HUD text color= - -# group.lua - +Mixing= +Cooking= +Digging= +Bags= +Bag @1= +Small Bag= +Medium Bag= +Large Bag= +All Items= +Misc. Items= +Plant Life= +Building Materials= +Tools= +Minerals and Metals= +Environment and Worldgen= +Lighting= and = - -# register.lua - +Scroll categories left= +Scroll categories right= +Search= +Reset search and display everything= +First page= +Back three pages= +Back one page= +Forward one page= +Forward three pages= +Last page= +No matching items= +No matches.= +Page= +@1 of @2= +Filter= Can use the creative inventory= Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally= Crafting Grid= Crafting Guide= Set home position= Home position set to: @1= -You don't have the \"home\" privilege!= +You don't have the "home" privilege!= Go home= Set time to day= -Set time to night= Time of day set to 6am= -Time of day set to 9pm= You don't have the settime privilege!= +Set time to night= +Time of day set to 9pm= Clear inventory= +This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.= Inventory cleared!= -This button has been disabled outside= -Crafting= Trash:= Refill:= Any item belonging to the @1 group= @@ -65,36 +63,28 @@ Show previous recipe= Show previous usage= @1 (@2)= Give me:= -This recipe is too@nlarge to be displayed.= +This recipe is too@@large to be displayed.= To craft grid:= All= - -# api.lua - -Mixing= -Cooking= -Digging= - -# internal.lua - -First page= -Back three pages= -Back one page= -Forward one page= -Forward three pages= -Last page= -Search= -Reset search and display everything= -No matching items= -No matches.= -Page= -@1 of @2= -Filter= - -# bags.lua - -Bags= -Bag @1= -Small Bag= -Medium Bag= -Large Bag= +Crafting= +White= +Yellow= +Red= +Green= +Blue= +Waypoints= +Select Waypoint #@1= +Waypoint @1= +Set waypoint to current location= +Hide waypoint= +Show waypoint= +Hide coordinates= +Show coordinates= +Change color of waypoint display= +Edit waypoint name= +Waypoint active= +Waypoint inactive= +Finish editing= +World position= +Name= +HUD text color= diff --git a/unified_inventory/locale/unified_inventory.de.tr b/unified_inventory/locale/unified_inventory.de.tr index e2a05be..474049c 100644 --- a/unified_inventory/locale/unified_inventory.de.tr +++ b/unified_inventory/locale/unified_inventory.de.tr @@ -1,5 +1,4 @@ # textdomain: unified_inventory -Crafting=Fertigung Mixing=Mischen Cooking=Kochen Digging=Graben @@ -8,21 +7,32 @@ Bag @1=Tasche @1 Small Bag=Kleine Tasche Medium Bag=Mittelgroße Tasche Large Bag=Große Tasche +All Items= +Misc. Items= +Plant Life= +Building Materials= +Tools= +Minerals and Metals= +Environment and Worldgen= +Lighting= and = und +Scroll categories left= +Scroll categories right= +Search=Suchen +Reset search and display everything=Suche zurücksetzen und alles anzeigen First page=Erste Seite Back three pages=3 Seiten zurückblättern Back one page=1 Seite zurückblättern Forward one page=1 Seite vorblättern Forward three pages=3 Seiten vorblättern Last page=Letzte Seite -Search=Suchen -Reset search and display everything=Suche zurücksetzen und alles anzeigen No matching items=Keine passenden Gegenstände No matches.=Keine Treffer Page=Seite @1 of @2=@1 von @2 Filter=Filter Can use the creative inventory=Kann das Kreativinventar nutzen +Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally=Zwingt Unified Inventory, im Vollmodus angezeigt zu werden, wenn der Minimalmodus global eingestellt ist Crafting Grid=Fertigungsraster Crafting Guide=Fertigungsführer Set home position=Heimatposition setzen @@ -35,6 +45,7 @@ You don't have the settime privilege!=Du hast das „settime“-Privileg nicht! Set time to night=Zur Nachtzeit wechseln Time of day set to 9pm=Tageszeit auf 21 Uhr gesetzt Clear inventory=Inventar leeren +This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.= Inventory cleared!=Inventar geleert! Trash:=Müll: Refill:=Nachfüllen: @@ -50,9 +61,12 @@ Show next recipe=Nächstes Rezept zeigen Show next usage=Nächste Verwendung zeigen Show previous recipe=Vorheriges Rezept zeigen Show previous usage=Vorherige Verwendung zeigen +@1 (@2)= Give me:=Gib mir: +This recipe is too@@large to be displayed.= To craft grid:=Ins Fertigungsraster: All=Alles +Crafting=Fertigung White=Weiß Yellow=Gelb Red=Rot @@ -62,12 +76,10 @@ Waypoints=Wegpunkte Select Waypoint #@1=Wegpunkt Nr. @1 auswählen Waypoint @1=Wegpunkt Nr. @1 Set waypoint to current location=Setze Wegpunkt zur derzeitigen Position -invisible=unsichtbar -visible=sichtbar -Make waypoint @1=Wegpunkt @1 machen -Disable=ausschalten -Enable=einschalten -@1 display of waypoint coordinates=Anzeige der Wegpunktkoordinaten @1 +Hide waypoint= +Show waypoint= +Hide coordinates= +Show coordinates= Change color of waypoint display=Farbe der Darstellung der Wegpunkte ändern Edit waypoint name=Name des Wegpunkts ändern Waypoint active=Wegpunkt aktiv @@ -76,4 +88,13 @@ Finish editing=Bearbeitung abschließen World position=Weltposition Name=Name HUD text color=HUD-Textfarbe -Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally=Zwingt Unified Inventory, im Vollmodus angezeigt zu werden, wenn der Minimalmodus global eingestellt ist + + +##### not used anymore ##### + +invisible=unsichtbar +visible=sichtbar +Make waypoint @1=Wegpunkt @1 machen +Disable=ausschalten +Enable=einschalten +@1 display of waypoint coordinates=Anzeige der Wegpunktkoordinaten @1 diff --git a/unified_inventory/locale/unified_inventory.es.tr b/unified_inventory/locale/unified_inventory.es.tr index 18b6c77..85a794e 100644 --- a/unified_inventory/locale/unified_inventory.es.tr +++ b/unified_inventory/locale/unified_inventory.es.tr @@ -1,54 +1,57 @@ # textdomain: unified_inventory - -# waypoints.lua - -White=Blanco -Yellow=Amarillo -Red=Rojo -Green=Verde -Blue=Azul -Waypoints=Puntos -Select Waypoint #@1=Seleccionar Punto #@1 -Waypoint @1=Punto @1 -Set waypoint to current location=Establecer el punto a la ubicación actual -Make waypoint @1=Hacer punto @1 -invisible=invisible -visible=visible -@1 display of waypoint coordinates=Visualizar coordenadas del punto @1 -Disable=Deshabilitado -Enable=Habilitado -Change color of waypoint display=Cambiar el color del punto -Edit waypoint name=Editar nombre del punto -Waypoint active=Punto activo -Waypoint inactive=Punto inactivo -Finish editing=Terminar edición -World position=Posición en el mundo -Name=Nombre -HUD text color=Color del texto de la Interfaz - +# api.lua +Mixing=Mezclar +Cooking=Hornear +Digging=Recoger +# bags.lua +Bags=Bolsos +Bag @1=Bolso @1 +Small Bag=Bolso Pequeño +Medium Bag=Bolso Mediano +Large Bag=Bolso Grande +All Items= +Misc. Items= +Plant Life= +Building Materials= +Tools= +Minerals and Metals= +Environment and Worldgen= +Lighting= # group.lua - and = y - +Scroll categories left= +Scroll categories right= +Search=Buscar +Reset search and display everything=Limpiar la busqueda y mostrar todo +# internal.lua +First page=Primera página +Back three pages=Volver tres páginas +Back one page=Volver una página +Forward one page=Avanzar una página +Forward three pages=Avanzar tres páginas +Last page=Ultima Pagina +No matching items=No se encontraron elementos +No matches.=No hay resultados. +Page=Página +@1 of @2=@1 de @2 +Filter=Filtro # register.lua - Can use the creative inventory=Puede usar el inventario creativo Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally=Obliga al Inventario Unificado a mostrarse en modo Completo si el modo Simple está configurado globalmente Crafting Grid=Cuadricula de Elaboración Crafting Guide=Guía de Elaboración Set home position=Establecer posición de la casa Home position set to: @1=Posición de la casa cambiada a: @1 -You don't have the \"home\" privilege!=¡No tienes el privilegio \"home\"! +You don't have the "home" privilege!= Go home=Ir a casa Set time to day=Cambiar a dia -Set time to night=Cambiar a noche Time of day set to 6am=Hora del día cambiada a 6 AM -Time of day set to 9pm=Hora del día cambiada a 9 PM You don't have the settime privilege!=¡No tienes el privilegio "settime"! +Set time to night=Cambiar a noche +Time of day set to 9pm=Hora del día cambiada a 9 PM Clear inventory=Limpiar inventario +This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.= Inventory cleared!=¡Inventario limpio! -This button has been disabled outside=Este botón ha sido deshabilitado -Crafting=Elaboración Trash:=Basura: Refill:=Rellenar: Any item belonging to the @1 group=Cualquier elemento que pertenezca al grupo @1 @@ -65,36 +68,41 @@ Show previous recipe=Mostrar la receta anterior Show previous usage=Mostrar el uso anterior @1 (@2)=@1 (@2) Give me:=Dame: -This recipe is too@nlarge to be displayed.=Esta receta es demasiado@ngrande para ser mostrada. +This recipe is too@@large to be displayed.= To craft grid:=Construir: All=Todos +Crafting=Elaboración +White=Blanco +Yellow=Amarillo +Red=Rojo +Green=Verde +Blue=Azul +Waypoints=Puntos +Select Waypoint #@1=Seleccionar Punto #@1 +Waypoint @1=Punto @1 +Set waypoint to current location=Establecer el punto a la ubicación actual +Hide waypoint= +Show waypoint= +Hide coordinates= +Show coordinates= +Change color of waypoint display=Cambiar el color del punto +Edit waypoint name=Editar nombre del punto +Waypoint active=Punto activo +Waypoint inactive=Punto inactivo +Finish editing=Terminar edición +World position=Posición en el mundo +Name=Nombre +HUD text color=Color del texto de la Interfaz -# api.lua -Mixing=Mezclar -Cooking=Hornear -Digging=Recoger +##### not used anymore ##### -# internal.lua - -First page=Primera página -Back three pages=Volver tres páginas -Back one page=Volver una página -Forward one page=Avanzar una página -Forward three pages=Avanzar tres páginas -Last page=Ultima Pagina -Search=Buscar -Reset search and display everything=Limpiar la busqueda y mostrar todo -No matching items=No se encontraron elementos -No matches.=No hay resultados. -Page=Página -@1 of @2=@1 de @2 -Filter=Filtro - -# bags.lua - -Bags=Bolsos -Bag @1=Bolso @1 -Small Bag=Bolso Pequeño -Medium Bag=Bolso Mediano -Large Bag=Bolso Grande +Make waypoint @1=Hacer punto @1 +invisible=invisible +visible=visible +@1 display of waypoint coordinates=Visualizar coordenadas del punto @1 +Disable=Deshabilitado +Enable=Habilitado +You don't have the \"home\" privilege!=¡No tienes el privilegio \"home\"! +This button has been disabled outside=Este botón ha sido deshabilitado +This recipe is too@nlarge to be displayed.=Esta receta es demasiado@ngrande para ser mostrada. diff --git a/unified_inventory/locale/unified_inventory.fr.tr b/unified_inventory/locale/unified_inventory.fr.tr index 5367ddb..96d8c3f 100644 --- a/unified_inventory/locale/unified_inventory.fr.tr +++ b/unified_inventory/locale/unified_inventory.fr.tr @@ -1,5 +1,5 @@ # textdomain: unified_inventory -Crafting=Création +Mixing= Cooking=Cuisson Digging=Creuser Bags=Sacs @@ -7,35 +7,66 @@ Bag @1=Sac @1 Small Bag=Petit sac Medium Bag=Sac moyen Large Bag=Grand sac +All Items= +Misc. Items= +Plant Life= +Building Materials= +Tools= +Minerals and Metals= +Environment and Worldgen= +Lighting= and = et +Scroll categories left= +Scroll categories right= +Search=Rechercher +Reset search and display everything= First page=1ère page Back three pages=3 pages en arrière Back one page=Page précédente Forward one page=Page suivante Forward three pages=3 pages en avant Last page=Dernière page -Search=Rechercher No matching items=Aucun élément correspondant No matches.=Aucun match Page=Page @1 of @2=@1 de @2 Filter=Filtre Can use the creative inventory=Vous pouvez utiliser l'inventaire créatif +Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally= Crafting Grid=Grille de création Crafting Guide=Guide de création Set home position=Position dans le monde Home position set to: @1=Position de votre base fixée à: @1 You don't have the "home" privilege!=Vous n'avez pas le privilège "home"! +Go home= +Set time to day= Time of day set to 6am=Heure fixée à 6h You don't have the settime privilege!=Vous n'avez pas le privilège "settime"! +Set time to night= Time of day set to 9pm=Heure fixée à 21h +Clear inventory= +This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.= Inventory cleared!=Inventaire vidé ! Trash:=Poubelle : Refill:=Remplir : +Any item belonging to the @1 group= +Any item belonging to the groups @1= Recipe @1 of @2=Recette @1 de @2 +Usage @1 of @2= +No recipes= +No usages= Result=Résultat +Ingredient= +Show next recipe= +Show next usage= +Show previous recipe= +Show previous usage= +@1 (@2)= +Give me:= +This recipe is too@@large to be displayed.= To craft grid:=Sur de création: All=Tout +Crafting=Création White=Blanc Yellow=Jaune Red=Rouge @@ -45,8 +76,10 @@ Waypoints=Point de passage Select Waypoint #@1=Choisir un point de passage #@1 Waypoint @1=Point de passage @1 Set waypoint to current location=Marquer un point de passage à la position actuelle -Make waypoint @1=Rendre @1 le point de passage -@1 display of waypoint coordinates=@1 montrer les coordonnées des points de passages +Hide waypoint= +Show waypoint= +Hide coordinates= +Show coordinates= Change color of waypoint display=Changer la couleur du point de passage Edit waypoint name=Editer le nom du point de passage Waypoint active=Point de passage actif @@ -55,3 +88,9 @@ Finish editing=Terminer l'édition World position=Position dans le monde Name=Nom HUD text color=Couleur de texte du HUD + + +##### not used anymore ##### + +Make waypoint @1=Rendre @1 le point de passage +@1 display of waypoint coordinates=@1 montrer les coordonnées des points de passages diff --git a/unified_inventory/locale/unified_inventory.it.tr b/unified_inventory/locale/unified_inventory.it.tr index 1bf7660..c30d9e0 100644 --- a/unified_inventory/locale/unified_inventory.it.tr +++ b/unified_inventory/locale/unified_inventory.it.tr @@ -1,5 +1,4 @@ # textdomain: unified_inventory -Crafting=Assemblaggio Mixing=Unione Cooking=Cottura Digging=Scavo @@ -8,21 +7,32 @@ Bag @1=Borsa @1 Small Bag=Borsa piccola Medium Bag=Borsa media Large Bag=Borsa grande +All Items= +Misc. Items= +Plant Life= +Building Materials= +Tools= +Minerals and Metals= +Environment and Worldgen= +Lighting= and = e +Scroll categories left= +Scroll categories right= +Search=Cerca +Reset search and display everything=Azzera la ricerca e mostra tutto First page=Prima pagina Back three pages=Indietro di tre pagine Back one page=Indietro di una pagina Forward one page=Avanti di una pagina Forward three pages=Avanti di tre pagine Last page=Ultima pagina -Search=Cerca -Reset search and display everything=Azzera la ricerca e mostra tutto No matching items=Nessun oggetto corrispondente No matches.=Nessuna corrispondenza. Page=Pagina @1 of @2=@1 di @2 Filter=Filtro Can use the creative inventory=Può usare l'inventario creativo +Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally=Forza la visualizzazione di Unified Inventory in modalità completa se è configurata globalmente la visualizzazione semplice Crafting Grid=Griglia di assemblaggio Crafting Guide=Guida di assemblaggio Set home position=Imposta la residenza @@ -35,6 +45,7 @@ You don't have the settime privilege!=Non hai il privilegio "time"! Set time to night=Imposta l'orario sulla notte Time of day set to 9pm=Orario impostato sulle 9am Clear inventory=Ripulisci l'inventario +This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.= Inventory cleared!=Inventario ripulito! Trash:=Butta: Refill:=Riempi: @@ -50,9 +61,12 @@ Show next recipe=Mostra la prossima ricetta Show next usage=Mostra il prossimo utilizzo Show previous recipe=Mostra la ricetta precedente Show previous usage=Mostra l'utilizzo precedente +@1 (@2)= Give me:=Dammi: +This recipe is too@@large to be displayed.= To craft grid:=Alla griglia di assemblaggio: All=Tutto +Crafting=Assemblaggio White=Bianco Yellow=Giallo Red=Rosso @@ -62,12 +76,10 @@ Waypoints=Tappe Select Waypoint #@1=Seleziona tappa n°@1 Waypoint @1=Tappa @1 Set waypoint to current location=Imposta tappa alla posizione attuale -invisible=invisibile -visible=visibile -Make waypoint @1=Crea tappa @1 -Disable=Disabilita -Enable=Abilita -@1 display of waypoint coordinates=@1 la visualizzazione delle coordinate della tappa +Hide waypoint= +Show waypoint= +Hide coordinates= +Show coordinates= Change color of waypoint display=Modifica il colore della visualizzazione della tappa Edit waypoint name=Modifica il nome della tappa Waypoint active=Tappa attiva @@ -76,4 +88,13 @@ Finish editing=Termina la modifica World position=Posizione del mondo Name=Nome HUD text color=Colore del testo del visore -Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally=Forza la visualizzazione di Unified Inventory in modalità completa se è configurata globalmente la visualizzazione semplice + + +##### not used anymore ##### + +invisible=invisibile +visible=visibile +Make waypoint @1=Crea tappa @1 +Disable=Disabilita +Enable=Abilita +@1 display of waypoint coordinates=@1 la visualizzazione delle coordinate della tappa diff --git a/unified_inventory/locale/unified_inventory.ms.tr b/unified_inventory/locale/unified_inventory.ms.tr index 25fc853..be4eb5e 100644 --- a/unified_inventory/locale/unified_inventory.ms.tr +++ b/unified_inventory/locale/unified_inventory.ms.tr @@ -1,5 +1,4 @@ # textdomain: unified_inventory -Crafting=Pertukangan Mixing=Pencampuran Cooking=Pemasakan Digging=Penggalian @@ -8,21 +7,32 @@ Bag @1=Beg @1 Small Bag=Beg Kecil Medium Bag=Beg Sederhana Large Bag=Beg Besar +All Items= +Misc. Items= +Plant Life= +Building Materials= +Tools= +Minerals and Metals= +Environment and Worldgen= +Lighting= and = dan +Scroll categories left= +Scroll categories right= +Search=Cari +Reset search and display everything=Set semula carian dan tunjukkan semua benda First page=Halaman pertama Back three pages=Tiga halaman sebelumnya Back one page=Halaman sebelumnya Forward one page=Halaman seterusnya Forward three pages=Tiga halaman seterusnya Last page=Halaman terakhir -Search=Cari -Reset search and display everything=Set semula carian dan tunjukkan semua benda No matching items=Tiada item sepadan No matches.=Tiada padanan. Page=Halaman @1 of @2=@1 drpd @2 Filter=Tapis Can use the creative inventory=Boleh guna inventori kreatif +Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally= Crafting Grid=Grid Pertukangan Crafting Guide=Panduan Pertukangan Set home position=Tetapkan kedudukan rumah @@ -35,6 +45,7 @@ You don't have the settime privilege!=Anda tidak ada keistimewaan settime! Set time to night=Tetapkan masa jadi malam Time of day set to 9pm=Masa ditetapkan ke 9 malam Clear inventory=Kosongkan inventori +This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.= Inventory cleared!=Inventori dikosongkan! Trash:=Buang: Refill:=Isi balik: @@ -52,7 +63,10 @@ Show previous recipe=Tunjuk resipi sebelumnya Show previous usage=Tunjuk kegunaan sebelumnya @1 (@2)=@1 (@2) Give me:=Beri saya: +This recipe is too@@large to be displayed.= To craft grid:=Ke grid pertukangan: +All= +Crafting=Pertukangan White=Putih Yellow=Kuning Red=Merah @@ -62,12 +76,10 @@ Waypoints=Titik Arah Select Waypoint #@1=Pilih Titik Arah #@1 Waypoint @1=Titik Arah @1 Set waypoint to current location=Tetapkan titik arah ke lokasi semasa -invisible=Sembunyikan -visible=Paparkan -Make waypoint @1=@1 titik arah -Disable=Sembunyikan -Enable=Paparkan -@1 display of waypoint coordinates=@1 koordinat untuk titik arah +Hide waypoint= +Show waypoint= +Hide coordinates= +Show coordinates= Change color of waypoint display=Tukar warna paparan titik arah Edit waypoint name=Edit nama titik arah Waypoint active=Titik arah aktif @@ -76,3 +88,13 @@ Finish editing=Selesai edit World position=Kedudukan dunia Name=Nama HUD text color=Warna tulisan HUD + + +##### not used anymore ##### + +invisible=Sembunyikan +visible=Paparkan +Make waypoint @1=@1 titik arah +Disable=Sembunyikan +Enable=Paparkan +@1 display of waypoint coordinates=@1 koordinat untuk titik arah diff --git a/unified_inventory/locale/unified_inventory.pl.tr b/unified_inventory/locale/unified_inventory.pl.tr index 19121d8..69d39e3 100644 --- a/unified_inventory/locale/unified_inventory.pl.tr +++ b/unified_inventory/locale/unified_inventory.pl.tr @@ -1,22 +1,40 @@ # textdomain: unified_inventory +Mixing= +Cooking= +Digging= Bags=Plecaki Bag @1=Plecak @1 Small Bag=Maly plecak Medium Bag=Sredni plecak Large Bag=Duzy plecak +All Items= +Misc. Items= +Plant Life= +Building Materials= +Tools= +Minerals and Metals= +Environment and Worldgen= +Lighting= and = i +Scroll categories left= +Scroll categories right= +Search=Szukaj +Reset search and display everything= First page=Pierwsza strona Back three pages=3 strony w tyl Back one page=1 strona w tyl Forward one page=1 strona do przodu Forward three pages=3 strony do przodu Last page=Ostatnia strona -Search=Szukaj No matching items=Brak pasujacych przedmiotow No matches.=Brak wyników Page=Strona @1 of @2=@1 z @2 Filter=Filtr +Can use the creative inventory= +Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally= +Crafting Grid= +Crafting Guide= Set home position=Ustaw pozycję wyjściową Home position set to: @1=Pozycja domowa ustawiona na: @1 You don't have the "home" privilege!=Nie masz uprawnien do zmiany czasu "home"! @@ -27,17 +45,28 @@ You don't have the settime privilege!=Nie masz uprawnien do zmiany czasu "settim Set time to night=Ustaw czas na noc Time of day set to 9pm=Czas ustawiony na 21:00 Clear inventory=Wyczyść zapasy +This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.= Inventory cleared!=Zapasy zostały wyczyszczone! Trash:=Smietnik: Refill:=Uzupelnianie: +Any item belonging to the @1 group= +Any item belonging to the groups @1= Recipe @1 of @2=Recepta @1 z @2 Usage @1 of @2=Użycie @1 z @2 No recipes=Brak recepty No usages=Bez użycia Result=Wynik Ingredient=Składnik +Show next recipe= +Show next usage= +Show previous recipe= +Show previous usage= +@1 (@2)= Give me:=Daj mi: +This recipe is too@@large to be displayed.= +To craft grid:= All=Wszystko +Crafting= White=Bialy Yellow=Zolty Red=Czerwony @@ -47,10 +76,10 @@ Waypoints=Punkty orientacyjne Select Waypoint #@1=Wybierz punkt #@1 Waypoint @1=Punkty orientacyjne @1 Set waypoint to current location=Ustaw punkt orientacyjny na biezacej pozycji -invisible=niewidzialny -visible=widomy -Make waypoint @1=Robić punkt @1 -@1 display of waypoint coordinates=@1 koordynatow punktu +Hide waypoint= +Show waypoint= +Hide coordinates= +Show coordinates= Change color of waypoint display=Zmien kolor punktu Edit waypoint name=Edytuj nazwe punktu Waypoint active=Punkt wlaczony @@ -59,3 +88,11 @@ Finish editing=Zakoncz edycje World position=Pozycja Name=Nazwa HUD text color=Kolor tekstu HUD + + +##### not used anymore ##### + +invisible=niewidzialny +visible=widomy +Make waypoint @1=Robić punkt @1 +@1 display of waypoint coordinates=@1 koordynatow punktu diff --git a/unified_inventory/locale/unified_inventory.pt.tr b/unified_inventory/locale/unified_inventory.pt.tr index 3b0b902..5fedbc0 100644 --- a/unified_inventory/locale/unified_inventory.pt.tr +++ b/unified_inventory/locale/unified_inventory.pt.tr @@ -1,5 +1,4 @@ # textdomain: unified_inventory -Crafting=Artesanato Mixing=Muistura Cooking=Cozimento Digging=Escavação @@ -8,21 +7,32 @@ Bag @1=Bolsa @1 Small Bag=Bolsa Pequena Medium Bag=Bolsa Média Large Bag=Bolsa Grande +All Items= +Misc. Items= +Plant Life= +Building Materials= +Tools= +Minerals and Metals= +Environment and Worldgen= +Lighting= and = e +Scroll categories left= +Scroll categories right= +Search=Pesquisar +Reset search and display everything=Redefinir pesquisa e exibir tudo First page=Primeira Página Back three pages=Voltar 3 Páginas Back one page=Voltar 1 Página Forward one page=Avançar 1 Página Forward three pages=Avançar 3 Páginas Last page=Ultima Página -Search=Pesquisar -Reset search and display everything=Redefinir pesquisa e exibir tudo No matching items=Nenhum item correspondente No matches.=Sem correspondências Page=Página @1 of @2=@1 de @2 Filter=Filtro Can use the creative inventory=Pode usar o inventário do criativo +Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally= Crafting Grid=Grade de Artesanato Crafting Guide=Guia de Artesanato Set home position=Definir posição de casa @@ -35,6 +45,7 @@ You don't have the settime privilege!=Você não tem o privilégio de "settime"! Set time to night=Definir turno para noite Time of day set to 9pm=Hora do dia ajustada para 21h Clear inventory=Limpar Inventário +This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.= Inventory cleared!=Inventário Apagado! Trash:=Lixo: Refill:=Recarga: @@ -50,9 +61,12 @@ Show next recipe=Exibir Próxima Receita Show next usage=Mostrar Próxima Utilização Show previous recipe=Exibir Receita Anterior Show previous usage=Exibir Utilização Anterior +@1 (@2)= Give me:=Gerado: +This recipe is too@@large to be displayed.= To craft grid:=Para Grade de Artesanato All=MAX +Crafting=Artesanato White=Branco Yellow=Amarelo Red=Vermelho @@ -62,10 +76,10 @@ Waypoints=Apontador de Direção Select Waypoint #@1=Seleção de Apontador de Direção #@1 Waypoint @1=Apontador de Direção @1 Set waypoint to current location=Configurar localização atual do Apontador de Direção -invisible=invisível -visible=visível -Make waypoint @1=Fazer Apontador de Direção @1 -@1 display of waypoint coordinates=@1 exibição de coordenadas de Fazer Apontador de Direção +Hide waypoint= +Show waypoint= +Hide coordinates= +Show coordinates= Change color of waypoint display=Mudar cor exibida do Apontador de Direção Edit waypoint name=Editar Nome de Apontador de Direção Waypoint active=Apontador de Direção Ativo @@ -74,3 +88,11 @@ Finish editing=Edição Finalizada World position=Posição Mundial Name=Nome HUD text color=Cor de HUD + + +##### not used anymore ##### + +invisible=invisível +visible=visível +Make waypoint @1=Fazer Apontador de Direção @1 +@1 display of waypoint coordinates=@1 exibição de coordenadas de Fazer Apontador de Direção diff --git a/unified_inventory/locale/unified_inventory.ru.tr b/unified_inventory/locale/unified_inventory.ru.tr index f2a2300..2e3489c 100644 --- a/unified_inventory/locale/unified_inventory.ru.tr +++ b/unified_inventory/locale/unified_inventory.ru.tr @@ -1,5 +1,4 @@ # textdomain: unified_inventory -Crafting=Крафт Mixing=Мешать Cooking=Варить Digging=Копать @@ -8,21 +7,32 @@ Bag @1=Сумка @1 Small Bag=Малая сумка Medium Bag=Средняя сумка Large Bag=Большая сумка +All Items= +Misc. Items= +Plant Life= +Building Materials= +Tools= +Minerals and Metals= +Environment and Worldgen= +Lighting= and = и +Scroll categories left= +Scroll categories right= +Search=Поиск +Reset search and display everything=Сброс поиска, показать всё First page=Первая страница Back three pages=3 страницы назад Back one page=1 страницу назад Forward one page=1 страницу вперёд Forward three pages=3 страницы вперёд Last page=Последняя страница -Search=Поиск -Reset search and display everything=Сброс поиска, показать всё No matching items=Нет подходящих элементов No matches.=Ничего не найдено Page=Страница @1 of @2=@1 из @2 Filter=Фильтр Can use the creative inventory=Можно использовать инвентарь творческого режима +Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally= Crafting Grid=Решетка крафта Crafting Guide=Книга рецептов Set home position=Установить позицию дома @@ -35,6 +45,7 @@ You don't have the settime privilege!=Вам не разрешено устан Set time to night=Ночь Time of day set to 9pm=Установлено время 9 вечера Clear inventory=Очистить инвентарь +This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.= Inventory cleared!=Инвентарь очищен! Trash:=Мусор: Refill:=Наполнить: @@ -50,9 +61,12 @@ Show next recipe=Следующий рецепт Show next usage=Следующее использование Show previous recipe=Прошлый рецепт Show previous usage=Прошлая страница +@1 (@2)= Give me:=Дай мне: +This recipe is too@@large to be displayed.= To craft grid:=На решeтку крафта: All=Все +Crafting=Крафт White=Белый Yellow=Желтый Red=Красный @@ -62,12 +76,10 @@ Waypoints=Путевые точки Select Waypoint #@1=Выбрать путевую точку №@1 Waypoint @1=Путевая точка @1 Set waypoint to current location=Установить путевую точку по текущей позиции -invisible=невидимой -visible=видимой -Make waypoint @1=Сделать путевую точку @1 -Disable=Выключить -Enable=Включить -@1 display of waypoint coordinates=@1 показ координат путевых точек +Hide waypoint= +Show waypoint= +Hide coordinates= +Show coordinates= Change color of waypoint display=Поменять цвет путевой точки Edit waypoint name=Переименовать путевую точку Waypoint active=Путевая точка включена @@ -76,3 +88,13 @@ Finish editing=Закончить редакцию World position=Позиция мира Name=Имя HUD text color=Цвет текста HUDа + + +##### not used anymore ##### + +invisible=невидимой +visible=видимой +Make waypoint @1=Сделать путевую точку @1 +Disable=Выключить +Enable=Включить +@1 display of waypoint coordinates=@1 показ координат путевых точек diff --git a/unified_inventory/locale/unified_inventory.tr.tr b/unified_inventory/locale/unified_inventory.tr.tr index 93246cc..b4e15b8 100644 --- a/unified_inventory/locale/unified_inventory.tr.tr +++ b/unified_inventory/locale/unified_inventory.tr.tr @@ -1,5 +1,4 @@ # textdomain: unified_inventory -Crafting=Üretim Mixing=Karıştırma Cooking=Pişirme Digging=Kazma @@ -8,20 +7,32 @@ Bag @1=@1. Çanta Small Bag=Küçük Çanta Medium Bag=Çanta Large Bag=Büyük Çanta +All Items= +Misc. Items= +Plant Life= +Building Materials= +Tools= +Minerals and Metals= +Environment and Worldgen= +Lighting= and = ve +Scroll categories left= +Scroll categories right= +Search=Ara +Reset search and display everything= First page=İlk Sayfa Back three pages=3 Sayfa Gerile Back one page=Geri Forward one page=İleri Forward three pages=3 Sayfa İlerile Last page=Son Sayfa -Search=Ara No matching items=Eşleşme yok No matches.=Eşleşme yok Page=Sayfa @1 of @2=@1 dan @2 Filter=Süzgeç Can use the creative inventory=Yaratıcı envanteri kullanabilir +Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally= Crafting Grid=Üretim tablosu Crafting Guide=Kılavuz Set home position=Set ev pozisyon @@ -33,19 +44,29 @@ Time of day set to 6am=Saat 06:00 olarak ayarlandı You don't have the settime privilege!="settime" yetkiniz yok! Set time to night=Geceye zaman ayarla Time of day set to 9pm=Saat 19:00 olarak ayarlandı -msgid ""=Yaratıcı modu dışında iken bu tuş kullanılamaz. +Clear inventory= +This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.= Inventory cleared!=Envanter temizlendi! Trash:=Çöp Refill:=Doldur +Any item belonging to the @1 group= +Any item belonging to the groups @1= Recipe @1 of @2=@1 dan @2 tarifi Usage @1 of @2=Kullanım @1/@2 No recipes=Tarifi yok No usages=Kullanım yok Result=Çıktı Ingredient=Bileşen +Show next recipe= +Show next usage= +Show previous recipe= +Show previous usage= +@1 (@2)= Give me:=Ver bana: +This recipe is too@@large to be displayed.= To craft grid:=Üretim tablosuna kopyala All=Tümü +Crafting=Üretim White=Beyaz Yellow=Sarı Red=Kırmızı @@ -55,10 +76,10 @@ Waypoints=Konum Noktaları Select Waypoint #@1=#@1 konum noktası seç Waypoint @1=@1 Konum Noktaları Set waypoint to current location=Bulunduğun noktayı işaretle -invisible=görünmez -visible=görünür -Make waypoint @1=Yol noktası @1 -@1 display of waypoint coordinates=Yol noktası koordinatlarının görüntülenmesini @1 +Hide waypoint= +Show waypoint= +Hide coordinates= +Show coordinates= Change color of waypoint display=Konum Gösterge Rengi Edit waypoint name=Konum Noktasını Düzenle Waypoint active=Konum Etkin @@ -67,3 +88,12 @@ Finish editing=Düzenleme bitti World position=Dünya konumu Name=İsim HUD text color=Metin rengi + + +##### not used anymore ##### + +msgid ""=Yaratıcı modu dışında iken bu tuş kullanılamaz. +invisible=görünmez +visible=görünür +Make waypoint @1=Yol noktası @1 +@1 display of waypoint coordinates=Yol noktası koordinatlarının görüntülenmesini @1 diff --git a/unified_inventory/locale/unified_inventory.zh_CN.tr b/unified_inventory/locale/unified_inventory.zh_CN.tr index 30e15e3..595a492 100644 --- a/unified_inventory/locale/unified_inventory.zh_CN.tr +++ b/unified_inventory/locale/unified_inventory.zh_CN.tr @@ -1,8 +1,4 @@ # textdomain: unified_inventory -# traslation by: IFRFSX(BingFengFSX) -#Email: IFRFSX@Protonmail.com - -Crafting=合成 Mixing=混合 Cooking=烹饪 Digging=挖出 @@ -11,20 +7,32 @@ Bag @1=背包@1 Small Bag=小背包 Medium Bag=中背包 Large Bag=大背包 +All Items= +Misc. Items= +Plant Life= +Building Materials= +Tools= +Minerals and Metals= +Environment and Worldgen= +Lighting= and = 和 +Scroll categories left= +Scroll categories right= +Search=搜索 +Reset search and display everything=重置搜索并显示所有物品 First page=第一页 Back three pages=后退三页 Back one page=后退一页 Forward one page=前进一页 Forward three pages=前进三页 Last page=最后一页 -Search=搜索 No matching items=没有匹配物品 No matches.=没有匹配 Page=页面 @1 of @2=第@1页,共@2页 Filter=过滤器 Can use the creative inventory=可以使用创造背包 +Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally= Crafting Grid=合成表 Crafting Guide=合成指南 Set home position=设置家的位置 @@ -36,21 +44,29 @@ Time of day set to 6am=时间设置到早晨6点 You don't have the settime privilege!=你没有“settime”权限! Set time to night=设置时间到晚上 Time of day set to 9pm=时间设置到晚上9点 - -Inventory cleared!=清空背包 Clear inventory=清空背包 - +This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.= +Inventory cleared!=清空背包 Trash:=丢弃: Refill:=填满: +Any item belonging to the @1 group=属于@1组的任何项目 +Any item belonging to the groups @1=属于组@1的任何项目 Recipe @1 of @2=第@1配方,共@2个 Usage @1 of @2=第@1用法,共@2个 No recipes=没有配方 No usages=没有用法 Result=结果 Ingredient=原料 +Show next recipe= +Show next usage= +Show previous recipe= +Show previous usage= +@1 (@2)= Give me:=给予: +This recipe is too@@large to be displayed.= To craft grid:=填充物品到合成表 All=全部 +Crafting=合成 White=白 Yellow=黄 Red=红 @@ -60,10 +76,10 @@ Waypoints=航路点 Select Waypoint #@1=查询航路点 #@1 Waypoint @1=航路点 @1 Set waypoint to current location=将航路点设置到当前位置 -invisible=不可见的 -visible=可见的 -Make waypoint @1=设置航路点 @1 -@1 display of waypoint coordinates=显示航路点@1坐标 +Hide waypoint= +Show waypoint= +Hide coordinates= +Show coordinates= Change color of waypoint display=改变航路点显示的颜色 Edit waypoint name=编辑航路点名称 Waypoint active=航路点已激活 @@ -73,7 +89,10 @@ World position=世界位置 Name=名称 HUD text color=HUD文本颜色 -Reset search and display everything=重置搜索并显示所有物品 -Any item belonging to the @1 group=属于@1组的任何项目 -Any item belonging to the groups @1=属于组@1的任何项目 +##### not used anymore ##### + +invisible=不可见的 +visible=可见的 +Make waypoint @1=设置航路点 @1 +@1 display of waypoint coordinates=显示航路点@1坐标 diff --git a/unified_inventory/locale/unified_inventory.zh_TW.tr b/unified_inventory/locale/unified_inventory.zh_TW.tr index 3e8d1a1..f41190c 100644 --- a/unified_inventory/locale/unified_inventory.zh_TW.tr +++ b/unified_inventory/locale/unified_inventory.zh_TW.tr @@ -1,8 +1,4 @@ # textdomain: unified_inventory -# traslation by: IFRFSX(BingFengFSX) -#Email: IFRFSX@Protonmail.com - -Crafting=合成 Mixing=混合 Cooking=烹飪 Digging=挖出 @@ -11,20 +7,32 @@ Bag @1=揹包@1 Small Bag=小揹包 Medium Bag=中揹包 Large Bag=大揹包 +All Items= +Misc. Items= +Plant Life= +Building Materials= +Tools= +Minerals and Metals= +Environment and Worldgen= +Lighting= and = 和 +Scroll categories left= +Scroll categories right= +Search=搜索 +Reset search and display everything=重置搜索並顯示所有物品 First page=第一頁 Back three pages=後退三頁 Back one page=後退一頁 Forward one page=前進一頁 Forward three pages=前進三頁 Last page=最後一頁 -Search=搜索 No matching items=沒有匹配物品 No matches.=沒有匹配 Page=頁面 @1 of @2=第@1頁,共@2頁 Filter=過濾器 Can use the creative inventory=可以使用創造揹包 +Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally= Crafting Grid=合成表 Crafting Guide=合成指南 Set home position=設置家的位置 @@ -36,21 +44,29 @@ Time of day set to 6am=時間設置到早晨6點 You don't have the settime privilege!=你沒有“settime”權限! Set time to night=設置時間到晚上 Time of day set to 9pm=時間設置到晚上9點 - -Inventory cleared!=清空揹包 Clear inventory=清空揹包 - +This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.= +Inventory cleared!=清空揹包 Trash:=丟棄: Refill:=填滿: +Any item belonging to the @1 group=屬於@1組的任何項目 +Any item belonging to the groups @1=屬於組@1的任何項目 Recipe @1 of @2=第@1配方,共@2個 Usage @1 of @2=第@1用法,共@2個 No recipes=沒有配方 No usages=沒有用法 Result=結果 Ingredient=原料 +Show next recipe= +Show next usage= +Show previous recipe= +Show previous usage= +@1 (@2)= Give me:=給予: +This recipe is too@@large to be displayed.= To craft grid:=填充物品到合成表 All=全部 +Crafting=合成 White=白 Yellow=黃 Red=紅 @@ -60,10 +76,10 @@ Waypoints=航路點 Select Waypoint #@1=查詢航路點 #@1 Waypoint @1=航路點 @1 Set waypoint to current location=將航路點設置到當前位置 -invisible=不可見的 -visible=可見的 -Make waypoint @1=設置航路點 @1 -@1 display of waypoint coordinates=顯示航路點@1座標 +Hide waypoint= +Show waypoint= +Hide coordinates= +Show coordinates= Change color of waypoint display=改變航路點顯示的顏色 Edit waypoint name=編輯航路點名稱 Waypoint active=航路點已激活 @@ -73,7 +89,10 @@ World position=世界位置 Name=名稱 HUD text color=HUD文本顏色 -Reset search and display everything=重置搜索並顯示所有物品 -Any item belonging to the @1 group=屬於@1組的任何項目 -Any item belonging to the groups @1=屬於組@1的任何項目 +##### not used anymore ##### + +invisible=不可見的 +visible=可見的 +Make waypoint @1=設置航路點 @1 +@1 display of waypoint coordinates=顯示航路點@1座標 diff --git a/unified_inventory/mod.conf b/unified_inventory/mod.conf index bca70ca..3d27d29 100644 --- a/unified_inventory/mod.conf +++ b/unified_inventory/mod.conf @@ -1,7 +1,8 @@ name = unified_inventory -depends = default -optional_depends = creative, sfinv, datastorage, farming + +optional_depends = default, creative, sfinv, datastorage, farming description = """ Unified Inventory replaces the default survival and creative inventory. It adds a nicer interface and a number of features, such as a crafting guide. """ +min_minetest_version = 5.4.0 diff --git a/unified_inventory/register.lua b/unified_inventory/register.lua index cfc1d7d..8dc20f0 100644 --- a/unified_inventory/register.lua +++ b/unified_inventory/register.lua @@ -1,6 +1,7 @@ local S = minetest.get_translator("unified_inventory") local NS = function(s) return s end local F = minetest.formspec_escape +local ui = unified_inventory minetest.register_privilege("creative", { description = S("Can use the creative inventory"), @@ -12,10 +13,9 @@ minetest.register_privilege("ui_full", { give_to_singleplayer = false, }) - local trash = minetest.create_detached_inventory("trash", { --allow_put = function(inv, listname, index, stack, player) - -- if unified_inventory.is_creative(player:get_player_name()) then + -- if ui.is_creative(player:get_player_name()) then -- return stack:get_count() -- else -- return 0 @@ -29,19 +29,19 @@ local trash = minetest.create_detached_inventory("trash", { }) trash:set_size("main", 1) -unified_inventory.register_button("craft", { +ui.register_button("craft", { type = "image", image = "ui_craft_icon.png", tooltip = S("Crafting Grid") }) -unified_inventory.register_button("craftguide", { +ui.register_button("craftguide", { type = "image", image = "ui_craftguide_icon.png", tooltip = S("Crafting Guide") }) -unified_inventory.register_button("home_gui_set", { +ui.register_button("home_gui_set", { type = "image", image = "ui_sethome_icon.png", tooltip = S("Set home position"), @@ -49,8 +49,8 @@ unified_inventory.register_button("home_gui_set", { action = function(player) local player_name = player:get_player_name() if minetest.check_player_privs(player_name, {home=true}) then - unified_inventory.set_home(player, player:get_pos()) - local home = unified_inventory.home_pos[player_name] + ui.set_home(player, player:get_pos()) + local home = ui.home_pos[player_name] if home ~= nil then minetest.sound_play("dingdong", {to_player=player_name, gain = 1.0}) @@ -60,7 +60,7 @@ unified_inventory.register_button("home_gui_set", { else minetest.chat_send_player(player_name, S("You don't have the \"home\" privilege!")) - unified_inventory.set_inventory_formspec(player, unified_inventory.current_page[player_name]) + ui.set_inventory_formspec(player, ui.current_page[player_name]) end end, condition = function(player) @@ -68,7 +68,7 @@ unified_inventory.register_button("home_gui_set", { end, }) -unified_inventory.register_button("home_gui_go", { +ui.register_button("home_gui_go", { type = "image", image = "ui_gohome_icon.png", tooltip = S("Go home"), @@ -76,13 +76,13 @@ unified_inventory.register_button("home_gui_go", { action = function(player) local player_name = player:get_player_name() if minetest.check_player_privs(player_name, {home=true}) then - if unified_inventory.go_home(player) then + if ui.go_home(player) then minetest.sound_play("teleport", {to_player = player_name}) end else minetest.chat_send_player(player_name, S("You don't have the \"home\" privilege!")) - unified_inventory.set_inventory_formspec(player, unified_inventory.current_page[player_name]) + ui.set_inventory_formspec(player, ui.current_page[player_name]) end end, condition = function(player) @@ -90,7 +90,7 @@ unified_inventory.register_button("home_gui_go", { end, }) -unified_inventory.register_button("misc_set_day", { +ui.register_button("misc_set_day", { type = "image", image = "ui_sun_icon.png", tooltip = S("Set time to day"), @@ -106,7 +106,7 @@ unified_inventory.register_button("misc_set_day", { else minetest.chat_send_player(player_name, S("You don't have the settime privilege!")) - unified_inventory.set_inventory_formspec(player, unified_inventory.current_page[player_name]) + ui.set_inventory_formspec(player, ui.current_page[player_name]) end end, condition = function(player) @@ -114,7 +114,7 @@ unified_inventory.register_button("misc_set_day", { end, }) -unified_inventory.register_button("misc_set_night", { +ui.register_button("misc_set_night", { type = "image", image = "ui_moon_icon.png", tooltip = S("Set time to night"), @@ -130,7 +130,7 @@ unified_inventory.register_button("misc_set_night", { else minetest.chat_send_player(player_name, S("You don't have the settime privilege!")) - unified_inventory.set_inventory_formspec(player, unified_inventory.current_page[player_name]) + ui.set_inventory_formspec(player, ui.current_page[player_name]) end end, condition = function(player) @@ -138,19 +138,19 @@ unified_inventory.register_button("misc_set_night", { end, }) -unified_inventory.register_button("clear_inv", { +ui.register_button("clear_inv", { type = "image", image = "ui_trash_icon.png", tooltip = S("Clear inventory"), action = function(player) local player_name = player:get_player_name() - if not unified_inventory.is_creative(player_name) then + if not ui.is_creative(player_name) then minetest.chat_send_player(player_name, S("This button has been disabled outside" .." of creative mode to prevent" .." accidental inventory trashing." .."\nUse the trash slot instead.")) - unified_inventory.set_inventory_formspec(player, unified_inventory.current_page[player_name]) + ui.set_inventory_formspec(player, ui.current_page[player_name]) return end player:get_inventory():set_list("main", {}) @@ -159,35 +159,42 @@ unified_inventory.register_button("clear_inv", { {to_player=player_name, gain = 1.0}) end, condition = function(player) - return unified_inventory.is_creative(player:get_player_name()) + return ui.is_creative(player:get_player_name()) end, }) -unified_inventory.register_page("craft", { +ui.register_page("craft", { get_formspec = function(player, perplayer_formspec) - local formspecy = perplayer_formspec.formspec_y - local formheadery = perplayer_formspec.form_header_y + local formheaderx = perplayer_formspec.form_header_x + local formheadery = perplayer_formspec.form_header_y + local craftx = perplayer_formspec.craft_x + local crafty = perplayer_formspec.craft_y local player_name = player:get_player_name() - local formspec = "background[2,"..formspecy..";6,3;ui_crafting_form.png]" - formspec = formspec..string.gsub(unified_inventory.standard_inv_bg, "YYY", (formspecy + 3.4)) - formspec = formspec.."label[0,"..formheadery..";" ..F(S("Crafting")).."]" - formspec = formspec.."listcolors[#00000000;#00000000]" - formspec = formspec.."list[current_player;craftpreview;6,"..formspecy..";1,1;]" - formspec = formspec.."list[current_player;craft;2,"..formspecy..";3,3;]" - if unified_inventory.trash_enabled or unified_inventory.is_creative(player_name) or minetest.get_player_privs(player_name).give then - formspec = formspec.."label[7,"..(formspecy + 1.5)..";" .. F(S("Trash:")) .. "]" - formspec = formspec.."background[7,"..(formspecy + 2)..";1,1;ui_single_slot.png]" - formspec = formspec.."list[detached:trash;main;7,"..(formspecy + 2)..";1,1;]" + local formspec = { + perplayer_formspec.standard_inv_bg, + perplayer_formspec.craft_grid, + "label["..formheaderx..","..formheadery..";" ..F(S("Crafting")).."]", + "listcolors[#00000000;#00000000]", + "listring[current_name;craft]", + "listring[current_player;main]" + } + local n=#formspec+1 + + if ui.trash_enabled or ui.is_creative(player_name) or minetest.get_player_privs(player_name).give then + formspec[n] = string.format("label[%f,%f;%s]", craftx + 6.45, crafty + 2.4, F(S("Trash:"))) + formspec[n+1] = ui.make_trash_slot(craftx + 6.25, crafty + 2.5) + n=n + 2 end - formspec = formspec.."listring[current_name;craft]" - formspec = formspec.."listring[current_player;main]" - if unified_inventory.is_creative(player_name) then - formspec = formspec.."label[0,"..(formspecy + 1.5)..";" .. F(S("Refill:")) .. "]" - formspec = formspec.."list[detached:"..F(player_name).."refill;main;0,"..(formspecy +2)..";1,1;]" + + if ui.is_creative(player_name) then + formspec[n] = ui.single_slot(craftx - 2.5, crafty + 2.5) + formspec[n+1] = string.format("label[%f,%f;%s]", craftx - 2.3, crafty + 2.4,F(S("Refill:"))) + formspec[n+2] = string.format("list[detached:%srefill;main;%f,%f;1,1;]", + F(player_name), craftx - 2.5 + ui.list_img_offset, crafty + 2.5 + ui.list_img_offset) end - return {formspec=formspec} + return {formspec=table.concat(formspec)} end, }) @@ -201,23 +208,27 @@ unified_inventory.register_page("craft", { local function stack_image_button(x, y, w, h, buttonname_prefix, item) local name = item:get_name() local count = item:get_count() + local wear = item:get_wear() + local description = item:get_meta():get_string("description") local show_is_group = false - local displayitem = name.." "..count + local displayitem = name.." "..count.." "..wear local selectitem = name if name:sub(1, 6) == "group:" then local group_name = name:sub(7) - local group_item = unified_inventory.get_group_item(group_name) + local group_item = ui.get_group_item(group_name) show_is_group = not group_item.sole displayitem = group_item.item or "unknown" selectitem = group_item.sole and displayitem or name end local label = show_is_group and "G" or "" - local buttonname = F(buttonname_prefix..unified_inventory.mangle_for_formspec(selectitem)) + -- Unique id to prevent tooltip being overridden + local id = string.format("%i%i_", x*10, y*10) + local buttonname = F(id..buttonname_prefix..ui.mangle_for_formspec(selectitem)) local button = string.format("item_image_button[%f,%f;%f,%f;%s;%s;%s]", x, y, w, h, F(displayitem), buttonname, label) if show_is_group then - local groupstring, andcount = unified_inventory.extract_groupnames(name) + local groupstring, andcount = ui.extract_groupnames(name) local grouptip if andcount == 1 then grouptip = S("Any item belonging to the @1 group", groupstring) @@ -228,6 +239,8 @@ local function stack_image_button(x, y, w, h, buttonname_prefix, item) if andcount >= 1 then button = button .. string.format("tooltip[%s;%s]", buttonname, grouptip) end + elseif description ~= "" then + button = button .. string.format("tooltip[%s;%s]", buttonname, F(description)) end return button end @@ -257,26 +270,33 @@ local other_dir = { usage = "recipe", } -unified_inventory.register_page("craftguide", { +ui.register_page("craftguide", { get_formspec = function(player, perplayer_formspec) - local formspecy = perplayer_formspec.formspec_y - local formheadery = perplayer_formspec.form_header_y - local craftresultx = perplayer_formspec.craft_result_x - local craftresulty = perplayer_formspec.craft_result_y + local craftguidex = perplayer_formspec.craft_guide_x + local craftguidey = perplayer_formspec.craft_guide_y + local craftguidearrowx = perplayer_formspec.craft_guide_arrow_x + local craftguideresultx = perplayer_formspec.craft_guide_result_x + local formheaderx = perplayer_formspec.form_header_x + local formheadery = perplayer_formspec.form_header_y + local give_x = perplayer_formspec.give_btn_x local player_name = player:get_player_name() local player_privs = minetest.get_player_privs(player_name) - local fs = { - string.gsub(unified_inventory.standard_inv_bg, "YYY", (formspecy + 3.4)), - "label[0,"..formheadery..";" .. F(S("Crafting Guide")) .. "]", + + local formspec = { + perplayer_formspec.standard_inv_bg, + "label["..formheaderx..","..formheadery..";" .. F(S("Crafting Guide")) .. "]", "listcolors[#00000000;#00000000]" } - local item_name = unified_inventory.current_item[player_name] + + local item_name = ui.current_item[player_name] if not item_name then - return { formspec = table.concat(fs) } + return { formspec = table.concat(formspec) } end + local n = 4 + local item_name_shown if minetest.registered_items[item_name] and minetest.registered_items[item_name].description then @@ -286,51 +306,60 @@ unified_inventory.register_page("craftguide", { item_name_shown = item_name end - local dir = unified_inventory.current_craft_direction[player_name] + local dir = ui.current_craft_direction[player_name] local rdir = dir == "recipe" and "usage" or "recipe" - local crafts = unified_inventory.crafts_for[dir][item_name] - local alternate = unified_inventory.alternate[player_name] + local crafts = ui.crafts_for[dir][item_name] + local alternate = ui.alternate[player_name] local alternates, craft if crafts and #crafts > 0 then alternates = #crafts craft = crafts[alternate] end - local has_give = player_privs.give or unified_inventory.is_creative(player_name) + local has_give = player_privs.give or ui.is_creative(player_name) - fs[#fs + 1] = "background[0.5,"..(formspecy + 0.2)..";8,3;ui_craftguide_form.png]" - fs[#fs + 1] = string.format("textarea[%f,%f;10,1;;%s: %s;]", - craftresultx, craftresulty, F(role_text[dir]), item_name_shown) - fs[#fs + 1] = stack_image_button(0, formspecy, 1.1, 1.1, - "item_button_" .. rdir .. "_", ItemStack(item_name)) + formspec[n] = string.format("image[%f,%f;%f,%f;ui_crafting_arrow.png]", + craftguidearrowx, craftguidey, ui.imgscale, ui.imgscale) + + formspec[n+1] = string.format("textarea[%f,%f;10,1;;%s: %s;]", + perplayer_formspec.craft_guide_resultstr_x, perplayer_formspec.craft_guide_resultstr_y, + F(role_text[dir]), item_name_shown) + n = n + 2 + + local giveme_form = table.concat({ + "label[".. (give_x+0.1)..",".. (craftguidey + 2.7) .. ";" .. F(S("Give me:")) .. "]", + "button["..(give_x)..",".. (craftguidey + 2.9) .. ";0.75,0.5;craftguide_giveme_1;1]", + "button["..(give_x+0.8)..",".. (craftguidey + 2.9) .. ";0.75,0.5;craftguide_giveme_10;10]", + "button["..(give_x+1.6)..",".. (craftguidey + 2.9) .. ";0.75,0.5;craftguide_giveme_99;99]" + }) if not craft then -- No craft recipes available for this item. - fs[#fs + 1] = "label[5.5,"..(formspecy + 2.35)..";" - .. F(no_recipe_text[dir]) .. "]" - local no_pos = dir == "recipe" and 4.5 or 6.5 - local item_pos = dir == "recipe" and 6.5 or 4.5 - fs[#fs + 1] = "image["..no_pos..","..formspecy..";1.1,1.1;ui_no.png]" - fs[#fs + 1] = stack_image_button(item_pos, formspecy, 1.1, 1.1, + formspec[n] = string.format("label[%f,%f;%s]", craftguidex+2.5, craftguidey+1.5, F(no_recipe_text[dir])) + local no_pos = dir == "recipe" and (craftguidex+2.5) or craftguideresultx + local item_pos = dir == "recipe" and craftguideresultx or (craftguidex+2.5) + formspec[n+1] = "image["..no_pos..","..craftguidey..";1.2,1.2;ui_no.png]" + formspec[n+2] = stack_image_button(item_pos, craftguidey, 1.2, 1.2, "item_button_" .. other_dir[dir] .. "_", ItemStack(item_name)) if has_give then - fs[#fs + 1] = "label[0," .. (formspecy + 2.10) .. ";" .. F(S("Give me:")) .. "]" - .. "button[0, " .. (formspecy + 2.7) .. ";0.6,0.5;craftguide_giveme_1;1]" - .. "button[0.6," .. (formspecy + 2.7) .. ";0.7,0.5;craftguide_giveme_10;10]" - .. "button[1.3," .. (formspecy + 2.7) .. ";0.8,0.5;craftguide_giveme_99;99]" + formspec[n+3] = giveme_form end - return { formspec = table.concat(fs) } + return { formspec = table.concat(formspec) } + else + formspec[n] = stack_image_button(craftguideresultx, craftguidey, 1.2, 1.2, + "item_button_" .. rdir .. "_", ItemStack(craft.output)) + n = n + 1 end - local craft_type = unified_inventory.registered_craft_types[craft.type] or - unified_inventory.craft_type_defaults(craft.type, {}) + local craft_type = ui.registered_craft_types[craft.type] or + ui.craft_type_defaults(craft.type, {}) if craft_type.icon then - fs[#fs + 1] = string.format("image[%f,%f;%f,%f;%s]", - 5.7, (formspecy + 0.05), 0.5, 0.5, craft_type.icon) + formspec[n] = string.format("image[%f,%f;%f,%f;%s]", + craftguidearrowx+0.35, craftguidey, 0.5, 0.5, craft_type.icon) + n = n + 1 end - fs[#fs + 1] = "label[5.5,"..(formspecy + 1)..";" .. F(craft_type.description).."]" - fs[#fs + 1] = stack_image_button(6.5, formspecy, 1.1, 1.1, - "item_button_usage_", ItemStack(craft.output)) + formspec[n] = string.format("label[%f,%f;%s]", craftguidearrowx + 0.15, craftguidey + 1.4, F(craft_type.description)) + n = n + 1 local display_size = craft_type.dynamic_display_size and craft_type.dynamic_display_size(craft) @@ -341,11 +370,12 @@ unified_inventory.register_page("craftguide", { -- This keeps recipes aligned to the right, -- so that they're close to the arrow. - local xoffset = 5.5 + local xoffset = craftguidex+3.75 + local bspc = 1.25 -- Offset factor for crafting grids with side length > 4 local of = (3/math.max(3, math.max(display_size.width, display_size.height))) local od = 0 - -- Minimum grid size at which size optimazation measures kick in + -- Minimum grid size at which size optimization measures kick in local mini_craft_size = 6 if display_size.width >= mini_craft_size then od = math.max(1, display_size.width - 2) @@ -354,12 +384,12 @@ unified_inventory.register_page("craftguide", { -- Size modifier factor local sf = math.min(1, of * (1.05 + 0.05*od)) -- Button size - local bsize_h = 1.1 * sf - local bsize_w = bsize_h - if display_size.width >= mini_craft_size then - bsize_w = 1.175 * sf + local bsize = 1.2 * sf + + if display_size.width >= mini_craft_size then -- it's not a normal 3x3 grid + bsize = 0.8 * sf end - if (bsize_h > 0.35 and display_size.width) then + if (bsize > 0.35 and display_size.width) then for y = 1, display_size.height do for x = 1, display_size.width do local item @@ -369,48 +399,53 @@ unified_inventory.register_page("craftguide", { -- Flipped x, used to build formspec buttons from right to left local fx = display_size.width - (x-1) -- x offset, y offset - local xof = (fx-1) * of + of - local yof = (y-1) * of + 1 + local xof = ((fx-1) * of + of) * bspc + local yof = ((y-1) * of + 1) * bspc if item then - fs[#fs + 1] = stack_image_button( - xoffset - xof, formspecy - 1 + yof, bsize_w, bsize_h, + formspec[n] = stack_image_button( + xoffset - xof, craftguidey - 1.25 + yof, bsize, bsize, "item_button_recipe_", ItemStack(item)) else -- Fake buttons just to make grid - fs[#fs + 1] = string.format("image_button[%f,%f;%f,%f;ui_blank_image.png;;]", - xoffset - xof, formspecy - 1 + yof, bsize_w, bsize_h) + formspec[n] = string.format("image_button[%f,%f;%f,%f;ui_blank_image.png;;]", + xoffset - xof, craftguidey - 1.25 + yof, bsize, bsize) end + n = n + 1 end end else -- Error - fs[#fs + 1] = string.format("label[2,%f;%s]", - formspecy, F(S("This recipe is too@nlarge to be displayed."))) + formspec[n] = string.format("label[2,%f;%s]", + craftguidey, F(S("This recipe is too@nlarge to be displayed."))) + n = n + 1 end if craft_type.uses_crafting_grid and display_size.width <= 3 then - fs[#fs + 1] = "label[0," .. (formspecy + 0.9) .. ";" .. F(S("To craft grid:")) .. "]" - .. "button[0, " .. (formspecy + 1.5) .. ";0.6,0.5;craftguide_craft_1;1]" - .. "button[0.6," .. (formspecy + 1.5) .. ";0.7,0.5;craftguide_craft_10;10]" - .. "button[1.3," .. (formspecy + 1.5) .. ";0.8,0.5;craftguide_craft_max;" .. F(S("All")) .. "]" + formspec[n] = "label["..(give_x+0.1)..",".. (craftguidey + 1.7) .. ";" .. F(S("To craft grid:")) .. "]" + formspec[n+1] = "button[".. (give_x)..",".. (craftguidey + 1.9) .. ";0.75,0.5;craftguide_craft_1;1]" + formspec[n+2] = "button[".. (give_x+0.8)..",".. (craftguidey + 1.9) .. ";0.75,0.5;craftguide_craft_10;10]" + formspec[n+3] = "button[".. (give_x+1.6)..",".. (craftguidey + 1.9) .. ";0.75,0.5;craftguide_craft_max;" .. F(S("All")) .. "]" + n = n + 4 end + if has_give then - fs[#fs + 1] = "label[0," .. (formspecy + 2.1) .. ";" .. F(S("Give me:")) .. "]" - .. "button[0, " .. (formspecy + 2.7) .. ";0.6,0.5;craftguide_giveme_1;1]" - .. "button[0.6," .. (formspecy + 2.7) .. ";0.7,0.5;craftguide_giveme_10;10]" - .. "button[1.3," .. (formspecy + 2.7) .. ";0.8,0.5;craftguide_giveme_99;99]" + formspec[n] = giveme_form + n = n + 1 end if alternates and alternates > 1 then - fs[#fs + 1] = "label[5.5," .. (formspecy + 1.6) .. ";" - .. F(S(recipe_text[dir], alternate, alternates)) .. "]" - .. "image_button[5.5," .. (formspecy + 2) .. ";1,1;ui_left_icon.png;alternate_prev;]" - .. "image_button[6.5," .. (formspecy + 2) .. ";1,1;ui_right_icon.png;alternate;]" - .. "tooltip[alternate_prev;" .. F(prev_alt_text[dir]) .. "]" - .. "tooltip[alternate;" .. F(next_alt_text[dir]) .. "]" + formspec[n] = string.format("label[%f,%f;%s]", + craftguidex+4, craftguidey + 2.3, F(S(recipe_text[dir], alternate, alternates))) + formspec[n+1] = string.format("image_button[%f,%f;1.1,1.1;ui_left_icon.png;alternate_prev;]", + craftguidearrowx+0.2, craftguidey + 2.6) + formspec[n+2] = string.format("image_button[%f,%f;1.1,1.1;ui_right_icon.png;alternate;]", + craftguidearrowx+1.35, craftguidey + 2.6) + formspec[n+3] = "tooltip[alternate_prev;" .. F(prev_alt_text[dir]) .. "]" + formspec[n+4] = "tooltip[alternate;" .. F(next_alt_text[dir]) .. "]" end - return { formspec = table.concat(fs) } + + return { formspec = table.concat(formspec) } end, }) @@ -418,7 +453,7 @@ local function craftguide_giveme(player, formname, fields) local player_name = player:get_player_name() local player_privs = minetest.get_player_privs(player_name) if not player_privs.give and - not unified_inventory.is_creative(player_name) then + not ui.is_creative(player_name) then minetest.log("action", "[unified_inventory] Denied give action to player " .. player_name) return @@ -433,7 +468,7 @@ local function craftguide_giveme(player, formname, fields) amount = tonumber(amount) or 0 if amount == 0 then return end - local output = unified_inventory.current_item[player_name] + local output = ui.current_item[player_name] if (not output) or (output == "") then return end local player_inv = player:get_inventory() @@ -454,21 +489,29 @@ local function craftguide_craft(player, formname, fields) local player_name = player:get_player_name() - local output = unified_inventory.current_item[player_name] or "" + local output = ui.current_item[player_name] or "" if output == "" then return end - local crafts = unified_inventory.crafts_for[ - unified_inventory.current_craft_direction[player_name]][output] or {} + local crafts = ui.crafts_for[ + ui.current_craft_direction[player_name]][output] or {} if #crafts == 0 then return end - local alternate = unified_inventory.alternate[player_name] + local alternate = ui.alternate[player_name] local craft = crafts[alternate] + if not craft.width then + if not craft.output then + minetest.log("warning", "[unified_inventory] Craft has no output.") + else + minetest.log("warning", ("[unified_inventory] Craft for '%s' has no width."):format(craft.output)) + end + return + end if craft.width > 3 then return end - unified_inventory.craftguide_match_craft(player, "main", "craft", craft, amount) + ui.craftguide_match_craft(player, "main", "craft", craft, amount) - unified_inventory.set_inventory_formspec(player, "craft") + ui.set_inventory_formspec(player, "craft") end minetest.register_on_player_receive_fields(function(player, formname, fields) diff --git a/unified_inventory/settingtypes.txt b/unified_inventory/settingtypes.txt index 910989f..27768ac 100644 --- a/unified_inventory/settingtypes.txt +++ b/unified_inventory/settingtypes.txt @@ -9,3 +9,6 @@ unified_inventory_bags (Enable bags) bool true #If enabled, the trash slot can be used by those without both creative #and the give privilege. unified_inventory_trash (Enable trash) bool true + + +unified_inventory_automatic_categorization (Items automatically added to categories) bool true \ No newline at end of file diff --git a/unified_inventory/textures/ui_bags_header.png b/unified_inventory/textures/ui_bags_header.png deleted file mode 100644 index f9bf1dd8fc6f88bb368143f28bace184e5125001..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1241 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 O5abzWn@TIc+y4QNH<3{Q diff --git a/unified_inventory/textures/ui_bags_inv_medium.png b/unified_inventory/textures/ui_bags_inv_medium.png deleted file mode 100644 index 5924f54661010db89ab6dba906da683e608da064..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2300 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 NSeP(uXnXJx+J8?}Q>Op` diff --git a/unified_inventory/textures/ui_bags_trash.png b/unified_inventory/textures/ui_bags_trash.png deleted file mode 100644 index 824713092ff04d8eae8d59dc1e90c489d472c28d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1157 zcmV;01bX|4P) zohN_;NKvF5BD3~WM8cFcr{O>Ag>Uw{L<#H2%yS_xl+i4vvyBvqbk=N2Bkcdt)(gC0& zB__qz7P`iuJ6Y2m09s-uOi3zFNCb$@0~X1hF(V-*t)*BpBY+MPt=cDdMvOzCYdUnq zK;A*3Rr};7I5bfW#FCL>$vQ~1YNOVeGbUsN$hipSIAU@V0`i)8ny6c~QES4Kzp+Tv z-1#vjVTMH#V2N9)TeVTEB`wz<#B(WL?r)-Q)kdv3pvVaTi+iKLiMmxAwfgU}{_0k3 z)atK#e|4`N!D8*nRuRn02wDuL+cjuOn85|L`dV6k3fNk)>QKem1y%Z|I3@Pn8`k>o z07*!KB_VBel=`>G2WUc%JgD{5r-`sQVk`oQ^o*m$k>L=SqUTuqq`VfO#6UR;u}H>5 zgnpwJrq#1!MwqpK;Mx%syj+QOs9)dOr_3EK@R6RdS1BzRDx}2F%Nn7XN<8w9UAcv1*L zkD-S*V3D#JF)7p9D1F@}p)m}+TTsskifZnhdaAw{8x1^$9*x$Z1adNu0c2sCkO2eF zky9fT7l}6BDb@|=3(CI&Y6QkJg6Hp;dH@W(hnJo0#oKdZVe1bI!7@OxCGnHUxqEkN zy8w%K09oz*Ud1I}<(|sC3JVDdG3ZwdfcB}~IG)CoL-x@x3xLU~W3z}7!;mo{A*0hp zz~_kr*|3~;5xs~#_8Fqkh-V9cKga1~P=shSqDM@DX2_TW-r`yTc=B1iq~x54{l5+l z4FPWM>cmy+Rw9WQGGbJm!C$^Udf=9BA77dMKg?l>MxlDzSpo!#kO2mPz`dN_{y1K_ zzkMytqv5wvt2Z0|fC7asLUJC0001!P)t-s0000* zMMVGr08>*_J3T&!mxv>kdCn{N(>!*Rkd8B^d#sl*99lt{e5&(cT|cr1xzf#0R@o`6>Z?+a8u94Fue zvIu{t+rzkQ=P`lQ@K zpz;*``gc$le12BrUtW-#>yvUDfrujxmjc9TJQIjGRDhoEaIg`mMjVegG66!4=K@%F zIN+$~yPe7{1&+D^cu5jCBna$m1p*1pr}t_QqzYg?&BuBzr}@aO1QeMB81cE4K&=+k z6zKvrb^>zqI#vR}yr2?bIm5{91%5H)i7JPHnS<0kzW^!F`0E5d&40&L9m)#HKTRXL z#0fZouPJcz528#pTL?XGHe=U^668e+h)@$~Mi}eiN(%kF`vRWRe3m!Q#IBbLw)=u5 zk=XNT{$<`|#H=6mMfhY_%a=f}*?{J={Pk6h@AWR$V_Q%e^xx=@z)D~?UXI5w&;>A` z3lOLAOn|_Ad6G>npUuXSCB3woE$DYhZv+z{XncfT%V|En+X-xDP%s2&IOcN!(9;Ff zd?K`}G^BV?F-z#zzH~k|3={EA4IBt zhhcmzm#rl8kLw$atM3ho#?!g6WAa(^g>LqTu>;xyhufc1GI zuIG!8<-R|Z2zp)Sod}G#6~G)Wkequy6m$X5wG`le9(6h`_X#*4&naN``PAI=e2`Nh zsn4h7gjDc6N#A>pBE-?+fzeovzy#xP5^WZ~~uB;N~Ah z-%sV+tl6NH=ZM0H8wsHL1B>T{ihGVIWbppKBI52NEQrFMBWktO_;#Ds@)a=dBP;;& z+|LoUh|_p3FrTa@6Bsao>1Z(;!GPtGJr0%vgdEQWs`L3ovZ5EO<;$mQM*d@SLFexW7<{K(O7;fi`Hpo&uIL@(ZAT zONH&$tmRT+y)NoGA|=2t2m?9a%-2ML&k;c&cP-Czzo6Alx}bZG$n6W9KrVs%{)$H_ vJl^lud`jctKELW!D*pX_-Ou50d|Cbin*%0p!3mn+00000NkvXXu0mjf(tSv~ literal 0 HcmV?d00001 diff --git a/unified_inventory/textures/ui_category_none.png b/unified_inventory/textures/ui_category_none.png new file mode 100644 index 0000000000000000000000000000000000000000..8976fb0eb122a801499fd2dbe009c0449fed1a6e GIT binary patch literal 7966 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 UNozg^(*OVf07*qoM6N<$f(*TUkpKVy literal 0 HcmV?d00001 diff --git a/unified_inventory/textures/ui_craftguide_form.png b/unified_inventory/textures/ui_craftguide_form.png deleted file mode 100644 index d9be53f7dd54cad096c80fb9d7a784ba09bb7078..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 962 zcmeAS@N?(olHy`uVBq!ia0y~yU;;834sb97N!N?op$rU+VF5lNu0U=^MuwM{*VL&~ zTUuJ8qM{NL6RoYSKYsjJQBeUDkB^T}N=gFCCL|;@G&ERQS=rj!nwy(jT3P~?LC86C z<^WaN+1UX_GBY#(|Nrmi=Jw~$pTfdI3k!>?sw!7k*S&l9&YU?DD0Sh&h3V6$&jy3{ z@8AFZ`}fP2FFC&Zb+qMBM1zNFg-MYBAxE(uo zT)TEHKR^Hb_wT;GzCfn}-5eSkdh6D$($dnhva+>n*S5B{-nemN(xgd1m)P6ecXoDe z*|KHRrcDbMF5IEakt5%>0vYjH@RK*PmzE^3^O67SyW z<*TgQv3vLL|K@3qj-g?bSy}hkr5FD{5FT58S@tw2lA++hiHsDtuW2dAKHPZa(ZhQ^ zZ++*U6@K^kZnV9$=+}dbtNEP+)z+-v@+Ca)Z`jH|HPc?*w~Vcct`SN-H0@-PrIc~{ zb+gE|{^qyfXNSYQv&$TO!0WITMQhe4QOUahm;sKg-WAUuTYdS2nD=@0K>lLh`>U z%x_@&Mb{OHjw=y@D>rKWqMth^|`6r5!k z7#JMFmmG8WlX`>uKpcY_S>__#V%_+~C9A|Gi^nbN%TakYpy>>M7?>Cv4hjF;KN-aH MboFyt=akR{0KFTassI20 diff --git a/unified_inventory/textures/ui_crafting_arrow.png b/unified_inventory/textures/ui_crafting_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..6901c58888398695f07f51a97b6815b92c7c482e GIT binary patch literal 788 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H0wgodS2{2-Fx~caaSW-r_4dYDZ;?b9_7CsR zXuQ@t|7O?ajGihj8yCSVXT3{GBwyJJbl%&rNZjbeo1<|$hSiEX!m1q?irN1P{}SF) za+S|fV2au_WB>NT;On8~->;l`|9hui@sGOi55MnWaKQ$?*jr~@`!;vx6sB+fWml#g z_3~moZqJrmohG*BhG@c~r(3M=C3fg4G;~ihes?=ddxf_b$@YX$p7wwy!O+_y> zl`Tm)vaDrS{X+Aw1SbDK1!X(hm|iWM(D_rR;~cxhr~0#fU6M`F#}n_}_`RyYF@fJ-mFPvvN_uw6FVuBla0>%gOy2Yg&=#QBN>|8!^VS#^6s zlkDPRhXzrWXfwO*7QeRaTXJmG9zJ;oYpEomde-}9xp{$qmVNy({p##h_nG^Y_>IN* zmG*yRjsGaj>oK*Pzc#q{+6RS20!lqcAH^R~uW4(pefs$O%7=6J-QU)5_+uq6GegPi zO&@<>y^t5aw1tCF!sB3^eC>tpS0CSf-^F?Bd+>>cl6pY5?9SRS>2y(2-rtv7fApR> z)UC6k(zs~wEk4~SE zsn=z1m(QX5V0YZ5ZsDZI%%`ggi|)0=c)xc!&i*XrxVjPs(0Z=#c479d8~ZI*15-PL Mr>mdKI;Vst09D^+`v3p{ literal 0 HcmV?d00001 diff --git a/unified_inventory/textures/ui_crafting_form.png b/unified_inventory/textures/ui_crafting_form.png deleted file mode 100644 index 904328799f0095583663358921550fe04a99fb02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2343 zcma)8c|4Ts9)D?$Gs!Yz%dup7W$AD%sgRv9hA`Br6lIyIAraY^XeLQUldWcuu_SJX zvd(ZRLndp7QehCHLy}R^plP@>y61Cm=bn4+eg1eqzvuV3VB zTgDZwqRH;}TB?T3J91Xb&yM=p^5mcK+aZ_|V`=u4u?*URM)Oh*d`=?O#&BOjesjnp z5IbC%%Q0q{2NkGBp5?q54U*iXp1luiy@U11B*m+jX0d4adx_=N-i7G!t&*Y{0cZeg z6wG@4^VHIQW05-VJulCmi8+%vlmFddtu-z-^Mma7Yn@}u*HBLqUW6w;4APRNompkr zgU{pw`in;9-#xf4;?MMJOq6NW(u)(TxufM1t%Pe>qeuetN1T^2ptkODK>gu!qmUgT zlqg`hlFBJS`T)r0oeJuLSuO{oc?tDPA^(@zwWM_{m}-rLr)Z19?GeRLq#Pjygt
ZEv7VNgIIfqiM#UpE34`10a@rQScZjR5> zXw+Z-qBUw`P6wG^j7e#5!?byX=-ySn>(E9 z3Jx4ewT=u`Q}31ya5r%19bb`lxv^@Q7$STvt8w0O?3q1lFYXPe%qJ*YO)Mw?ortl? zxr+9__1B4%bNW^Yv-jspdgTZes9>J`jvCeS^|r*BQp1`&wSKeU1w+zOBwGBywh7vP z?yg!#IJ$M0PF^JS=xr#gI;n?xJk@$Sa>(*jPJ$wdpIeF8{LSXK7?k!6p@fjjf}+t> z%WEAXLpT?nd_O;{NqGfqH7MOV+1cgjXeV}ot5eF;g1?jMa@b~2+LiUJ#F6ynSRh1r zrU`vPZLon+Hk=Gab}NWDxKi|XuBOyS-rMBQJl!}x^l{W_sx7kIrLYhoT;XYwL+IIYLn^oY0~$>1{=4hq$+jU2id2avdWTuHF|fH>@HSg%X`k9i1u$u;_BSy zT{Zg<+sh9ampWFJ;-0&s)RFN@FG7#Q49?gr#IN#*dqX|HCC%-vTf38oO2noSe{bAu@14#l$Cxws=`QH z?9rR}$j=YuNofI0lw9jGF57o`n%w(xz(AY#Q?*D2Y;X#3&NPnuxZ`WVRM@L8WQVAy z2v|-s#9;3f%Gq^~D>GcynzyGIx@}}U2H*Ng7nVcAePI!-YL@x8-~s|WHq7H5X8knI zK;v>jmwn+)`48%M0rP{&;0o(xpY`5P5DCmhiNW<6kwX5k8|2dMEj~zUtQZ->`6y-0 zqZdIXE_50{@`G%|V8)Mvqssgv9siW0|9|o^@K0KQv&0~6)`;;m;k-66DQR{wTIGVv zK%MuN)Ix&3j083pB;UN5y&DJkGxy51a?;~pi(qrjO5;p82}B}VJEGlpcMg^iBNJU8QIRMqEape*v^(?vVH0nHJaYGR$I5D;}P7wslhf zoN>IG&bf41%-NsmDkpNE7M3_%e^Ei#FI)3UKxRa|78XjYsNE`VVgrOq(Dk7zAygq*Mk3U1?s62 z)%^S@1+PBQj9JHajLM37+_;sJ4ewA^(uk|3Is0P}30bIKy6? z-HLy?cxQPEYTE^mRtldr#Gq6@zMYI{7dFr|p{scJ@M1V2CKXH2;kx(RrH%$RM^A_e zY+K$Q_$w(B$W62le5Gyhf)6_82QWG6R0|9iuFqrGOGw{a>^7;=_J_@U@|QQGw? jlec05o}Jtfv9&D{HJrW~MBtj>2MBPqcSYW_^&$QP6{$O_ diff --git a/unified_inventory/textures/ui_form_bg.png b/unified_inventory/textures/ui_form_bg.png deleted file mode 100644 index 7111fac93eb3b59de8228df357c6dc6d3bee9312..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1003 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 J>7|?h`B$Kb45I)5 diff --git a/unified_inventory/textures/ui_single_slot.png b/unified_inventory/textures/ui_single_slot.png index 63da98d9188248e4fc8fa0f1d0a626af809e2b0f..2451623c93dec16b8c9c7d9a1c156857930ec58a 100644 GIT binary patch literal 648 zcmV;30(bq1P)XloE%A&LJ(4b!`QP^ttn@JHhnEMd z@7tQ{@j2R1Hr+s(_53Lf;!${Yr2Kz8<&Jc@B~2DfE{J8pGal3A`LS)gJiaL1kbrEh i6baU58AfpNFUD^dq1ONa4fwmRy0006!NklyonS3kDT19K7ItE#pdeToISix|Vy9qZ zr4Vcaf{h`C2v(*Mj0d?(+?{8!IbHP5#<`ruye(##f&J~9uVM!9;bS5}zg}*V26?wp0*mdZL{HlB?fbIG9f0r>3ZJtp7*@xJ@0wX zd*1V&_q^vl?|ILA-t+&$lk@ZYVL_vLu`S)8pvoh35H0EPfhJ=9uz*bkY z-)qHtHKKc5=57!nLJadM&MSQ1+KxmHF{W9-UgF<^dD})R3Wp7$MBN#`5vJGWNi}&)*)&>w!`zP{2CA%TWlCB10V-+{feQ>L07& z?m?b2ZDS-Pq|+fN`5Iy<%YAgB+sD2RS&R=4&_#W1v9n#0~Zdy?)PYSh-4*0!DyLKUG<5Cy@Df;avk|A6=-yzoL4RJ;(SqKKj( zg7grRmPTWZN#pK5%t->@@Wzv(uaTKA4NSd7rh`yVk|`3iisNF?cj^(HP3D zn1lgcB4QHa;cu}|-lsu}S!Owbi-RmtK4XUg_t;>AExLq5gdu>B#|-B<&m!{#xTq1l zqm>0x2DDjch3nklA0om%0G|n-V2M{a&omxNiMnuQS^9#VtZQRSO2j7D`GKGLgAQR1 zU}&(wC0^q!6R27Bq&w#|v=O2dafu?c{p4QR7 z^Zr78%J?|w5>7xMkO&|n=6<}~`!W1CqsKKq<0^Lv1wK)3rc&IA}Do z1Rn~(VzFdoMD}+7>&~5&HsA9RzpyQ6a+)`}!l|0R)Lg7L@o_L16bf;~U9g3Gw)>4) z?R|Xz?}R&i!l(Qx@t9?iY19k;Q?-CPK0ZD!4ho4lQcENXU9`cW#<|+-K8k4;nMX+) z%rcL6Qk|&>!pFtML6`anfJ7B-sEL>AOA3#9TKE!|69lLQH@BXHDaC$=-v^1rFl}CT zQ3M2d5{-*%#A9BqkXMYe1QLe}-i*MZftDB?R8vf7gGQsqvikkkQlOaA3j&2kNkD=p zJ(2rfj&=PO5NMiWGJhTlJt2!1YrOJ9Lz;aDEk{pB91FmH9r@t9HSQ7za2|1002M$5 zPyti`6+i`00aO4LKm||%Q~(vgu>*+z0}zjL2aanzAs#j#P$=>l&UocjG5#C{umXK7 zJ0Oc;rQTht1Tu&-YsE2azeb^PaBP_643d}~(rp_h<2GSF7&JK4iIP=IN-gTcWg;AXUD*`Z4!8E}s_>GGf-%i=DS?}l97!Nq418Gkt-rA?bi(q)5n zqHF1mUS<`0ElNCj2M-sI8ck;GcfAi&BG%a=ltgT>!Y1j}aIG(QC;O%tT{}l?7q3Vl zYBZSQac=kD4@uc%g>}-A$mUt~&cxZ87BHOZ$`U*w3+H=G(z2`lcROEK|E0FH(?QLmksj8}y5%Zf5 zo&VKa{5Uz`Fa!Iv#d8Ar*w|Hf fE>KaKqQb_IlIdwG-SNT~XbOX;tDnm{r-UW|$5SPz literal 0 HcmV?d00001 diff --git a/unified_inventory/textures/ui_trash_slot_icon.png b/unified_inventory/textures/ui_trash_slot_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..5fc4de1dff740d7db6dec814fa59bab030a0ef1a GIT binary patch literal 697 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 diff --git a/unified_inventory/textures/ui_xyz_on_icon.png b/unified_inventory/textures/ui_xyz_on_icon.png deleted file mode 100644 index 003ea63344be5dbf1f7a2b5da8eb6911e4aeb329..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2182 zcmaKu`9Bkm1I8!i*i}f5ZKO}BIX{lcIoHV9D9W9jIhyO!T5^R*V#<~KEZd7*ZTL=fbaM9dYI!>XEw ztCMvHMkKG;PZ*znC}1cLB4Eo>@xVRciLTcv(<;n!RWltG$_bA<0x~RF7ieNZ=Kfpl zq|4kD1F3~VR=RTa^e%qj>yN6IZKsDdE!$KD!&Arqx8iGr1wte%E*7fC>v5hgyDdF& zIMepR$}?Cp8||xR91h9NIHJdi5BOof!n9 zNr{YjQ913cMtkkT;kcjka&pVNMlwaxhP)1E6x#)-Hcl%hL1@Ax!7+Bf#E6VB-LY43 zLK#YukOBwmpojFXGFk*h#On0|d07SVJWvzTGi5)MZO!X^IOlBBZ&tLQsW{HsD=m;H z3nu9*t_mKe60XZfBo%69txNRJ2}fy@eGx(ICYAj&0|5pes~~JJZ`NWs zXfGc@WgS{3{qo)L@4;|pkr*B+; zpl__~81Q_Y6M6lKltEtB=6&Dgvlh`JML)7q{0om}8-1=LZw+^>wHM`Yn1hmhi{mqI zkUlEWXx5Q@E#*^fAp8FLsDw;n$^-^Mpk4?7VCCLBS0ioxefJQph}Y8WDxHYKC%DaQ z;S}S{SxnxrX!9e)2O$3D(a}s)^K?Fsnr)dgYAEgs*N+MRAcFhsAtt+nKqn3tX!>A| z1ov$oM*^>J27j`N+!YN9YUgUVDi7_^D2K1$;313Dr4NYEy>ZC!n*?sr4bU`n7X_G# zK{&~O*Kj((kKI=w2WB+EPWcc2#H<)eJ^{NJXi}UR;}%KD1hd!U zrzlkqN2*Y`%i5Uh*xC->5p`nn-txzl!Q3n>dHca*Bh5TYHps&g{ozy;zTt|o>Edl1 zGZb36Bo{vk=IC2nMpmFtP|UePYO|={)YE6oFFjRlt+Ky3`lS|;{=(+14mjMnLPXRb z=%$uxJ8-$2t1#y^7}V6~%B{VevlrJm-VD{LLA%dpIAwU1e_iR|;d?CfdWxB= zbsW0u$iNG4;z#+L&BAYpyDkSmLkQhz!>PXr4Wh^EF6jZqi?k>6M9#OAM$mg?TH!|z zmtluqC?B?WV@!9!nCU3Log)4<+f4e6Xv<*!cX^+(t@wu;i^$T0m~&{ch3VWE>q%i@ z1|2ucYMEm`;RBBJz*}ENv~w%L)W*&Tt-A_Vmb=pl`O3pB)+I4u19?_`g6$m=UUoOV zJ4iCLa6=0jw*LJ2E|pO;mt)v>qz=b(0&q-;>~<%wlal}}*J=NwXP!y~Ka7dufwZCc zol_l@ld4hwn4up9~Ohll2w^?KZn@|4IqM>?o2sYWdzV=I#HaV4u@Z%+cb-$ls zJ)&m>qI_b9TkysleiNE|}Mrvu3O^xpPCH&hbs5@O@OD1J2IZc;z z;MeFgh5WE#L^LQRpJxS@BKg;*Nw~$Ij%|EYr!}tbnB~J73wyNN;N&?QgghL{OL2?S zhrvSmF>G}ayjIFgH+X8geB)a`}fF^>uc>{K*ChO1tmvbO|6}R z=ezexO#6VrJKM+E49hPQJ7>FqzH(^hYZ`_~!CVW9*%J`$*eCXwJFz5zxb3$#)ykbT z8x$eyO*@5UW=Xu=kbUHN!4sfUzG_eqvaXeQ%fZknc{kp6`(02^9}=Vt8$F-7VM|5< z7(1@))*4XvhUK9jV?b^@>u>ToJDB%?ucy?n2yfYnknr z@#~Cu(b|LlVuc*tWFK}5W] = { + edit = , + hud = , + }, + [] = { ... }, + ... + } +]] local waypoints_temp = {} -unified_inventory.register_page("waypoints", { +--[[ +Datastorage format (per-player): + { + selected = , + [] = { + name = + world_pos = , + color = <"hud_colors" index>, + active = , + display_pos = , + }, + [] = { ... }, + ... + } +Player metadata format: + { + selected = , + -- Cannot mix integer/string keys in JSON + data = { + [] = { same as above }, + ... + } + } +]] + +local function set_waypoint_data(player, waypoints) + local meta = player:get_meta() + if not next(waypoints.data or {}) then + -- Empty data. Do not save anything, or delete + meta:set_string("ui_waypoints", "") + else + meta:set_string("ui_waypoints", minetest.write_json(waypoints)) + end +end + +local function migrate_datastorage(player, waypoints) + -- Copy values from old table + local new_data = { + selected = waypoints.selected, + data = {} + } + for i = 1, COUNT do + new_data.data[i] = waypoints[i] + end + + set_waypoint_data(player, new_data) + + -- Delete values, but keep one entry so that it's saved by datastorage + for k, _ in pairs(waypoints) do + waypoints[k] = nil + end + waypoints[1] = 1 +end + +local have_datastorage = minetest.get_modpath("datastorage") ~= nil +local function get_waypoint_data(player) + local player_name = player:get_player_name() + + -- Migration step + if have_datastorage then + local waypoints = datastorage.get(player_name, "waypoints") + if waypoints.selected then + migrate_datastorage(player, waypoints) + minetest.log("action", "[unified_inventory] " .. + "Migrated waypoints of player: " .. player_name) + end + end + + -- Get directly from metadata + local waypoints = player:get_meta():get("ui_waypoints") + waypoints = waypoints and minetest.parse_json(waypoints) or {} + waypoints.data = waypoints.data or {} + + return waypoints +end + +ui.register_page("waypoints", { get_formspec = function(player) local player_name = player:get_player_name() + local wp_info_x = ui.style_full.form_header_x + 1.25 + local wp_info_y = ui.style_full.form_header_y + 0.5 + local wp_bottom_row = ui.style_full.std_inv_y - 1 + local wp_buttons_rj = ui.style_full.std_inv_x + 10.1 - ui.style_full.btn_spc + local wp_edit_w = ui.style_full.btn_spc * 4 - 0.1 - -- build a "fake" temp entry if the server took too long - -- during sign-on and returned an empty entry - if not waypoints_temp[player_name] then waypoints_temp[player_name] = {hud = 1} end + local waypoints = get_waypoint_data(player) + local sel = waypoints.selected or 1 - local waypoints = datastorage.get(player_name, "waypoints") - local formspec = string.gsub(unified_inventory.standard_inv_bg, "YYY", "4.4") .. - "image[0,0;1,1;ui_waypoints_icon.png]" .. - "label[1,0;" .. F(S("Waypoints")) .. "]" + local formspec = { + ui.style_full.standard_inv_bg, + string.format("label[%f,%f;%s]", + ui.style_full.form_header_x, ui.style_full.form_header_y, F(S("Waypoints"))), + "image["..wp_info_x..","..wp_info_y..";1,1;ui_waypoints_icon.png]" + } + local n=4 -- Tabs buttons: - for i = 1, 5, 1 do - formspec = formspec .. - "image_button[0.0," .. 0.2 + i * 0.7 .. ";.8,.8;" .. - (i == waypoints.selected and "ui_blue_icon_background.png^" or "") .. - "ui_" .. i .. "_icon.png;" .. - "select_waypoint" .. i .. ";]" .. - "tooltip[select_waypoint" .. i .. ";" - .. S("Select Waypoint #@1", i).."]" + for i = 1, COUNT do + local sw="select_waypoint"..i + formspec[n] = string.format("image_button[%f,%f;%f,%f;%sui_%i_icon.png;%s;]", + ui.style_full.main_button_x, wp_bottom_row - (5-i) * ui.style_full.btn_spc, + ui.style_full.btn_size, ui.style_full.btn_size, + (i == sel) and "ui_blue_icon_background.png^" or "", + i, sw) + formspec[n+1] = "tooltip["..sw..";"..S("Select Waypoint #@1", i).."]" + n = n + 2 end - local i = waypoints.selected or 1 - local waypoint = waypoints[i] or {} - local temp = waypoints_temp[player_name][i] or {} - local default_name = S("Waypoint @1", i) + local waypoint = waypoints.data[sel] or {} + local temp = waypoints_temp[player_name][sel] or {} + local default_name = S("Waypoint @1", sel) -- Main buttons: - formspec = formspec .. - "image_button[4.5,3.7;.8,.8;".. - "ui_waypoint_set_icon.png;".. - "set_waypoint"..i..";]".. - "tooltip[set_waypoint" .. i .. ";" - .. F(S("Set waypoint to current location")).."]" + local btnlist = { + set_waypoint = { + "ui_waypoint_set_icon.png", + S("Set waypoint to current location") + }, + toggle_waypoint = { + waypoint.active and "ui_on_icon.png" or "ui_off_icon.png", + waypoint.active and S("Hide waypoint") or S("Show waypoint") + }, + toggle_display_pos = { + waypoint.display_pos and "ui_green_icon_background.png^ui_xyz_icon.png" or "ui_red_icon_background.png^ui_xyz_icon.png^(ui_no.png^[transformR90)", + waypoint.display_pos and S("Hide coordinates") or S("Show coordinates") + }, + toggle_color = { + "ui_circular_arrows_icon.png", + S("Change color of waypoint display") + }, + rename_waypoint = { + "ui_pencil_icon.png", + S("Edit waypoint name") + } + } - formspec = formspec .. - "image_button[5.2,3.7;.8,.8;".. - (waypoint.active and "ui_on_icon.png" or "ui_off_icon.png")..";".. - "toggle_waypoint"..i..";]".. - "tooltip[toggle_waypoint" .. i .. ";" - .. F(S("Make waypoint @1", - waypoint.active and S("invisible") or S("visible"))).."]" - - formspec = formspec .. - "image_button[5.9,3.7;.8,.8;".. - (waypoint.display_pos and "ui_green_icon_background.png" or "ui_red_icon_background.png").."^ui_xyz_icon.png;".. - "toggle_display_pos" .. i .. ";]".. - "tooltip[toggle_display_pos" .. i .. ";" - .. F(S("@1 display of waypoint coordinates", - waypoint.display_pos and S("Disable") or S("Enable"))) .."]" - - formspec = formspec .. - "image_button[6.6,3.7;.8,.8;".. - "ui_circular_arrows_icon.png;".. - "toggle_color"..i..";]".. - "tooltip[toggle_color" .. i .. ";" - .. F(S("Change color of waypoint display")).."]" - - formspec = formspec .. - "image_button[7.3,3.7;.8,.8;".. - "ui_pencil_icon.png;".. - "rename_waypoint"..i..";]".. - "tooltip[rename_waypoint" .. i .. ";" - .. F(S("Edit waypoint name")).."]" + local x = 4 + for name, def in pairs(btnlist) do + formspec[n] = string.format("image_button[%f,%f;%f,%f;%s;%s%i;]", + wp_buttons_rj - ui.style_full.btn_spc * x, wp_bottom_row, + ui.style_full.btn_size, ui.style_full.btn_size, + def[1], name, sel) + formspec[n+1] = "tooltip["..name..sel..";"..F(def[2]).."]" + x = x - 1 + n = n + 2 + end -- Waypoint's info: - if waypoint.active then - formspec = formspec .. "label[1,0.8;"..F(S("Waypoint active")).."]" - else - formspec = formspec .. "label[1,0.8;"..F(S("Waypoint inactive")).."]" - end + formspec[n] = ("label[%f,%f;%s]"):format( + wp_info_x, wp_info_y + 1.1, + F(waypoint.active and S("Waypoint active") or S("Waypoint inactive")) + ) + n = n + 1 if temp.edit then - formspec = formspec .. - "field[1.3,3.2;6,.8;rename_box" .. i .. ";;" - ..(waypoint.name or default_name).."]" .. - "image_button[7.3,2.9;.8,.8;".. - "ui_ok_icon.png;".. - "confirm_rename"..i.. ";]".. - "tooltip[confirm_rename" .. i .. ";" - .. F(S("Finish editing")).."]" + formspec[n] = string.format("field[%f,%f;%f,%f;rename_box%i;;%s]", + wp_buttons_rj - wp_edit_w - 0.1, wp_bottom_row - ui.style_full.btn_spc, + wp_edit_w, ui.style_full.btn_size, sel, (waypoint.name or default_name)) + formspec[n+1] = string.format("image_button[%f,%f;%f,%f;ui_ok_icon.png;confirm_rename%i;]", + wp_buttons_rj, wp_bottom_row - ui.style_full.btn_spc, + ui.style_full.btn_size, ui.style_full.btn_size, sel) + formspec[n+2] = "tooltip[confirm_rename"..sel..";"..F(S("Finish editing")).."]" + n = n + 3 end - formspec = formspec .. "label[1,1.3;"..F(S("World position"))..": " .. - minetest.pos_to_string(waypoint.world_pos or vector.new()) .. "]" .. - "label[1,1.8;"..F(S("Name"))..": ".. (waypoint.name or default_name) .. "]" .. - "label[1,2.3;"..F(S("HUD text color"))..": " .. - hud_colors[waypoint.color or 1][3] .. "]" + formspec[n] = string.format("label[%f,%f;%s: %s]", + wp_info_x, wp_info_y+1.6, F(S("World position")), + minetest.pos_to_string(waypoint.world_pos or vector.new())) + formspec[n+1] = string.format("label[%f,%f;%s: %s]", + wp_info_x, wp_info_y+2.10, F(S("Name")), (waypoint.name or default_name)) + formspec[n+2] = string.format("label[%f,%f;%s: %s]", + wp_info_x, wp_info_y+2.60, F(S("HUD text color")), hud_colors[waypoint.color or 1][3]) - return {formspec=formspec} + return {formspec=table.concat(formspec)} end, }) -unified_inventory.register_button("waypoints", { +ui.register_button("waypoints", { type = "image", image = "ui_waypoints_icon.png", tooltip = S("Waypoints"), @@ -117,10 +211,12 @@ unified_inventory.register_button("waypoints", { }) local function update_hud(player, waypoints, temp, i) - local waypoint = waypoints[i] + local waypoint = waypoints.data[i] if not waypoint then return end + temp[i] = temp[i] or {} temp = temp[i] + local pos = waypoint.world_pos or vector.new() local name if waypoint.display_pos then @@ -129,10 +225,13 @@ local function update_hud(player, waypoints, temp, i) name = name..", "..waypoint.name end else - name = waypoint.name or "Waypoint "..i + name = waypoint.name or S("Waypoint @1", i) end + + -- Perform HUD updates if temp.hud then player:hud_remove(temp.hud) + temp.hud = nil end if waypoint.active then temp.hud = player:hud_add({ @@ -142,8 +241,6 @@ local function update_hud(player, waypoints, temp, i) text = "m", world_pos = pos }) - else - temp.hud = nil end end @@ -155,9 +252,11 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) local need_update_hud = false local hit = false - local waypoints = datastorage.get(player_name, "waypoints") + local waypoints = get_waypoint_data(player) local temp = waypoints_temp[player_name] - for i = 1, 5, 1 do + for i = 1, COUNT do + local waypoint = waypoints.data[i] or {} + if fields["select_waypoint"..i] then hit = true waypoints.selected = i @@ -166,20 +265,15 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) if fields["toggle_waypoint"..i] then hit = true - waypoints[i] = waypoints[i] or {} - waypoints[i].active = not (waypoints[i].active) + waypoint.active = not (waypoint.active) need_update_hud = true update_formspec = true end if fields["set_waypoint"..i] then hit = true - local pos = player:get_pos() - pos.x = math.floor(pos.x) - pos.y = math.floor(pos.y) - pos.z = math.floor(pos.z) - waypoints[i] = waypoints[i] or {} - waypoints[i].world_pos = pos + local pos = vector.round(player:get_pos()) + waypoint.world_pos = pos need_update_hud = true update_formspec = true end @@ -193,51 +287,58 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) if fields["toggle_display_pos"..i] then hit = true - waypoints[i] = waypoints[i] or {} - waypoints[i].display_pos = not waypoints[i].display_pos + waypoint.display_pos = not waypoint.display_pos need_update_hud = true update_formspec = true end if fields["toggle_color"..i] then hit = true - waypoints[i] = waypoints[i] or {} - local color = waypoints[i].color or 1 + local color = waypoint.color or 0 color = color + 1 - if color > hud_colors_max then + if color > #hud_colors then color = 1 end - waypoints[i].color = color + waypoint.color = color need_update_hud = true update_formspec = true end if fields["confirm_rename"..i] then hit = true - waypoints[i] = waypoints[i] or {} + temp[i] = temp[i] or {} temp[i].edit = false - waypoints[i].name = fields["rename_box"..i] + waypoint.name = fields["rename_box"..i] need_update_hud = true update_formspec = true end + + if hit then + -- Save first + waypoints.data[i] = waypoint + set_waypoint_data(player, waypoints) + end + -- Update after if need_update_hud then update_hud(player, waypoints, temp, i) end if update_formspec then - unified_inventory.set_inventory_formspec(player, "waypoints") + ui.set_inventory_formspec(player, "waypoints") end + if hit then return end end end) - -minetest.register_on_joinplayer(function(player) +-- waypoints_temp must be initialized before the general unified_inventory +-- joinplayer callback is run for updating the inventory +table.insert(minetest.registered_on_joinplayers, 1, function(player) local player_name = player:get_player_name() - local waypoints = datastorage.get(player_name, "waypoints") - local temp = {} - waypoints_temp[player_name] = temp - for i = 1, 5 do - update_hud(player, waypoints, temp, i) + local waypoints = get_waypoint_data(player) + + waypoints_temp[player_name] = {} + for i = 1, COUNT do + update_hud(player, waypoints, waypoints_temp[player_name], i) end end)